我已閱讀其他Stackoverflow線程。這些是舊帖子,我想獲得最新的更新。Paramiko - python SSH - 單個通道下的多個命令
是否有可能送過來單通道多個命令中的paramiko?還是不可能?
如果是這樣,有沒有可以做同樣的任何其他庫。
實施例方案中,自動化的Cisco路由器CONFI。 :用戶需要先輸入「Config t」才能輸入其他命令。它目前不可能在paramiko。
THanks。
我已閱讀其他Stackoverflow線程。這些是舊帖子,我想獲得最新的更新。Paramiko - python SSH - 單個通道下的多個命令
是否有可能送過來單通道多個命令中的paramiko?還是不可能?
如果是這樣,有沒有可以做同樣的任何其他庫。
實施例方案中,自動化的Cisco路由器CONFI。 :用戶需要先輸入「Config t」才能輸入其他命令。它目前不可能在paramiko。
THanks。
如果計劃使用的paramiko API中提供的exec_command()方法中,將被限制爲在一個時間儘快發送僅單個命令,命令已經被執行了信道關閉。
的下面摘錄的paramiko API文檔。
exec_command(self,command)源代碼在 服務器上執行命令。如果服務器允許,那麼通道將直接連接 連接到執行命令爲 的stdin,stdout和stderr。
當命令完成執行,該通道將被關閉, 不能重複使用。如果您希望執行另一個命令 ,則必須打開一個新通道。
但由於傳輸也是套接字的一種形式,因此您可以使用準系統套接字編程而不使用exec_command()方法發送命令。
櫃面已定義的一組命令的則兩個Pexpect的和exscript可以被使用,其中閱讀一組命令形成一個文件,並穿過通道發送它們。
讓我檢查一下pexpect和exscript。謝謝。 – Bala
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()
看一看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會話多個命令和並行可選多臺主機 - 也非阻塞。
聽起來像你可能需要一個交互式會話,paramiko支持 - 下面的問題有幫助嗎? https://stackoverflow.com/questions/373639/running-interactive-commands-in-paramiko – DNA
不,我不想交互式會話。謝謝。 – Bala
只是爲了澄清,我不是指手動(人類)交互式會話 - 我的意思是自動執行交互式命令,這就是您的示例場景。我認爲這可以在paramiko或pexpect中完成。 – DNA