Постоянная сессия ssh для маршрутизатора Cisco

У меня есть поиск на этом сайте и в нескольких других местах, но я не смог решить мою проблему подключения и поддержки сеанса ssh после одной команды. Ниже мой текущий код:

#!/opt/local/bin/python import os import pexpect import paramiko import hashlib import StringIO while True: cisco_cmd = raw_input("Enter cisco router cmd:") ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect('192.168.221.235', username='nuts', password='cisco', timeout = 30) stdin, stdout, stderr = ssh.exec_command(cisco_cmd) print stdout.read() ssh.close() if cisco_cmd == 'exit': break 

Я могу запускать несколько команд, но для каждой команды создается новый сеанс ssh. Вышеупомянутая программа не работает, когда мне нужен режим конфигурации, потому что сеанс ssh не используется повторно. Большое спасибо за помощь в решении этого вопроса.

  • paramiko Несовместимый ssh-peer (нет приемлемого алгоритма kex)
  • Python: как можно удаленно от моего локального компьютера до remoteA до remoteb к удаленному c с помощью Paramiko
  • Переадресация портов с помощью парамико
  • установка paramiko на Windows
  • Почему Pariko зависает, если вы используете его при загрузке модуля?
  • Как изменить каталоги с помощью Paramiko?
  • Переводы каталога на парамико
  • 4 Solutions collect form web for “Постоянная сессия ssh для маршрутизатора Cisco”

    Я использовал Exscript вместо paramiko, и теперь я могу получить постоянный сеанс на устройстве IOS.

     #!/opt/local/bin/python import hashlib import Exscript from Exscript.util.interact import read_login from Exscript.protocols import SSH2 account = read_login() # Prompt the user for his name and password conn = SSH2() # We choose to use SSH2 conn.connect('192.168.221.235') # Open the SSH connection conn.login(account) # Authenticate on the remote host conn.execute('conf t') # Execute the "uname -a" command conn.execute('interface Serial1/0') conn.execute('ip address 114.168.221.202 255.255.255.0') conn.execute('no shutdown') conn.execute('end') conn.execute('sh run int Serial1/0') print conn.response conn.execute('show ip route') print conn.response conn.send('exit\r') # Send the "exit" command conn.close() # Wait for the connection to close 

    Вам необходимо создать, подключить и закрыть соединение за пределами цикла while.

    Ваша петля делает это

     ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect('192.168.221.235', username='nuts', password='cisco', timeout = 30) while True: cisco_cmd = raw_input("Enter cisco router cmd:") stdin, stdout, stderr = ssh.exec_command(cisco_cmd) print stdout.read() if cisco_cmd == 'exit': break ssh.close() 

    Переместите инициализацию и настройку вне цикла. EDIT: перемещено close ()

    Вышеупомянутая программа не работает, когда мне нужен режим конфигурации, потому что сеанс ssh не используется повторно

    Ваш сеанс ssh будет повторно использоваться после перемещения connect и close за пределами цикла, но каждый exec_command() происходит в новой оболочке (через новый канал) и не связан. Вам нужно будет отформатировать свои команды, чтобы они не требовали какого-либо состояния из оболочки.

    Если я правильно помню, некоторые устройства Cisco разрешают только один exec, а затем закрывают соединение. В этом случае вам нужно будет использовать invoke_shell() и работать в интерактивном режиме с pexpect модуля pexpect (который уже импортирован, но не используется).

    Python - лучший язык программирования в мире.