我正在开发一种自动化工具,它将一系列命令复制到远程系统上的文件中,然后ssh到远程系统并执行该文件。我正在查看paramiko的文档,它具有我需要的sftp和ssh命令功能。
但是,我注意到paramiko.SFTPClient.put()方法将本地和远程路径的名称作为参数。我希望能够不必首先在本地写入文件,并找到一种方法让SFTPClient.put接受类似文件的对象而不是指向实际文件。
有没有办法在python中通过将SFTPClient.put()作为对象引用而不是文件路径,或者如果SFTPClient.put()无法处理任何不是实际文件的命名管道来执行此操作?
答案 0 :(得分:3)
只需open该文件并写入:
from __future__ import with_statement
import contextlib
with contextlib.closing(sftpClient.open('file.name', 'w')) as f:
f.write('myData')
答案 1 :(得分:0)
我相信你要找的是StringIO。
答案 2 :(得分:0)
我不熟悉paramiko,但您可以使用tempfile-module创建临时文件。
from tempfile import mkstemp
from os import remove, fdopen
from os.path import exists
file, path = mkstemp()
file = fdopen(file)
# do stuff with paramiko
file.close()
if exists(path):
remove(path) # delete the file
编辑:更正了代码,因此它使用了tempfile-module的not-deprecated和safer函数。
答案 3 :(得分:0)
您可以使用Fabric:http://docs.fabfile.org/而不是自己实现它 Fabric有许多有用的API调用来在远程机器上执行命令。
如果您确实倾向于亲手操作,请使用NamedTemporaryFile。 SFTP是文件协议,因此预先准备文件并发送它是有意义的。
如果您确实不想准备文件,请使用:SFTPClient#open