【问题标题】:Creating multiple SSH connections at a time using Paramiko使用 Paramiko 一次创建多个 SSH 连接
【发布时间】:2011-03-29 23:08:11
【问题描述】:

下面的代码通过SSH在一台机器上运行grep并打印结果:

import sys, os, string
import paramiko

cmd = "grep -h 'king' /opt/data/horror_20100810*"

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('10.10.3.10', username='xy', password='xy')
stdin, stdout, stderr = ssh.exec_command(cmd)
stdin.write('xy\n')
stdin.flush()

print stdout.readlines()

我怎样才能一次 grep 五台机器(这样我不会有很大的延迟),而不是将所有这些放在五个变量中并全部打印出来。

【问题讨论】:

    标签: python ssh paramiko


    【解决方案1】:

    在我的情况下,我必须在具有一个 ip 和端口的服务器上执行命令,完成后需要对其他 ip 和不同端口执行 sftp。条件是一个连接应该是活动的,同时由于端口转发而对另一个 ip 执行 sftp。

    两个连接都可以单独工作,但是结合两个 sftp 连接时不起作用。

    【讨论】:

      【解决方案2】:

      只需在for 循环中运行所有内容,并且不要忘记在继续下一次迭代之前关闭标准输入。即在stdin.flush()行之后添加stdin.close()

      【讨论】:

        【解决方案3】:

        您需要将调用放入单独的线程(或进程,但这将是矫枉过正),这反过来又要求代码在一个函数中(无论如何这是一个好主意:不要有大量的代码在模块的顶层)。

        例如:

        import sys, os, string, threading
        import paramiko
        
        cmd = "grep -h 'king' /opt/data/horror_20100810*"
        
        outlock = threading.Lock()
        
        def workon(host):
        
            ssh = paramiko.SSHClient()
            ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
            ssh.connect(host, username='xy', password='xy')
            stdin, stdout, stderr = ssh.exec_command(cmd)
            stdin.write('xy\n')
            stdin.flush()
        
            with outlock:
                print stdout.readlines()
        
        def main():
            hosts = ['10.10.3.10', '10.10.4.12', '10.10.2.15', ] # etc
            threads = []
            for h in hosts:
                t = threading.Thread(target=workon, args=(h,))
                t.start()
                threads.append(t)
            for t in threads:
                t.join()
        
        main()
        

        如果您的主机多于五台,我建议您改用“线程池”架构和工作单元队列。但是,只有五个,坚持“专用线程”模型更简单(特别是因为标准库中没有线程池,所以你需要像threadpool这样的第三方包......或者很多当然是你自己的微妙的自定义代码;-)。

        【讨论】:

        • 我淘汰了 1 台机器,所以我只需要 4 台。我忘了提到所有数据将在脚本后面以不同方式处理,并且我可以理解您的代码(我是 PyN00b)它会打印一次来自所有机器的所有数据,但是我怎样才能只处理来自一台主机的数据呢?所有主机都有不同的通行证,所以我可以把它们都放在 workon() 中吗? Ty 用于快速回放 Alex。问候
        • @konjo,你可以在刚刚获取数据的线程中处理数据——我是printing它,只是因为那是在你的问题中做了。当然,如果您需要对host的不同值进行不同的处理,则处理过程可以包括检查host的值。或者,您可以编写多个函数以在您的线程中用作target=:没有所有线程必须运行相同函数的约束!
        • 好吧,我能够 grep 所有 4 台机器,但现在所有数据都已合并。我如何从每个单独的主机中提取数据,你能举个例子吗,请扩展上面的例子?问候
        • Ty Alex 为此,我认为您误解了我,我确实接受了您的建议和上面的示例,但我是编程新手,所以我需要更多提示。我对不同的 cmd 命令进行了修改,完成了你上面写的所有操作。又是泰。问候
        • @konjo,在 Stack Overflow 上,让提问者“接受”答案意味着点击答案左侧的复选标记图标 - 这给提问者一些声望点,答题者更多。您的“0% 接受”意味着您从未这样做过,这令人费解。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-11-08
        • 1970-01-01
        • 1970-01-01
        • 2016-06-06
        • 1970-01-01
        • 2019-06-04
        • 2021-11-11
        相关资源
        最近更新 更多