我管理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
但它将它们放在一起相同的命令第三个服务器不执行任何操作
答案 0 :(得分:3)
for F1 in ZI1:
你想在这里做什么炒猴子?因为重复一些事情,但你不想重复任何事情。
您是否看到了这两行代码之间的区别:
stdin, stdout, stderr = ssh.exec_command('uname -a')
ssh.exec_command('ls -la')
您的第二台和第三台服务器仍在使用第一台服务器上的stdout。你需要再次使用stdin,stdout,stderr。
答案 1 :(得分:2)
您可能应该使用Fabric来执行此操作。这对你来说简单得多。
答案 2 :(得分:0)
看来您的问题是您正在调用stdout.readlines()
,它将继续从SSH命令读取输出,直到没有更多的输入要读取...所以您的程序不会推进到那时。作为一个简单的解决方案,您可以在自己的线程中执行每个命令,也可以fork
在自己的进程空间中执行它。
答案 3 :(得分:0)
为什么不在远程计算机上更好地设置cron脚本,而不是从远程主机建立连接。