【问题标题】:python output of pexpectpexpect的python输出
【发布时间】:2024-07-31 06:05:02
【问题描述】:
 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. 我是否需要使用.*\$ 而不是$$ 是否只匹配输出中的确切 $

【问题讨论】:

  • 你在 perm_denied 中给出了什么字符串?
  • child.before这个语句后面加上printret = child.expect([pexpect.TIMEOUT,perm_denied,ssh_newkey,conn_closed,'$','#'])这样我们就可以知道问题的确切原因了。
  • Errr 你想做什么?如果您必须将密码/用户名传递给期望在命令行上输入这些输入的阻塞进程,则通常需要expect。但是,您正在使用密钥进行 ssh-ing,因此您不需要这样做...
  • 此外,通常从进程返回代码0 意味着在基于 Unix 的系统上成功。大于 3 的返回码可能意味着任何事情......但不是成功。
  • 期望不返回进程代码。它返回索引

标签: python pexpect


【解决方案1】:

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

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

3:我需要用.*\$ 代替$ 吗? '$' 是否只匹配输出中的确切 $?
ans: 是的,匹配 bash 提示符就足够了。它们可能会中断的唯一情况是当您的孩子从某个函数中打印出 # 字符时。

pexpect 有很好的documentation,阅读这里的例子应该很多。

【讨论】:

  • 我编辑我的原始帖子:添加 print(child.before) 并打印 ret 变量。甚至 child.before 是 '',ret 是 4.......
  • 我要检查ssh登录是否成功
  • 我手动测试的确切提示是:ssh root@127.0.0.1 -i dsa/1024/1f09490e311786ec22ff32715ca106e9-1279 -o PasswordAuthentication=no Permission denied (publickey,password)。