我已经阅读了其他Stackoverflow线程。这些是较旧的帖子,我想获得最新的更新。
是否可以在Paramiko中通过单个通道发送多个命令?还是不可能?
如果是这样,是否有其他库可以做同样的事情。
示例场景,自动化Cisco路由器配置。 :在输入其他其他命令之前,用户需要先输入“Config t”。它目前在paramiko中是不可能的。
感谢。
答案 0 :(得分:0)
如果您打算使用paramiko API中提供的exec_command()方法,那么只要命令执行完毕,您将被限制为一次只发送一个命令。
以下摘录自Paramiko API文档。
exec_command(self,command)源代码执行命令 服务器。如果服务器允许,则直接通道 连接到命令的stdin,stdout和stderr 执行。
当命令完成执行时,通道将关闭 不能重复使用。如果要执行,则必须打开新频道 另一个命令。
但由于传输也是套接字的一种形式,您可以使用准系统套接字编程在不使用exec_command()方法的情况下发送命令。
如果您有一组已定义的命令,则可以使用pexpect和exscript,您可以从文件中读取一组命令并通过该通道发送它们。
答案 1 :(得分:0)
import threading, paramiko
strdata=''
fulldata=''
class ssh:
shell = None
client = None
transport = None
def __init__(self, address, username, password):
print("Connecting to server on ip", str(address) + ".")
self.client = paramiko.client.SSHClient()
self.client.set_missing_host_key_policy(paramiko.client.AutoAddPolicy())
self.client.connect(address, username=username, password=password, look_for_keys=False)
self.transport = paramiko.Transport((address, 22))
self.transport.connect(username=username, password=password)
thread = threading.Thread(target=self.process)
thread.daemon = True
thread.start()
def closeConnection(self):
if(self.client != None):
self.client.close()
self.transport.close()
def openShell(self):
self.shell = self.client.invoke_shell()
def sendShell(self, command):
if(self.shell):
self.shell.send(command + "\n")
else:
print("Shell not opened.")
def process(self):
global strdata, fulldata
while True:
# Print data when available
if self.shell is not None and self.shell.recv_ready():
alldata = self.shell.recv(1024)
while self.shell.recv_ready():
alldata += self.shell.recv(1024)
strdata = strdata + str(alldata)
fulldata = fulldata + str(alldata)
strdata = self.print_lines(strdata) # print all received data except last line
def print_lines(self, data):
last_line = data
if '\n' in data:
lines = data.splitlines()
for i in range(0, len(lines)-1):
print(lines[i])
last_line = lines[len(lines) - 1]
if data.endswith('\n'):
print(last_line)
last_line = ''
return last_line
sshUsername = "SSH USERNAME"
sshPassword = "SSH PASSWORD"
sshServer = "SSH SERVER ADDRESS"
connection = ssh(sshServer, sshUsername, sshPassword)
connection.openShell()
connection.send_shell('cmd1')
connection.send_shell('cmd2')
connection.send_shell('cmd3')
time.sleep(10)
print(strdata) # print the last line of received data
print('==========================')
print(fulldata) # This contains the complete data received.
print('==========================')
connection.close_connection()
答案 2 :(得分:0)
查看parallel-ssh
:
from pssh.pssh2_client import ParallelSSHClient
cmds = ['my cmd1', 'my cmd2']
hosts = ['myhost']
client = ParallelSSHClient(hosts)
for cmd in cmds:
output = client.run_command(cmd)
# Wait for completion
client.join(output)
单个客户端,同一个SSH会话上的多个命令以及可选的并行多个主机 - 也是非阻塞的。