1

我管理 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但是它将它们一起提供了相同的命令第三台服务器不执行任何操作

4

4 回答 4

3
for F1 in ZI1:

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

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

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

ssh.exec_command('ls -la')

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

于 2011-06-06T19:55:06.567 回答
2

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

于 2011-06-06T21:46:17.950 回答
0

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

于 2011-06-06T17:15:43.993 回答
0

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

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

于 2011-08-07T06:14:48.710 回答