【问题标题】:python dealing with SSH [many clients ]python处理SSH [许多客户端]
【发布时间】:2011-08-07 14:14:48
【问题描述】:

我管理 3 台服务器 [Linux],我必须每 6 小时打开这些服务器上的脚本

所以每次登录都需要一点时间..所以我编写了这段代码

import paramiko
import os
ZI1={"ip":"192.168.1.2","pass":"server-1"}
ZI2={"ip":"192.168.1.3","pass":"Server-2"}
ZI3={"ip":"192.168.1.4","pass":"server-3"}
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
SPAM=1
while SPAM==3:
    ssh.connect(ZI1["ip"],username='root', password=ZI1["pass"])
    stdin, stdout, stderr = ssh.exec_command('perl Register.pl')
    print stdout.readlines()
    SPAM+=1
    ssh.connect(ZI2["ip"],username='root', password=ZI2["pass"])
    stdin, stdout, stderr = ssh.exec_command('perl Register.pl')
    print stdout.readlines()
    SPAM+=1
    ssh.connect(ZI2["ip"],username='root', password=ZI2["pass"])
    stdin, stdout, stderr = ssh.exec_command('perl Register.pl')
    print stdout.readlines()
    ssh.close()
    SPAM+=1

好吧,它工作得不好;(我想输入每一个并运行脚本并转到 另一个服务器没有关闭连接或终止脚本,所以请帮助我。

编辑后

现在我编辑它,我遇到了新问题

我将此添加到我的代码中:

import paramiko
import os
ZI1={"ip":"192.168.1.2","pass":"server-1"}
ZI2={"ip":"192.168.1.3","pass":"Server-2"}
ZI3={"ip":"192.168.1.4","pass":"server-3"}
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

for F1 in ZI1:
    ssh.connect(ZI1["ip"],username='root', password=ZI1["pass"])
    stdin, stdout, stderr = ssh.exec_command('uname -a')
    print stdout.readlines()
    ssh.close()
for F2 in ZI2:
    ssh.connect(ZI2["ip"],username='root', password=ZI2["pass"])
    ssh.exec_command('ls -la')
    print stdout.readlines()
    ssh.close()
for F3 in ZI3:
    ssh.connect(ZI2["ip"],username='root', password=ZI2["pass"])
    ssh.exec_command('pwd')
    print stdout.readlines()
    ssh.close()

我给每个不同的命令看看它是否有效,我得到了非常奇怪的输出

['Linux xxxx 2.6.18-028stab070.14 #1 SMP Thu Nov 18 16:04:02 MSK 2010 x 86_64 x86_64 x86_64 GNU/Linux\n'] ['Linux xxxx 2.6.18-028stab070.14 #1 SMP Thu Nov 18 16:04:02 MSK 2010 x 86_64 x86_64 x86_64 GNU/Linux\n'] [] [] [] []

我说第一台服务器执行命令uname -a,第二台服务器执行命令ls -la,但它将它们一起提供相同的命令第三台服务器不执行任何操作

【问题讨论】:

  • 什么“效果不好”?连接已关闭?
  • 你的代码有逻辑问题。 while 块永远不会执行。并不是说这是您的主要问题,而是其中之一。
  • 如果while 块永远不会执行,我该怎么办!?嘿,我的朋友 zengr,我的意思是完全脚本不能正常工作!
  • 也许你应该在做这样的事情之前再运行一次Python tutorial。您的代码将通过一些更好的结构得到很大改进,例如将 ZI1..3 放在一个列表中并使用 for 迭代该列表。您甚至根本不需要 SPAM 变量。
  • 为什么不在远程主机上从 cron 运行脚本?

标签: python ssh paramiko


【解决方案1】:
for F1 in ZI1:

你想在这里做什么炸猴子? For 是重复某事,但你不想重复任何事。

你看出这两行代码的区别了吗:

stdin, stdout, stderr = ssh.exec_command('uname -a')

ssh.exec_command('ls -la')

您的第二台和第三台服务器仍在使用第一台服务器的标准输出。您需要再次拥有标准输入、标准输出、标准错误。

【讨论】:

    【解决方案2】:

    您可能应该使用 Fabric 来执行此操作。这对你来说会简单得多。

    【解决方案3】:

    看来您的问题是您正在调用stdout.readlines(),它将继续读取 SSH 命令的输出,直到没有更多输入要读取...所以您的程序直到然后。作为一个简单的解决方案,您可以在自己的线程中执行每个命令,也可以fork 并在自己的进程空间中执行。

    【讨论】:

    • 所以问题是我的脚本没有像我猜的那样连接......有人可以给我一些提示
    • 看了温斯顿的回答,我不得不同意他关于炸猴子的看法。仔细检查您的代码会发现整个事情是一个巨大的
    • Winston Ewert
    【解决方案4】:

    恕我直言,您从错误的角度解决了这个问题...

    与其从远程主机建立连接,不如在远程机器上设置cron 脚本。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-02
      • 1970-01-01
      • 1970-01-01
      • 2021-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多