2

pexpect.py スクリプトを使用してログインし、ホスト名情報を取得しています。
基本的に私はこのように実行します

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

以下で、いくつかのコマンドを実行して終了することが自動化されていることがわかります。ユーザーが見たい情報を選択できるように、最後に行を追加できるようにしたいと思います。したがって、上記のコマンド ラインの代わりに、次のようになります。

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

基本的に、-x が.. uptime で、-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)
4

2 に答える 2

1

この行には、使用するオプションがあります(太字) optlist, args = getopt.getopt(sys.argv[1:], ' h:u:p: ', ['help','?'])

アップタイムに -x を追加するには、次のようにします: optlist, args = getopt.getopt(sys.argv[1:], ' h:u:p:x ', ['help','?'])

次に、稼働時間チェックを行う部分で、次のように1つ下に置くだけです。オプションで「-x」の場合:

すべてのオプションに対してこれを繰り返し、説明を追加することを忘れないでください

于 2013-02-01T11:33:08.813 に答える
0

参考までに、pexpect プロジェクトの pxssh.py モジュールを使用してみませんか? ssh 自動化の一部を処理します。

于 2013-02-04T15:09:42.293 に答える