2016-03-15 16 views
11

Usando il mio primo script paramiko, abbiamo un server console opengear, quindi sto tentando di automatizzare l'installazione di qualsiasi dispositivo che inseriamo.Paramiko - ssh al server della console, dovendo premere Invio per continuare lo script

La marcia aperta è in ascolto per le connessioni ssh sulle porte, ad esempio un dispositivo nella porta 1 sarebbe 3001. Mi collego a un dispositivo sulla porta 8, che funziona e il mio script viene eseguito, ma per qualche motivo, dopo aver ottenuto il messaggio "Sessione interattiva SSH stabilita", ho bisogno di colpire il ritorno sulla sessione per farlo funzionare (quindi ho una sessione ssh e lo fa anche lo script, è condivisa).

Aspetta lì fino al mio ritorno, ho provato a inviare i resi come puoi vedere ma non funzionano, funziona solo un ritorno manuale, che è strano perché tecnicamente sono la stessa cosa?

import paramiko 
import time 

def disable_paging(remote_conn): 
    '''Disable paging on a Cisco router''' 
    remote_conn.send("terminal length 0\n") 
    time.sleep(1) 
    # Clear the buffer on the screen 
    output = remote_conn.recv(1000) 
    return output 

if __name__ == '__main__': 
    # VARIABLES THAT NEED CHANGED 
    ip = '192.168.1.10' 
    username = 'root' 
    password = 'XXXXXX' 
    port = 3008 

    # Create instance of SSHClient object 
    remote_conn_pre = paramiko.SSHClient() 

    # Automatically add untrusted hosts (make sure okay for security policy in your environment) 
    remote_conn_pre.set_missing_host_key_policy(
     paramiko.AutoAddPolicy()) 

    # initiate SSH connection 
    remote_conn_pre.connect(ip, username=username, password=password,port=port, look_for_keys=False, allow_agent=False) 
    print "SSH connection established to %s" % ip 

    # Use invoke_shell to establish an 'interactive session' 
    remote_conn = remote_conn_pre.invoke_shell() 
    print "Interactive SSH session established" 
    time.sleep(1) 
    remote_conn.send("\n") 

    # Strip the initial router prompt 
    #output = remote_conn.recv(1000) 

    # See what we have 
    #print output 

    # Turn off paging 
    #disable_paging(remote_conn) 

    # clear any config sessions 
    is_global = remote_conn.recv(1024) 
    if ")#" in is_global: 
     remote_conn.send("end\n") 
     time.sleep(2) 
    # if not in enable mode go to enable mode 
    is_enable = remote_conn.recv(1024) 
    if ">" in is_enable: 
     remote_conn.send("enable\n") 
     time.sleep(1) 
    remote_conn.send("conf t\n") 
    remote_conn.send("int g0/0/1\n") 
    remote_conn.send("ip address 192.168.1.21 255.255.255.0\n") 
    remote_conn.send("no shut\n") 
    remote_conn.send("end\n") 
    # Wait for the command to complete 
    time.sleep(2) 
    remote_conn.send("ping 192.168.1.1\n") 
    time.sleep(1) 

    output = remote_conn.recv(5000) 
    print output 

risposta

-1

ive ha trovato un altro modulo (netmiko) che fa esattamente ciò che voglio e fa tutti questi controlli. sono abbandonato da quando ho provato a farlo da solo quando qualcun altro l'ha già fatto meglio.

utilizzare Netmiko! :)

0

prima inviare alcuni "ls -ltr \ n" comando e quindi chiamare il sonno

remote_conn.send("ls -ltr\n") 
time.sleep(1) 
-1

provare a eseguire il vostro comando in un debugger e scoprire quale linea è in attesa di input. Potresti anche provare a inviare \ r o \ r \ n invece se solo \ n. Ricorda che il tasto Invio è davvero^M

Si potrebbe anche provare a attivare la registrazione dettagliata.

import logging 
# ... 
logging.getLogger("paramiko").setLevel(logging.DEBUG) 
+0

la registrazione non è definita. devo aggiungere qualcosa? Ho anche capito che il primo ritorno di carrige funziona, guardo la console e la vedo, poi fa la pausa fino a quando non prendo un altro ritorno lo script viene quindi eseguito – AlexW

+0

ho aggiunto la dichiarazione di importazione. –

+0

Non è stato possibile trovare gestori per il registratore "paramiko.transport" – AlexW

0

Ho provato questo e ho visto che

is_global = remote_conn.recv(1024) 

si blocca, Sei sicuro '192.168.1.10' manda somthing da ricevere? Prova a impostare un timeout

remote_conn.settimeout(3) 

3 secondi, per esempio, farlo dopo questa riga:

remote_conn = remote_conn_pre.invoke_shell() 

questo modo il func recv non si blocca e continua quando timeout

lavori per me

Problemi correlati