使用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】:

使用iterreadline 读取每一行:

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

【讨论】:

【参考方案4】:

上面的答案会起作用,但您必须设置您的 ssh 登录以在 your boxes 之间不使用密码。还有其他方法可以使用 Python 在计算机之间传输文件。一种无需身份验证的简单方法是设置 apache 服务器并使用http request。

【讨论】:

以上是关于使用python子进程和ssh读取远程文件?的主要内容,如果未能解决你的问题,请参考以下文章

尝试在python子进程中运行rsync时出现意外的远程arg错误

使用 Python 子进程的 ssh 多个命令

通过 python 子进程 SSH 后终端挂起

如何从 Python 中的子进程向 SSH 传递命令

使用子进程从 python 执行时,ssh 未被识别为命令?

python:在线程中读取子进程输出