Paramiko中的命令由于脚本执行时间而阻塞

时间:2011-06-07 12:41:19

标签: python session ssh paramiko

大家好我有三个服务器,我从SSH管理它所以我做了这个脚本运行我的注册脚本“Register.py”所以我每天打开注册模式所以问题如何我可以登录到多个SSH连接而不关闭另一个

import paramiko
import os
ZI1={"ip":"192.168.1.2","pass":"Administrator"}
ZI2={"ip":"192.168.1.3","pass":"AdminTeachers"}
ZI3={"ip":"192.168.1.4","pass":"AdminStudents"}
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
for F1 in ZI1:
    ssh.connect(ZI1["ip"],username='root', password=ZI1["pass"])
    ssh.exec_command('./register.py -time 6') #6 hour so the script still working for 6 hours
    ssh.close()
for F2 in ZI2:
    ssh.connect(ZI2["ip"],username='root', password=ZI2["pass"])
    ssh.exec_command('./register.py -time 6')
    ssh.close()
for F3 in ZI3:
    ssh.connect(ZI2["ip"],username='root', password=ZI2["pass"])
    ssh.exec_command('./register.py -time 6')
    ssh.close()

所以我必须做的就是在不停止脚本的情况下打开3个会话!!

3 个答案:

答案 0 :(得分:1)

我建议看Fabric。它可以帮助您使用SSH连接。

答案 1 :(得分:1)

你目前的做法是阻止你没有退出主机六个小时。

多处理:

如果您需要查看脚本中的返回代码,则应使用python's multiprocessing module打开与每个主机的连接。

nohup的:

另一种方法(不允许您通过paramiko查看脚本的返回值)是使用nohup取消脚本与shell的关联。这将把它放在后台并允许您注销。要做到这一点,请使用......

    ssh.exec_command('nohup ./register.py -time 6 &') 

错别字:

顺便说一下,你在最后一个循环中有拼写错误... ZI2在最后一个循环中应该是ZI3 ...此外,for - 循环是不必要的......我修复了你的最后一次迭代... Acks to @johnsyweb发现了更多OP的拼写错误而不是我...

ssh.connect(ZI3["ip"],username='root', password=ZI3["pass"])
ssh.exec_command('./register.py -time 6')   # <------------- missing s in ssh
ssh.close()

答案 2 :(得分:0)

另一种方法是使用Thread,如果你需要根据Register.py

的返回做一些动作

参见示例:

import paramiko
import os
import sys
from threading import Thread

SERVER_LIST = [{"ip":"192.168.1.2","pass":"Administrator"},{"ip":"192.168.1.4","pass":"AdminStudents"},{"ip":"192.168.1.3","pass":"AdminTeachers"}]



class ExecuteRegister(Thread):
    def __init__ (self,options):
        Thread.__init__(self)
        self.options = options       
        self.ssh = paramiko.SSHClient()
        self.ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())



    def run(self):
        try:
           self.ssh.connect(self.options['ip'],username='root', password=self.options["pass"])
           self.ssh.exec_command('./register.py -time 6') #6 hour so the script still working for 6 hours
           self.ssh.close()
        except:
           print sys.exc_info()



for server in SERVER_LIST:
    Register = ExecuteRegister(server)
    Register.start()