2011-03-08 10 views
7

Tengo búsqueda en este sitio y en otras varias, pero no he podido resolver mi problema de conexión y mantenimiento de la sesión ssh después de un comando. Debajo está mi código actual:Sesión persistente ssh al enrutador Cisco

#!/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 

Puedo ejecutar varios comandos, pero para cada comando se crea una nueva sesión ssh. El programa anterior no funciona cuando necesito el modo de configuración porque la sesión de SSH no se reutiliza. Cualquier ayuda para resolver este problema es muy apreciada.

+0

Estoy fascinado por un script que importa tanto pexpect como paramiko ... ¿Estás usando ambos a la vez, o prueba uno y migras? –

Respuesta

6

Utilicé Exscript en lugar de paramiko y ahora puedo obtener una sesión persistente en el dispositivo 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

Necesita crear, conectar y cerrar la conexión fuera del ciclo while.

1

Su lazo hace que

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

Mover la inicialización y configuración fuera del bucle. EDIT: se acercó()

+1

'ssh.close()' tampoco debería estar en el ciclo. –

+0

Buen lugar Lo perdí –

+0

Puedo conectar y ejecutar con éxito el primer comando. No he podido configurar una conexión que persista para que se puedan ejecutar varios comandos relacionados. – msudi

1

El programa anterior no funciona cuando necesito modo de configuración debido sesión ssh no se reutiliza

Su ssh sesión se volverá a utilizar una vez que se mueve connect y close fuera del ciclo, pero cada exec_command() ocurre en un nuevo shell (a través de un nuevo canal) y no están relacionados. Tendrá que formatear sus comandos para que no requieran ningún estado del shell.

Si no recuerdo mal, algunos dispositivos de Cisco solo permiten un único administrador y luego cierran la conexión. En ese caso, necesitará usar invoke_shell(), y trabajar interactivamente usando el módulo pexpect (que ya ha importado, pero que no está usando).

+0

Gracias, todavía estoy tratando de invocar_shell() en vano. Informaré en un día o dos cuando solucione mi problema. – msudi

Cuestiones relacionadas