2012-11-05 3 views
1

나는 로그인하고 호스트 이름 정보를 얻기 위해 pexpect.py 스크립트를 사용하고있다.
는 기본적으로 난 당신이 몇 가지 명령을 실행하고 닫으려면 자동화 된 사용자들은 아래에 볼이파이썬 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, 인수 = getopt.getopt을 (이 sys.argv에 [1] '시간 : U : P :', [ '?' '도움'])

가 가동 시간에 대한 -x를 추가하는 당신은 할 수 : optlist, 인수 = getopt.getopt (sys.argv에를 [ 1 :], 'h : u : p : x', [ 'help', '?'])

그런 다음 가동 시간을 확인하려면 li KE이 : ​​ 경우 옵션에서 '-x'다음 pexpect 프로젝트에서 pxssh.py 모듈을 사용하지 왜