2012-11-05 150 views
1

我正在使用pexpect.py脚本登录并获取主机名信息。
基本上我跑像这样Python Pexpect SSH命令行登录参数

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

您将在下面看到,它的自动运行一些命令,并关闭了。我希望能够在最后添加行,以便用户可以选择并选择他们希望看到的信息。因此,而不是上面的命令行的它看起来是这样的:

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

基本上与-x之中列表..说的正常运行时间和-z存在的ifconfig ..有也将是-A,-B,-C 。我迷路了,如何在代码中添加这些参数:

#!/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) 
+0

除非有一个简单的脚本,会做同样的 – user1719938

回答

1

在这一行,你有使用(粗体)的选项 optlist,ARGS = getopt.getopt(sys.argv中[1:] 'H:U:号码:',[ '?' '帮助',])

添加-x正常运行时间,你可以这样做: optlist,ARGS = getopt.getopt(sys.argv中[ 1:],'h:u:p:x',['help','?'])

然后在你做的正常运行时间检查部分,只是把它放在一个如果李柯本: 如果选择“-X”:

,并重复这一过程,每一个选项,不要忘记添加一些关于它的描述