【问题标题】:Read remote file using python subprocess and ssh?使用python子进程和ssh读取远程文件?
【发布时间】:2011-10-31 10:25:02
【问题描述】:

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

【问题讨论】:

  • 您想通过 SSH 在远程服务器上运行需要访问文件的程序吗?您想使用 SCP 将文件复制到您的计算机吗?您希望 Python 能够直接读取或写入文件吗?您需要提供更多详细信息,说明您正在尝试做什么,以便任何人都能回答这个问题。
  • 在我的程序中,我想列出远程服务器上特定目录下的文件。然后用户选择对这些文件之一进行操作。这些文件很大,所以我希望能够即时读取(以避免内存问题),即逐行读取。如果线路满足条件;对该行执行某些操作,直到到达文件末尾。

标签: python ssh subprocess


【解决方案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

      【讨论】:

        猜你喜欢
        • 2018-07-08
        • 1970-01-01
        • 2021-04-12
        • 2015-01-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-24
        相关资源
        最近更新 更多