我是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?
答案 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.user
和env.hosts
可以根据需要动态设置(虽然我没有搞乱每个主机设置env.user,同时运行并行任务)。