gpt4 book ai didi

python - Python Pexpect SSH命令行登录参数

转载 作者:行者123 更新时间:2023-12-02 14:05:02 24 4
gpt4 key购买 nike

我正在使用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是..表示正常运行时间,而-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)

最佳答案

在此行中,您具有使用的选项(粗体)
optlist,args = getopt.getopt(sys.argv [1:],' h:u:p:',['help','?'])

为运行时间添加-x,您可以执行以下操作:
optlist,args = getopt.getopt(sys.argv [1:],' h:u:p:x ',['help','?'])

然后在部分中进行正常运行时间检查,只是将其放在下面,如果是这样的话:
如果选项中为“-x”:

并针对每个选项重复此操作,不要忘记在其上添加一些说明

关于python - Python Pexpect SSH命令行登录参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13231717/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com