Python Pexpect SSH Command Line Login Arguments

12,339

In this line you have the options that be used(bold) optlist, args = getopt.getopt(sys.argv[1:], 'h:u:p:', ['help','?'])

to add a -x for uptime you could do: optlist, args = getopt.getopt(sys.argv[1:], 'h:u:p:x', ['help','?'])

and then in the part you do the uptime check just put it under one if like this: if '-x' in options:

and repeat this for every option and do not forget to add some description on it

Share:
12,339
user1719938
Author by

user1719938

Updated on June 04, 2022

Comments

  • user1719938
    user1719938 almost 2 years

    I'm using the pexpect.py script to login and get hostname information.
    Basically I run it like this

    ~$:./pexpect.py -h{hostname} -u{user} -p{password}
    

    You will see below that it's automated to run a few commands and close out. I'd like to be able to add line at the end so the user can pick and choose what information they would like to see. So instead of the above command line it would look something like:

    ~$:./pexpexct.py -h{hostname} -u{username} -p{password} -x{user defined} -z{user defined}
    

    Basically a list with -x being.. say uptime and -z being ifconfig.. there would also be -a, -b , -c. I'm lost as how to add those arguments in the code:

    #!/usr/bin/env python
    # -h : hostname of the remote server to login to.
    # -u : username to user for login.
    # -p : Password to user for login. 
    
    import os, sys, time, re, getopt, getpass
    import traceback
    import pexpect
    
    COMMAND_PROMPT = '[#$] '
    TERMINAL_PROMPT = '(?i)terminal type\?'
    TERMINAL_TYPE = 'vt100'
    
    SSH_NEWKEY = '(?i)are you sure you want to continue connecting'
    
    def exit_with_usage():
        print globals()['__doc__']
        os._exit(1)
    
    def main():
        global COMMAND_PROMPT, TERMINAL_PROMPT, TERMINAL_TYPE, SSH_NEWKEY
        ## Parse the options, arguments, get ready, etc.
        try:
            optlist, args = getopt.getopt(sys.argv[1:], 'h:u:p:', ['help','?'])
        except Exception, e:
            print str(e)
            exit_with_usage()
        options = dict(optlist)
        if len(args) > 1:
            exit_with_usage()
    
        if [elem for elem in options if elem in ['-?','--?','--help']]:
            print "Help:"
            exit_with_usage()
    
        if '-h' in options:
            host = options['-h']
        else:
            host = raw_input('hostname: ')
        if '-u' in options:
            user = options['-u']
        else:
            user = raw_input('username: ')
        if '-p' in options:
            password = options['-p']
        else:
            password = getpass.getpass('password: ')
    
    ## Login via SSH
    
        child = pexpect.spawn('ssh -l %s %s'%(user, host))
        i = child.expect([pexpect.TIMEOUT, SSH_NEWKEY, COMMAND_PROMPT, '(?i)password'])
        if i == 0:
                print 'ERROR! could not login with SSH. Here is what SSH said:'
                print child.before, child.after
                print str(child)
                sys.exit (1)
        if i == 1: # In this case SSH does not have the public key cached.
                child.sendline ('yes')
                child.expect ('(?i)password')
        if i == 2:
                # This may happen if a public key was setup to automatically login.
                # But beware, the COMMAND_PROMPT at this point is very trivial and
                # could be fooled by some output in the MOTD or login message.
                pass
        if i == 3:
                child.sendline(password)
                # Now we are either at the command prompt or
                # the login process is asking for our terminal type.
                i = child.expect ([COMMAND_PROMPT, TERMINAL_PROMPT])
                if i == 1:
                    child.sendline (TERMINAL_TYPE)
                    child.expect (COMMAND_PROMPT)
    
            COMMAND_PROMPT = "\[PEXPECT\]\$ "
            child.sendline ("PS1='[PEXPECT]\$ '") # In case of sh-style
            i = child.expect ([pexpect.TIMEOUT, COMMAND_PROMPT], timeout=10)
            if i == 0:
                print "# Couldn't set sh-style prompt -- trying csh-style."
                child.sendline ("set prompt='[PEXPECT]\$ '")
                i = child.expect ([pexpect.TIMEOUT, COMMAND_PROMPT], timeout=10)
                if i == 0:
                    print "Failed to set command prompt using sh or csh style."
                    print "Response was:"
                    print child.before
                    sys.exit (1)
    
    # Now we should be at the command prompt and ready to run some commands.
    # print '---------------------------------------'
    # print 'Report of commands run on remote host.'
    # print '---------------------------------------'
    
    # Run uname.
            child.sendline ('uname -a')
            child.expect (COMMAND_PROMPT)
            print child.before
            if 'linux' in child.before.lower():
                LINUX_MODE = 1
            else:
                LINUX_MODE = 0
    
    # Run and parse 'uptime'.
            child.sendline ('uptime')
            child.expect('up\s+(.*?),\s+([0-9]+) users?,\s+load averages?: ([0-9]+\.[0-9][0-9]),?\s+([0-9]+\.[0-9][0-9]),?\s+([0-9]+\.[0-9][0-9])')
        duration, users, av1, av5, av15 = child.match.groups()
            days = '0'
            hours = '0'
            mins = '0'
            if 'day' in duration:
                child.match = re.search('([0-9]+)\s+day',duration)
                days = str(int(child.match.group(1)))
            if ':' in duration:
                child.match = re.search('([0-9]+):([0-9]+)',duration)
                hours = str(int(child.match.group(1)))
                mins = str(int(child.match.group(2)))
            if 'min' in duration:
                child.match = re.search('([0-9]+)\s+min',duration)
                mins = str(int(child.match.group(1)))
            print
            print 'Uptime: %s days, %s users, %s (1 min), %s (5 min), %s (15 min)' % (
                duration, users, av1, av5, av15)
            child.expect (COMMAND_PROMPT)
    
    # Run Current Date.
            child.sendline ('date')
            child.expect (COMMAND_PROMPT)
            print child.before
    
    # Run vmstat.
        #    child.sendline ('vmstat')
        #    child.expect (COMMAND_PROMPT)
        #    print child.before
    
    # Run free.
        #    if LINUX_MODE:
        #        child.sendline ('free') # Linux systems only.
        #        child.expect (COMMAND_PROMPT)
        #        print child.before
    
    # Run df.
        #    child.sendline ('df')
        #    child.expect (COMMAND_PROMPT)
        #    print child.before
    
    # Run lsof.
        #    child.sendline ('lsof')
        #    child.expect (COMMAND_PROMPT)
        #    print child.before
    
    # Run netstat
        #    child.sendline ('netstat')
        #    child.expect (COMMAND_PROMPT)
        #    print child.before
    
    # Run MySQL show status.
        #    child.sendline ('mysql -p -e "SHOW STATUS;"')
        #    child.expect (PASSWORD_PROMPT_MYSQL)
        #    child.sendline (password_mysql)
        #    child.expect (COMMAND_PROMPT)
        #    print
        #    print child.before
    
    # Now exit the remote host.
            child.sendline ('exit')
            index = child.expect([pexpect.EOF, "(?i)there are stopped jobs"])
            if index==1:
                child.sendline("exit")
                child.expect(EOF)
    
        if __name__ == "__main__":
    
            try:
                main()
            except Exception, e:
                print str(e)
                traceback.print_exc()
                os._exit(1)