2014-03-03 177 views
0

我已閱讀其他Stackoverflow線程。這些是舊帖子,我想獲得最新的更新。Paramiko - python SSH - 單個通道下的多個命令

是否有可能送過來單通道多個命令中的paramiko?還是不可能?

如果是這樣,有沒有可以做同樣的任何其他庫。

實施例方案中,自動化的Cisco路由器CONFI。 :用戶需要先輸入「Config t」才能輸入其他命令。它目前不可能在paramiko。

THanks。

+0

聽起來像你可能需要一個交互式會話,paramiko支持 - 下面的問題有幫助嗎? https://stackoverflow.com/questions/373639/running-interactive-commands-in-paramiko – DNA

+0

不,我不想交互式會話。謝謝。 – Bala

+0

只是爲了澄清,我不是指手動(人類)交互式會話 - 我的意思是自動執行交互式命令,這就是您的示例場景。我認爲這可以在paramiko或pexpect中完成。 – DNA

回答

0

如果計劃使用的paramiko API中提供的exec_command()方法中,將被限制爲在一個時間儘快發送僅單個命令,命令已經被執行了信道關閉。

的下面摘錄的paramiko API文檔。

exec_command(self,command)源代碼在 服務器上執行命令。如果服務器允許,那麼通道將直接連接 連接到執行命令爲 的stdin,stdout和stderr。

當命令完成執行,該通道將被關閉, 不能重複使用。如果您希望執行另一個命令 ,則必須打開一個新通道。

但由於傳輸也是套接字的一種形式,因此您可以使用準系統套接字編程而不使用exec_command()方法發送命令。

櫃面已定義的一組命令的則兩個Pexpect的和exscript可以被使用,其中閱讀一組命令形成一個文件,並穿過通道發送它們。

+0

讓我檢查一下pexpect和exscript。謝謝。 – Bala

0

見我的回答here或本page

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() 
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會話多個命令和並行可選多臺主機 - 也非阻塞。