Постоянный сеанс SSH к маршрутизатору Cisco - PullRequest
7 голосов
/ 08 марта 2011

У меня есть поиск на этом сайте и во многих других местах, но я не смог решить мою проблему подключения и поддержки сеанса 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 не используется повторно. Любая помощь в решении этого вопроса очень ценится.

Ответы [ 4 ]

6 голосов
/ 13 марта 2011

Я использовал 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
1 голос
/ 08 марта 2011

Ваш цикл делает это

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()

Переместите инициализацию и настройку за пределы цикла.РЕДАКТИРОВАТЬ: Перемещение близко ()

1 голос
/ 08 марта 2011

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

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

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

1 голос
/ 08 марта 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...