【问题标题】:Multithreading ssh with paramiko使用 paramiko 的多线程 ssh
【发布时间】:2014-01-21 05:46:58
【问题描述】:

我是 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"

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

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

另外 isAlive 总是为我返回 False。

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

【问题讨论】:

  • 欢迎来到 StackOverflow 和 Python!上面的程序有语法错误,这是您正在使用的程序的简化版本吗?

标签: multithreading ssh paramiko


【解决方案1】:

你考虑过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)。

【讨论】:

  • 如果我使用织物并且 cmds 在不同的时间完成,有没有办法使用织物捕捉结束的过程?并重新启动过程?
  • 您是否需要这些进程才能继续运行?
  • 某种程度上,它们需要以随机参数运行长度重新启动,这意味着它们将在不同时间结束,并且*希望以新的随机运行长度重新启动
  • 将这些放在supervision by supervisord 下可能是值得的,因此您不必保持连接打开并保持任务运行。你必须设置一些东西来发送(或生成)你的随机运行长度。
猜你喜欢
  • 2016-06-06
  • 1970-01-01
  • 2011-08-23
  • 2022-01-08
  • 1970-01-01
  • 1970-01-01
  • 2016-12-12
相关资源
最近更新 更多