Paramiko — python SSH — несколько команд по одному каналу

я читал другие потоки Stackoverflow по этому поводу. Это старые сообщения, я хотел бы получить последнее обновление.

Можно ли в Paramiko отправлять несколько команд по одному каналу? или все же нельзя?

Если да, то есть ли другая библиотека, которая может сделать то же самое.

Пример сценария, автоматизирующий настройку маршрутизатора Cisco. : Пользователь должен сначала ввести «Config t», прежде чем вводить другие другие команды. В настоящее время это невозможно в парамико.

Благодарю.


person Bala    schedule 03.03.2014    source источник
comment
Похоже, вам может понадобиться интерактивный сеанс, который поддерживает paramiko. Помогает ли следующий вопрос? stackoverflow.com/questions/373639/   -  person DNA    schedule 03.03.2014
comment
Нет, мне не нужна интерактивная сессия. Спасибо.   -  person Bala    schedule 03.03.2014
comment
Просто чтобы уточнить, я не имею в виду ручную (человеческую) интерактивную сессию - я имею в виду автоматизацию интерактивной команды, что и является вашим примером сценария. Думаю, это можно сделать в paramiko или pexpect.   -  person DNA    schedule 03.03.2014


Ответы (3)


if you are planning to use the exec_command() method provided within the paramiko API , you would be limited to send only a single command at a time , as soon as the command has been executed the channel is closed.

Приведенная ниже выдержка из документов Paramiko API.

exec_command(self, command) исходный код Выполнение команды на сервере. Если сервер разрешает это, канал будет напрямую подключен к stdin, stdout и stderr выполняемой команды.

Когда команда завершит выполнение, канал будет закрыт и не может быть использован повторно. Вы должны открыть новый канал, если хотите выполнить другую команду.

но так как транспорт также является формой сокета, вы можете отправлять команды без использования метода exec_command(), используя базовое программирование сокетов.

Если у вас есть определенный набор команд, можно использовать как pexpect, так и exscript, где вы читаете набор команд из файла и отправляете их по каналу.

person durga    schedule 04.03.2014
comment
Позвольте мне также проверить pexpect и exscript. Спасибо. - person Bala; 04.03.2014

См. мой ответ здесь или этот страница

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()
person Nagabhushan S N    schedule 22.01.2018

Взгляните на 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 и, возможно, несколько хостов параллельно — также без блокировки.

person danny    schedule 22.01.2018
comment
Это не делает то, что вы думаете. Это запускает каждую команду в отдельном канале. - person jacob; 06.05.2020