我需要使用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错误,或者根本没有生成的字符串出现在文件中。请注意,该文件有多行。
答案 0 :(得分:6)
你也可以使用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()
答案 1 :(得分:0)
cat
正在阅读stdin
。请改用echo
。
'echo ' + localstring + ' > newfile.txt'
如果需要回显多行,请使用-e
标志:
echo -e "Line1\nLine2\n" > file.txt
答案 2 :(得分:0)
作为@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()
会在写入后另外验证文件的大小,并确保文件已正确关闭。
{{1}}
[编辑]不要使用StringIO,因为它会报告字符数作为长度,而paramiko使用stat来报告远程系统上文件的字节数。如果它们不匹配,则传输失败。