import paramiko
import select
import time
# 定义要连接的Linux服务器及账号信息
servers = [
{"hostname": "IP1", "username": "root", "password": "root"},
{"hostname": "IP2", "username": "root", "password": "root"}
]
# 定义要执行的命令
command = "ping www.baidu.com"
# 创建SSH客户端对象
ssh_clients = []
for server in servers:
ssh = paramiko.Transport((server["hostname"], 22))
ssh.connect(username=server["username"], password=server["password"])
ssh_clients.append(ssh)
# 开始执行命令
channel0 = ssh_clients[0].open_channel(kind='session')
channel0.exec_command(command)
time.sleep(5)
channel1 = ssh_clients[1].open_channel(kind='session')
channel1.exec_command(command)
# 打印命令执行结果
result0 = channel0.recv(1024)
print(result0.decode())
result1 = channel1.recv(1024)
print(result1.decode())
# 关闭通道和连接
channel0.close()
channel1.close()
# 关闭所有连接
for ssh in ssh_clients:
ssh.close()
'''
PING www.a.shifen.com (220.181.38.150) 56(84) bytes of data.
64 bytes from 220.181.38.150 (220.181.38.150): icmp_seq=1 ttl=49 time=2.90 ms
64 bytes from 220.181.38.150 (220.181.38.150): icmp_seq=2 ttl=49 time=2.82 ms
64 bytes from 220.181.38.150 (220.181.38.150): icmp_seq=3 ttl=49 time=2.92 ms
64 bytes from 220.181.38.150 (220.181.38.150): icmp_seq=4 ttl=49 time=2.97 ms
64 bytes from 220.181.38.150 (220.181.38.150): icmp_seq=5 ttl=49 time=2.86 ms
PING www.a.shifen.com (110.242.68.3) 56(84) bytes of data.
64 bytes from 110.242.68.3 (110.242.68.3): icmp_seq=1 ttl=49 time=71.5 ms
'''
ssh.open_channel(kind='session')
方法可以在已经建立 SSH 连接的基础上打开一个新会话 Channel。以下是一个使用方式的例子:
import paramiko
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('hostname', username='username', password='password')
# 打开一个新的会话 Channel
channel = ssh.open_channel(kind='session')
# 在新的 Channel 中执行命令
channel.exec_command('ls -l')
# 获取命令的输出和错误信息
output = channel.recv(1024).decode()
error = channel.recv_stderr(1024).decode()
print(output)
print(error)
# 关闭 Channel 和 SSH 连接
channel.close()
ssh.close()
在该例子中,我们首先使用 Paramiko 库建立 SSH 连接。然后使用 open_channel(kind='session')
方法打开一个新的会话 Channel。接着,我们使用 exec_command
方法在新的 Channel 中执行了一个 ls -l
命令。最后,我们可以通过 recv
和 recv_stderr
方法获取命令的输出和错误信息。
需要注意的是,在使用 exec_command
方法执行命令之前,我们需要确保该命令不需要交互式输入信息。如果该命令需要交互式输入信息,那么我们需要使用 Paramiko 库提供的其他方法来完成这个需求。