Использование pexpect для отправки второго пароля, но не работает?

#command-line #process #child-process #pexpect

Вопрос:

Я пытаюсь использовать pexpect его для отправки пароля. Он работает в первый раз, когда запрашивается пароль (at "azureuser@xx.xx.xx.xxx's password:" ), но не во второй раз (at "[sudo] password for azureuser:" ). Почему это так?

Мне нужно оставаться в виртуальной машине, в которую я вхожу, чтобы ввести пароль и выполнить команду. Должен ли я создать другой процесс?

 import pexpect

def access_azure_vm(blob_name, src, dest):
    child = pexpect.spawn(key.SSH_KEY)
    child.logfile = sys.stdout.buffer
    child.expect("azureuser@xx.xx.xx.xxx's password:")
    child.sendline(key.PASSKEY)
    child.expect("azureuser@vm")
    # Run sudo azcopy copy <src> <dest>
    child.sendline('sudo azcopy copy '   """   src   """   " "   """   dest   blob_name   """   " --recursive")
    child.expect("[sudo] password for azureuser:")
    child.sendline(key.PASSKEY)
    child.expect("azureuser@vm")
 

Ответ №1:

В child.expect(s) строке s есть шаблон регулярного выражения, поэтому [sudo] означает один символ из набора: s u d o. Это не будет совпадать. Вы можете либо удалить эту начальную часть из строки, либо использовать child.expect_exact(s) вместо нее.

Комментарии:

1. О, спасибо тебе! Такое простое решение, которое я упустил из виду. Я удалил [sudo] , и теперь это работает просто отлично, но спасибо, что рассказали мне и о .expect_exact(s) команде.