Pexpect的python输出

时间:2018-09-26 14:05:41

标签: python pexpect

 def connect(user,host,keyfile,release):
    global Stop
    global Fails
    try:
            perm_denied = 'Permission denied'
            ssh_newkey = 'Are you sure you want to continue'
            conn_closed = 'Connection closed by remote host'
            opt = ' -o PasswordAuthentication=no'
            connStr= 'ssh ' + user + '@' + host + ' -i ' +keyfile + opt
            child = pexpect.spawn(connStr)
           ret=child.expect([pexpect.TIMEOUT,perm_denied,ssh_newkey,conn_closed,'$','#'])
            print(child.before)
            if ret== 2:
                    print('[[-] Adding Host to !/.ssh/known_hosts')
                    child.sendline('yes')
            elif ret ==3:
                    print('[-] Connection Closed by Remote Host')
                    Fails += 1
            elif ret > 3:
                    print('[+] Success.' + str(keyfile)+ ' ' + str(ret))
                    Stop = True
    finally:
            if release:
                    connection_lock.release()**

请检查我上面的python代码。

执行时:

python3 brutekey-ssh.py -H 127.0.0.1 -u root -d dsa / 1024 /

[-] Testing keyfile dsa/1024/a31b082ec6434d65c2adf76862b9aca7-30343
[-] Testing keyfile dsa/1024/fb80119b7615bbeb96cb7d2f55b7533d-10375
b''
[+] Success.dsa/1024/1f09490e311786ec22ff32715ca106e9-1279 4
[*] Exiting:Key Found
b''
[+] Success.dsa/1024/b23696eee5b31ed916002d3ec2ddb5f6-18108 4
b''
[+] Success.dsa/1024/a31b082ec6434d65c2adf76862b9aca7-30343 4

我的问题如下:

  1. 即使权限被拒绝,它仍然与ret > 3匹配,为什么?

  2. 如何检查child.expect

  3. 的确切输出
  4. 我需要使用.*\$而不是$吗? $只匹配输出中的精确$吗?

1 个答案:

答案 0 :(得分:0)

1:即使权限被拒绝,它仍然与ret> 3为什么匹配?
回答:可能是因为perm_denied案例的输出包含bash字符之一('#','$'),所以打印child.before的值或采取手动步骤以确保在自动化之前发生了什么。如果不匹配并导致超时,则应返回0。并且它返回0而不是引发异常,因为您将pexpect.TIMEOUT添加到了列表中。

2:如何检查child.expect的确切输出?
ans:child.expect返回您传递给它的列表中的项目的索引(int)。因此,在您的情况下,您通过了[pexpect.TIMEOUT,perm_denied,ssh_newkey,conn_closed,'$','#'].expect将返回由后端正则表达式从左到右首先匹配的所有内容的索引。它的确切值在您的ret变量中。

3:是否需要使用。* \ $而不是$? '$'仅与输出中的确切$相匹配?
回答:是的,足以匹配bash提示。它们唯一可能会中断的情况是,您孩子的某些内容会打印出某个功能中的#字符。

pexpect有一个不错的documentation,请阅读此处的示例,内容应足够丰富。