当前位置: 首页 > 知识库问答 >
问题:

如何使用paramiko与一个ssh会话并行运行

桓瀚
2023-03-14

前面的详细信息
我需要在交换机上使用ssh来ping不同的主机。早些时候,我为每个主机启动了一个线程,但结果很容易超过了最大ssh连接数,所以我根据这个创建了一个交互式shell会话。但当我并行运行时,它在发出第一个命令后就一直挂在那里。我不知道如何修复此问题。
简化代码如下:

import paramiko
import time
from paramiko import SSHClient
from multiprocessing.dummy import Pool

def rping(src, user, passwd, dst):

    def command(des):
        chan.send('ping -s 64 -t 1500 %s\r\n' % des)
        time.sleep(3)
        resp = chan.recv(9999)
        print resp

    ssh = SSHClient()
    ssh.load_system_host_keys()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    ssh.connect(src, 22, user, passwd, timeout=3)

    chan = ssh.invoke_shell()

    pool = Pool()
    pool.map(command, dst)
    pool.close()
    pool.join()


if __name__ == '__main__':
    print time.ctime()

    src = '10.130.1.121'
    user = 'user'
    passwd = 'password'
    dst = ['10.130.1.122', '10.130.1.123', 10.130.1.124'']
    rping(src, user, passwd, dst)

    print time.ctime()

共有1个答案

马梓
2023-03-14

请记住,使用multiprocessing.dummy实际上是在使用threading模块。因此,command函数不会返回任何内容。

def rping(src, user, passwd, dst):
    def command(des):
        chan = ssh.invoke_shell()  # new channel 
        chan.send('ping -t 64 -s 1500 -c 3 %s\r\n' % des)
        time.sleep(3)
        resp = chan.recv(9999)
        chan.close()  # close channel
        return resp

    ssh = SSHClient()
    ssh.load_system_host_keys()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    ssh.connect(src, 22, user, passwd, timeout=3)

    pool = Pool(len(dst))
    result = pool.map(command, dst)
    pool.close()
    pool.join()
    ssh.close()  # close SSH client
    return result
 类似资料:
  • 问题内容: 我正在重写我在Python中编写的Bash脚本。该脚本的关键是 我在使用paramiko进行嵌套身份验证时遇到问题。我找不到适合我具体情况的任何示例,但是我能够在远程主机上找到带有 sudo的 示例。 第一种方法写入标准输入 第二个创建通道并使用类似于套接字的 send 和 recv 。 我能够使 stdin.write 与 sudo一起使用 ,但在远程主机上的 ssh 上却不起作用。

  • 我打算使用paramiko在远程主机上运行几个命令,但ssh会话在运行一个命令后关闭。 下面列出的代码: 那么有什么方法可以阻止ssh会话关闭吗?或者帕拉米科的替代品? 有什么方法可以让paramiko ssh会话一直处于活动状态吗? paramiko调试模式信息返回如下: 启动线程(客户端模式):0x2657E10L 已连接(版本1.99,客户端组件-5.20) kex ALGOS:[u'dif

  • 我正在编写一个python脚本,该脚本发送到网络中的每台交换机,并发出一个copy running-config TFTP命令,备份交换机的运行配置。我在windows上使用Python2.7中的paramiko库。 脚本本身非常简单,它所做的只是创建一个名为“备份”的目录(如果还不存在的话),以及另一个名为“今天的日期”的目录,然后将该目录用于TFTP。并启动TFTP服务器。然后它只需通过SSH

  • 问题内容: 我尝试过的 然后 再发送密码导致没有root 然后导致“频道关闭”错误 然后导致不被root 然后写到标准输入并刷新它导致没有root 问题答案: 看看这个例子: 在此处找到具有更多说明的示例:http : //jessenoller.com/2009/02/05/ssh- programming-with-paramiko-completely- different/ 希望能帮助到你

  • 我已经通过SSH(从我的主机)访问了一台远程机器(称之为RM)。我正在通过SSH会话在RM中运行一个docker映像。两者都基于Ubuntu16.04。 我正在这样做,因为出于某种目的我必须重新启动我的主机。 PS:在这个链接中正确的方式从容器中分离而不停止它,它不是通过SSH会话运行docker容器。所以两种情况是不同的。

  • 问题内容: 下面的代码通过SSH在一台计算机上运行grep并打印结果: 我如何一次将5台机器全部置入grep(这样就不会造成重大延迟),而不是将所有这些都放入5个变量中并全部打印出来。 问题答案: 您需要将调用放在单独的线程(或进程中,但这可能会过大),这反过来又要求代码位于函数中(无论如何,这是一个好主意:模块的顶部没有大量代码水平)。 例如: If you had many more than