多线程ssh与paramiko

时间:2014-01-03 14:16:50

标签: multithreading ssh paramiko

我是python的新手,我正在尝试使用paramiko完成多线程ssh会话。

def worker:
     ssh = paramiko.SSHClient()
     ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
     ssh.connect(host, username='root', password='password')
     stdin, stdout, stderr = ssh.exec_command(cmd)
     stdin.flush()
-->  pid = stdout.readline()


def main:
   f = open (options.host_file)
   ips = f.read().splitlines()
   for line in ips:
      user,host = line.split("@")
      my_thread = threading.Thread(target=worker ,args=(i,)
      threads.append(my_thread)
      my_thread.setDaemon(True)
      my_thread.start()
      my_thread.join()

      is_running = my_thread.is_alive()
      print "Value of IS RUNNING is: ",is_running,"\r"

我观察到的是,如果我在worker中有pid = stdout.readline(),则线程运行ssh并在开始下一个作业之前等待每个作业,如果我排除了这一行所有线程运行同时(这是我想要的)和ssh退出。

我想建立一个到不同主机的线程ssh会话并监视线程,直到我开始使用ssh的程序完成。由于线程将以最佳方式运行不同的时间,我想重新启动以新参数结束的线程。

同样isAlive总是为我返回False。

非常感谢任何帮助。这是可能的,还是我必须监控在远程主机上启动的进程的PID?

1 个答案:

答案 0 :(得分:0)

您考虑过Fabric吗?

它允许您跨机器并行运行命令,必要时使用您的密钥通过SSH。

以下是fabfile.py示例:

import fabric.api
from fabric.api import parallel
from fabric.api import env, run

env.user = 'root'
env.hosts = [ip1, ip2]

@parallel
def apt_update():
    '''
    Runs apt-get update and upgrade
    '''
    run('apt-get -y update')
    run('apt-get -y upgrade')

要运行,只需使用fab apt_update

在您的使用案例中,您似乎需要根据选项文件动态定义用户和主机。 env.userenv.hosts可以根据需要动态设置(虽然我没有搞乱每个主机设置env.user,同时运行并行任务)。