2016-03-15 9 views
11

Używając mojego pierwszego skryptu paramiko, mamy serwer konsoli opengear, więc staram się zautomatyzować konfigurację dowolnego urządzenia, które do niego podłączymy.Paramiko - ssh na konsolę serwera, po naciśnięciu return dla skryptu, aby kontynuować

Otwarta biega nasłuchuje połączeń ssh na portach, na przykład urządzenie w porcie 1 byłoby 3001. Łączę się z urządzeniem na porcie 8, które działa i działa mój skrypt, ale z jakiegoś powodu, po tym, jak dostaję wiadomość "Ustanowiona sesja interaktywnego SSH", muszę nacisnąć klawisz return sesji, aby ją uruchomić (mam sesję ssh i skrypt też ją udostępnia).

Po prostu czeka tam, aż uderzę powrót, próbowałem wysyłać powroty, jak widać, ale nie działają, działa tylko ręczny zwrot, co jest dziwne, ponieważ technicznie są one tym samym?

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 

Odpowiedz

-1

znalazłem kolejny moduł (netmiko), który robi dokładnie to, co chcę i wykonuje wszystkie te sprawdzenia. Odkąd porzuciłem próbę zrobienia tego samemu, gdy ktoś inny zrobił to już lepiej.

używać Netmiko! :)

0

najpierw wysłać jakieś polecenia „ls -ltr \ n”, a następnie wywołać sen

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

Spróbuj uruchomić swoją komendę w debugera i dowiedzieć się, co czeka na linii wejścia. Możesz też spróbować wysłać \ r lub \ r \ n zamiast tego po prostu \ n. Pamiętaj, że klawisz Enter jest naprawdę^M

Możesz również spróbować włączyć szczegółowe rejestrowanie.

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

logowanie nie jest zdefiniowane. czy muszę coś dodać? również ive ntoiced, że pierwszy powrót carrige działa, oglądam konsolę i widzę ją, a następnie robi pauzę, póki nie trafię na kolejny skrypt, następnie uruchamia – AlexW

+0

Dodałem instrukcję importu. –

+0

Nie znaleziono obsługi dla rejestratora "paramiko.transport" – AlexW

0

Próbowałem tego i zobaczyłem, że

is_global = remote_conn.recv(1024) 

zawiesza, Czy na pewno '192.168.1.10' wysyła somthing być odbierane? Spróbuj ustawić limit czasu

remote_conn.settimeout(3) 

3 sekundy na przykład, zrób to po tej linii:

remote_conn = remote_conn_pre.invoke_shell() 

ten sposób func recv nie wisi i nadal gdy przeterminowanie

pracuje dla mnie

Powiązane problemy