#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)
команде.