【问题标题】:Commands in Paramiko block due to script execution time由于脚本执行时间,Paramiko 块中的命令
【发布时间】:2011-06-08 06:06:47
【问题描述】:

大家好,我有三台服务器,我从 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 个 paramiko.SSHClient() 实例并将它们放在分隔线程中?
  • @Johnsyweb,他对同一个脚本提出了不同的问题。对我来说这看起来不像是一个骗局
  • @Mike Pennington,@jack-X:我坐得更正了,很抱歉。

标签: python session ssh paramiko


【解决方案1】:

我建议查看Fabric。它可以帮助您处理 SSH 连接。

【讨论】:

    【解决方案2】:

    您当前的操作方式会阻塞,因为您有六个小时没有退出主机。

    多处理:

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

    nohup:

    另一种方法(不允许您通过paramiko 查看脚本的返回值)是使用nohup 解除脚本与shell 的关联。这会将其置于后台并允许您注销。为此,请使用...

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

    错别字:

    顺便说一句,您在最后一个循环中有拼写错误...ZI2 在最后一个循环中应该是ZI3...此外,for-循环是不必要的...我修复了您的最后一次迭代。 .. 感谢@johnsyweb 发现了比我更多的 OP 错别字...

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

    【讨论】:

    • 向上!!!请帮助我,我收到错误(&lt;class 'socket.error'&gt;, error(10061, 'No connection could be made because the t arget machine actively refused it'), &lt;traceback object at 0x0290BDC8&gt;)
    • 这不是最后一个 for 循环中的唯一错误,它还引用了 ZI2,可能是前一个块的复制和粘贴错误。更相关的是:你为什么在这里使用for-loop?除了将所有事情都做两次之外没有任何迭代(因为dict 中有两个元素)。我认为cron 是这里最好的方法。
    • @Johnsyweb,我同意你所说的......我写这篇文章是因为我准备今天早上出门上班;我应该已经发现了 for 循环的问题。至于cron,也许是真的,但如果这是家庭作业,他可能会被铐在paramiko...我会留给OP评论。
    • 嘿嘿。我知道那是什么样的。当我匆忙去做其他事情时,我犯了一个类似的错误,将其标记为重复。
    【解决方案3】:

    如果您需要根据 Register.py 的返回执行一些操作,另一种方法是使用 Thread

    查看示例:

    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()
    

    【讨论】:

    • mr.olarva 您的代码是否使脚本在不关闭的情况下仍然可以工作? (会话仍然打开?)我也得到了那个错误! (&lt;class 'socket.er onnected party did onnection failed b ct at 0x02888D78&gt;) 非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-04
    • 2013-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-06
    相关资源
    最近更新 更多