Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Paramiko - ssh to console server, having to hit return for script to continue

Just using my first paramiko script, we have an opengear console server, so I'm trying to automate setup of any device we plug into it.

The open gear listens for ssh connections on ports, for example a device in port 1 would be 3001. I am connecting to a device on port 8, which works and my script runs, but for some reason, after I get the "Interactive SSH session established" message, I need to hit return on the session to make it run (so I have a ssh session and the script does too, its shared).

It just waits there until I hit return, I've tried sending returns as you can see but they don't work, only a manual return works, which is odd because technically they are the same thing?

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
like image 446
AlexW Avatar asked Mar 15 '16 15:03

AlexW


1 Answers

I tried this and saw that

is_global = remote_conn.recv(1024)

hangs, Are you sure '192.168.1.10' sends somthing to be received ? Try setting a timeout

remote_conn.settimeout(3) 

3 seconds for example, do it after this line:

remote_conn = remote_conn_pre.invoke_shell()

this way the recv func does not hang and continues when timeout expires

works for me

like image 90
Ohad the Lad Avatar answered Sep 28 '22 19:09

Ohad the Lad