Paramiko - python SSH - 单个通道下的多个命令

时间:2014-03-03 08:11:14

标签: python paramiko

我已经阅读了其他Stackoverflow线程。这些是较旧的帖子,我想获得最新的更新。

是否可以在Paramiko中通过单个通道发送多个命令?还是不可能?

如果是这样,是否有其他库可以做同样的事情。

示例场景,自动化Cisco路由器配置。 :在输入其他其他命令之前,用户需要先输入“Config t”。它目前在paramiko中是不可能的。

感谢。

3 个答案:

答案 0 :(得分:0)

如果您打算使用paramiko API中提供的exec_command()方法,那么只要命令执行完毕,您将被限制为一次只发送一个命令。

以下摘录自Paramiko API文档。

  

exec_command(self,command)源代码执行命令   服务器。如果服务器允许,则直接通道   连接到命令的stdin,stdout和stderr   执行。

     

当命令完成执行时,通道将关闭   不能重复使用。如果要执行,则必须打开新频道   另一个命令。

但由于传输也是套接字的一种形式,您可以使用准系统套接字编程在不使用exec_command()方法的情况下发送命令。

如果您有一组已定义的命令,则可以使用pexpect和exscript,您可以从文件中读取一组命令并通过该通道发送它们。

答案 1 :(得分: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()

答案 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会话上的多个命令以及可选的并行多个主机 - 也是非阻塞的。