Python处理SSH [多个客户端]
我管理着三台服务器(都是Linux系统),每六个小时需要在这些服务器上运行一些脚本。
每次登录到每台服务器都需要花费一点时间,所以我写了这段代码。
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 个回答
看起来你的问题是你在调用 stdout.readlines()
,这个方法会一直读取SSH命令的输出,直到没有更多的内容可以读取为止……所以你的程序在这一步会一直停在那里不动。一个简单的解决办法是,你可以让每个命令在自己的线程里执行,或者你可以使用 fork
来在自己的进程空间里执行它。
你可能应该使用Fabric来完成这个任务。这样做会简单很多。
for F1 in ZI1:
你到底想在这里干什么呢?循环是用来重复某些事情的,但你并不想重复任何东西。
你能看出这两行代码之间的区别吗:
stdin, stdout, stderr = ssh.exec_command('uname -a')
ssh.exec_command('ls -la')
你的第二台和第三台服务器仍然在使用第一台服务器的输出。你需要重新获取输入、输出和错误输出。