使用python子进程和ssh读取远程文件?

问题描述:

如何使用子进程和ssh从大远程文件读取数据?使用python子进程和ssh读取远程文件?

+0

你要运行用SSH远程服务器上的程序,需要访问文件?你想用SCP将文件复制到你的电脑吗?你希望Python能够直接读取或写入文件吗?您需要提供更多关于您为了回答这个问题而想要做什么的细节。 – agf

+0

在我的程序中,我想列出远程服务器上特定目录下的文件。用户然后选择对这些文件中的一个进行操作。这些文件相当大,所以我希望能够逐行阅读(以避免内存问题)。如果线路符合条件;对该行进行一些操作,直到达到文件结尾。 – sdfasdfasdf

import subprocess 
ssh = subprocess.Popen(['ssh', '[email protected]', 'cat', 'path/to/file'], 
         stdout=subprocess.PIPE) 
for line in ssh.stdout: 
    line # do stuff 
+0

罗斯,我有完全相同的命令,你建议,但只读第一行,不读其他行。如何让它读取文件中的所有行? – user2921139

+0

我应该说,通过使用上面的你,文件内容是逐字符读取的。我怎样才能完整地读取整行? “split('\ n')”似乎不起作用。 – user2921139

+1

在'ssh.stdout'后面删除'.readline()',你想循环输出而不是第一行。 –

答案上面会工作,但你必须设置你的ssh登录your boxes之间不使用密码。还有其他一些使用Python在计算机之间传输文件的方法。一个简单的方法,没有身份验证是设置一个Apache服务器,并使用http request

使用iterreadline读取每个全线:

for i in iter(f.stdout.readline,"") 

对于性能的提高,这是非常重要的文件的时候就大了,有rsync的。有关详细的改进更多信息,请参见下面的帖子,并从拉法答案: How does `scp` differ from `rsync`?

算法然后将下面使用rsync

import subprocess 

subprocess.Popen(["rsync", host-ip+'/path/to/file'],stdout=subprocess.PIPE) 
for line in ssh.stdout: 
    line # do stuff 
+0

这不起作用。 – Sarien