Python处理SSH [多个客户端]

1 投票
4 回答
678 浏览
提问于 2025-04-16 19:02

我管理着三台服务器(都是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 个回答

0

看起来你的问题是你在调用 stdout.readlines(),这个方法会一直读取SSH命令的输出,直到没有更多的内容可以读取为止……所以你的程序在这一步会一直停在那里不动。一个简单的解决办法是,你可以让每个命令在自己的线程里执行,或者你可以使用 fork 来在自己的进程空间里执行它。

2

你可能应该使用Fabric来完成这个任务。这样做会简单很多。

3
for F1 in ZI1:

你到底想在这里干什么呢?循环是用来重复某些事情的,但你并不想重复任何东西。

你能看出这两行代码之间的区别吗:

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

ssh.exec_command('ls -la')

你的第二台和第三台服务器仍然在使用第一台服务器的输出。你需要重新获取输入、输出和错误输出。

撰写回答