python pexpect ssh_Python Pexpect SSH命令行登录参数

我正在使用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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值