使用python子进程和ssh读取远程文件?
Posted
技术标签:
【中文标题】使用python子进程和ssh读取远程文件?【英文标题】:Read remote file using python subprocess and ssh? 【发布时间】:2011-10-31 10:25:02 【问题描述】:如何使用子进程和 ssh 从大型远程文件中读取数据?
【问题讨论】:
您想通过 SSH 在远程服务器上运行需要访问文件的程序吗?您想使用 SCP 将文件复制到您的计算机吗?您希望 Python 能够直接读取或写入文件吗?您需要提供更多详细信息,说明您正在尝试做什么,以便任何人都能回答这个问题。 在我的程序中,我想列出远程服务器上特定目录下的文件。然后用户选择对这些文件之一进行操作。这些文件很大,所以我希望能够即时读取(以避免内存问题),即逐行读取。如果线路满足条件;对该行执行某些操作,直到到达文件末尾。 【参考方案1】:为了提高性能,这在文件很大时很重要,有 rsync。有关确切改进的更多信息,请参阅以下帖子和 Rafa 的回答: 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
【讨论】:
【参考方案2】:import subprocess
ssh = subprocess.Popen(['ssh', 'user@host', 'cat', 'path/to/file'],
stdout=subprocess.PIPE)
for line in ssh.stdout:
line # do stuff
【讨论】:
Ross,我有你建议的完全相同的命令,但它只读取第一行而不读取其他行。如何让它读取文件中的所有行?跨度> 我应该说,通过使用上面的内容,文件内容是逐字符读取的。我怎样才能完整地读取整行? "split('\n')" 似乎不起作用.. 在ssh.stdout
之后删除.readline()
,你想循环输出而不是第一行。
@JordanTrudgett 嗯,我说的时候提交了编辑,但我找不到任何关于它被拒绝的信息。再次提交。
@RossPatterson 这会影响服务器带宽吗?【参考方案3】:
使用iter
和readline
读取每一行:
for i in iter(f.stdout.readline,"")
【讨论】:
【参考方案4】:上面的答案会起作用,但您必须设置您的 ssh 登录以在 your boxes 之间不使用密码。还有其他方法可以使用 Python 在计算机之间传输文件。一种无需身份验证的简单方法是设置 apache 服务器并使用http request。
【讨论】:
以上是关于使用python子进程和ssh读取远程文件?的主要内容,如果未能解决你的问题,请参考以下文章
尝试在python子进程中运行rsync时出现意外的远程arg错误