2016-03-15 6 views
11

Mit meinem ersten paramiko Skript haben wir einen Opengear Console Server, also versuche ich, die Einrichtung von jedem Gerät zu automatisieren, das wir anschließen.Paramiko - ssh Konsolenserver, Rückkehr zum Skript erforderlich, um fortzufahren

Das offene Zahnrad hört auf ssh Verbindungen auf Häfen, zum Beispiel ein Gerät in Port 1 wäre 3001. Ich verbinde mich mit einem Gerät auf Port 8, der funktioniert und mein Skript läuft, aber aus irgendeinem Grund, nachdem ich komme Die Meldung "Interactive SSH session setting" (Interaktive SSH-Sitzung eingerichtet) muss ich auf der Sitzung drücken, um sie auszuführen (also habe ich eine SSH-Sitzung und das Skript funktioniert ebenfalls, es wird geteilt).

Es wartet nur dort, bis ich zurückkomme, ich habe versucht, Renditen zu senden, wie Sie sehen können, aber sie funktionieren nicht, funktioniert nur eine manuelle Rückkehr, die seltsam ist, weil technisch sie das gleiche sind?

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 

Antwort

-1

Ich habe ein anderes Modul (Netmiko) gefunden, das genau das macht, was ich will und all diese Überprüfungen macht. Seit ich aufgegeben habe, versuche ich es selbst zu tun, wenn es jemand anderes schon besser gemacht hat.

Verwenden Sie Netmiko! :)

0

zunächst einige Befehl „ls -ltr \ n“ senden und rufen dann schlafen

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

Versuchen Sie Ihren Befehl in einem Debugger ausgeführt wird und herauszufinden, welche Zeile für die Eingabe wartet. Sie könnten auch versuchen, stattdessen \ r oder \ r \ n zu senden, wenn \ n. Denken Sie daran, die Eingabetaste ist wirklich^M

Sie können auch versuchen, detaillierte Protokollierung zu aktivieren.

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

Protokollierung ist nicht definiert. Muss ich etwas hinzufügen? Ich habe auch bemerkt, dass die erste Carrier Return funktioniert, ich sehe die Konsole und sehe es, dann macht es die Pause, bis ich eine weitere Rückkehr das Skript dann – AlexW

+0

Ich habe die Import-Anweisung hinzugefügt. –

+0

Für den Logger "paramiko.transport" konnten keine Handler gefunden werden – AlexW

0

habe ich versucht, diese und sah, dass

is_global = remote_conn.recv(1024) 

hängt, Sind Sie sicher, dass '192.168.1.10' Somthing empfangen werden sendet? versuchen, ein Timeout

remote_conn.settimeout(3) 

3 Sekunden Beispiel voran, tun Sie es nach dieser Zeile:

remote_conn = remote_conn_pre.invoke_shell() 

auf diese Weise die recv func nicht und nicht hängen bleibt, wenn Timeout

funktioniert bei mir abläuft

Verwandte Themen