Python服务运维之远程连接模块pexpect使用大全

前言

这几年一直在it行业里摸爬滚打,一路走来,不少总结了一些python行业里的高频面试,看到大部分初入行的新鲜血液,还在为各样的面试题答案或收录有各种困难问题

于是乎,我自己开发了一款面试宝典,希望能帮到大家,也希望有更多的Python新人真正加入从事到这个行业里,让python火不只是停留在广告上。

微信小程序搜索:Python面试宝典

或可关注原创个人博客:https://lienze.tech

也可关注微信公众号,不定时发送各类有趣猎奇的技术文章:Python编程学习

Pexpect

linux下的expect是一个自动化交互套件,主要应用于执行命令和程序时,系统以交互形式要求输入指定字符串,实现交互通信

pexpect为linux下expect的Python封装,相比os.system(),他可以更好的将返回值处理并展示给我们

通过这个模块,我们可以进程服务器的远端SSH,FTP等连接,并且与服务器进行命令交互

pip3 install pexpect

Spwan类

spwan类是pexpect类的主要接口,使用这个类可以启动一个程序

并且会返回一个操作句柄,之后可以使用这个句柄对这个程序进行操作

child = Spwan():_init__(self, command, args=[], timeout=30, maxread=2000, searchwindowsize=None, logfile=None, cwd=None, env=None, ignore_sighup=False, echo=True, preexec_fn=None, encoding=None, codec_errors='strict', dimensions=None)
'''
command: 已知系统命令
args: 子程序的参数项,以列表代替
timeout: 等待结果的超时时间
maxread: 缓存设置,默认为2000,表示从命令输出中一次读取的最大字节数,设置为1表示关闭读缓存
searchwindowsize: 匹配缓冲区字符串的位置,默认从开始位置匹配,要注意的是,这里这个值在获取到大量返回结果的时候,如果合理设置,是可以极大的提高效率,因为默认情况下,每次缓存里面取得一个字符就会进行一次内容的正则匹配。
logfile: 文件对象,用于写入日志,如果想输出到标准输出,可以定义child.logfile = sys.stdout,spwan类不会转义任何特殊字符,如: | ,* 等字符,所以在使用的同时要加上shell来运行
'''

当Spwan开启了一个程序之后并获得返回句柄之后,我们就可以通过expect方法来等待指定的关键字了

如果返回0,那么表示匹配到了关键字

如果这里的关键字是一个列表,那么将返回在这个列表中匹配到的索引值。

child.expect(pattern, timeout=-1, searchwindowsize=-1)

如果匹配多个结果,那么将返回索引的最小值或是子程序输出的最先出现的元素

pexpect.EOF # 匹配终止信号,比如ssh连接终止,那么将匹配EOF信号
pexpect.TIMEOUT # 匹配超时信号,默认的超时设置是60s

Child实例方法

child.before保存了到匹配到关键字为止,缓存里面已有的所有数据。

也就是说如果缓存里缓存了 100 个字符的时候终于匹配到了关键字,那么 before 就是除了匹配到的关键字之外的所有字符

child.before

使用child.after保存匹配到的关键字,比如你在 expect 里面使用了正则表达式,那么表达式匹配到的所有字符都在 after 里面

child.after

使用child.match保存匹配到的正则表达式的实例,和上面的after相比一个是匹配到的字符串,一个是匹配到的正则表达式实例

child.match
  • 代码示例
import pexpect
import optparse
PROMPT = ['# ', '>>> ','> ', '\$ ']
def send_command(child, cmd): # 命令发送
    child.sendline(cmd)
    child.expect(PROMPT)
    print(child.before.decode())

def connect(user, host, password): # 连接方法
    newkey = 'Are you sure you want to continue connecting'
    connStr = 'ssh ' + user + '@' + host
    child = pexpect.spawn(connStr)
    ret = child.expect([pexpect.TIMEOUT, newkey, '[p|P]assword:'])
    if ret == 0:
        #pexpect.TIMEOUT
        print('[-] Time Out:',host)
        return
    if ret == 1:
        #newkey
        child.sendline('yes')
        ret = child.expect([pexpect.TIMEOUT, '[p|P]assword:'])
    if ret == 0:
        #pexpect.TIMEOUT
        print('[-] Time Out:',host)
        return
    #-> every thing is okay
    child.sendline(password)
    child.expect(PROMPT)
    return child

def main():
    parser = optparse.OptionParser()
    parser.add_option('-H',dest='host',type='string',help='host name')
    parser.add_option('-u',dest='user',type='string',help='user name')
    parser.add_option('-p',dest='passwd',type='string',help='user name')
    options,agrs = parser.parse_args()
    host = options.host
    user = options.user
    passwd = options.passwd
    child = connect(user,host,passwd)
    cmd = input('Shell you wanna Type:')
    send_command(child,cmd)
if __name__ == '__main__':
    main()

pxssh

pxssh是一个包含pexpect库的专用脚本

它能用预先编写好的login()、logout()、和prompt()等函数直接与SSH进行交互

比直接使用Spwan类方便多了

login(hostname, username, password) # 建立ssh连接与远程主机
logout() # 断开连接
prompt() # 匹配系统提示符
  • 代码示例
from pexpect import pxssh

def send_command(s, cmd):
    s.sendline(cmd)
    s.prompt()
    print(s.before.decode())

def connect(host, user, passwd):
    try:
        s = pxssh.pxssh()
        s.login(host,user,passwd)
        return s
    except:
        print('[-]Error Connection')
        return
def main():
    s = connect('192.168.0.112','root','toor')
    send_command(s,'cat /etc/shadow | grep root')

if __name__ == '__main__':
    main()
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李恩泽的技术博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值