12

我需要使用 python 的 paramiko 模块将字符串写入远程主机上的文件。我一直在尝试各种重定向输入的方法,但没有成功。

以下代码片段中的 localstring 填充了 cat 命令的结果

stdin, stdout, stderr = hydra.exec_command('cat /file.txt')
localstring = stdout.read()
manipulate(localstring)
hydra.exec_command('cat > newfile.txt\n' + localstring + '\n')

我的脚本似乎挂起或收到 EOF 错误,或者文件中根本没有出现结果字符串。请注意,该文件有多行。

4

3 回答 3

14

您还可以使用 ftp 功能:

import paramiko

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('example.com', username='username', password='password')

ftp = ssh.open_sftp()
file=ftp.file('remote file name', "a", -1)
file.write('Hello World!\n')
file.flush()
ftp.close()
ssh.close()
于 2015-12-05T19:51:32.473 回答
3

作为@Nigel 答案的变体,您可以使用putfo,它(默认情况下)在写入后额外验证文件的大小并确保文件正确关闭。

import paramiko
from io import BytesIO

ssh = paramiko.SSHClient()
ssh.connect(…)

ftp = ssh.open_sftp()
ftp.putfo(BytesIO(localstring.encode()), 'newfile.txt')

ftp.close()
ssh.close()

[编辑] 不要使用 StringIO,因为它报告字符数作为长度,而 paramiko 使用 stat 报告远程系统上文件的字节数。如果它们不匹配,则传输失败。

于 2019-11-22T05:53:29.757 回答
0

cat正在阅读stdin。改为使用echo

'echo ' + localstring + ' > newfile.txt'

如果您需要回显多行,请使用-e标志:

echo -e "Line1\nLine2\n" > file.txt
于 2013-06-04T09:55:06.910 回答