2011-08-13 29 views
0

我正在开发一个自动化工具,它将一系列命令复制到远程系统上的文件中,然后ssh到远程系统并执行该文件。我正在查看paramiko的文档,它具有所需的sftp和ssh命令功能。没有文件的类文件操作?

但是,我注意到paramiko.SFTPClient.put()方法将本地和远程路径的名称作为参数。我希望能够不必先在本地写文件,并找到一种方法让SFTPClient.put接收类文件对象而不是指向实际文件。

有没有办法通过转交SFTPClient.put()的对象引用,而不是文件路径要做到这一点蟒之内,或者通过如果SFTPClient.put()不能处理任何事情,这不是一个实际的文件命名管道?

+0

或者,也许一个更好的主意是使用paramiko.SSHClient.exec_command('回声$ list_of_commands>的/ tmp /远程文件&& SH/tmp/remotefile')?如果$ list_of_commands包含EOL字符,这会破坏吗? – caw

回答

3

只需open的文件,并写入到它:

from __future__ import with_statement  
import contextlib 

with contextlib.closing(sftpClient.open('file.name', 'w')) as f: 
    f.write('myData') 
+0

你应该真的在那里使用'with'表达式。 – Voo

+0

@Voo添加'与'。它在技术上更好,但是'contextlib.closing'对于file * * like *对象来说很丑陋。 – phihag

+0

当然,这不是完美的,但仍然比你最后的{}方法更好,否则你会需要。 – Voo

0

我相信你在找什么是StringIO

+0

不,不是。 'StringIO'创建一个类似文件的对象,你也不能把它放到'put'中。 – phihag

+0

呃我明白了。不过,phihag的解决方案似乎很简单。 – keks

0

我不熟悉的paramiko,但你可以使用临时文件模块创建临时文件。

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 

编辑:所以它使用的临时文件模块的未过时,更安全的功能修正码。

+0

'mktemp'不安全,因此不推荐使用。 [documentation](http://docs.python.org/library/tempfile.html#tempfile.mktemp)主要由使用它的原因*不*使用*组成。 – phihag

+1

感谢您的信息。我真的从来没有见过。我纠正了代码片段。 –

+0

'mkstemp()'不返回路径。请再次阅读文档。 –

0

您可以使用Fabric:http://docs.fabfile.org/ 不是自己实现它,而是使用一堆有用的API调用来在远程计算机上执行命令。

如果您确实倾向于用手工做,那么请使用NamedTemporaryFile。 SFTP是文件协议,所以事先准备好文件并发送它是有意义的。

如果你真的不想要准备文件,使用这样:SFTPClient#open