Ожидайте проверку на наличие строки или вообще не выводите - PullRequest
3 голосов
/ 12 марта 2019

Я предвосхищу это в первый раз, когда буду работать с Expect, и мне до сих пор это очень нравится! Как сделать, кроме учетной записи timeout, eof, и либо выходное сообщение, либо вообще никакого сообщения?

У меня есть ожидаемый скрипт, который запускается из скрипта bash. Ожидаемый сценарий используется исключительно для ssh на сервер и выполнения удаления пользователя. Если удаление не выполнено, появляется сообщение об ошибке $username does not exist, за которым следует новая пустая строка ввода. Однако, если действие выполнено успешно, сообщение не возвращается, и оно сразу же переходит на новую пустую строку ввода для выполнения следующего действия.

Я нашел аналогичный стековый пост о том, как работать с возможными выходными данными, хотя у меня возникают проблемы с реализацией решения, при котором выходной сигнал не возвращается. Вот фрагмент моей лучшей попытки:

send "userdel $userdel_username\r"

expect {
  timeout { send_user "timeout on deletion\n"; exit 1}
  eof { puts "received eof\n"; exit 1}
  -re "^.*(?=exist).*\$" { set userdel_fail 1;} # easy way to check for the error
  -re "\$.*" { set userdel_fail 0;}
}

if {$userdel_fail == 1} {
    send_user "$userdel_username does not exist"
} else {
    send_user "$userdel_username deleted successfully"
}

Это решение всегда попадает в последнюю строку ожидаемого блока, поскольку всегда будет ввод. Я попытался полностью исключить -re "\$.*" { set userdel_fail 0;}, но это приводит к тому, что каждое успешное удаление попадает в timeout. Если я опускаю регулярное выражение для проверки ошибки и ожидаю только ввода, я обнаруживаю, что $expect_out(buffer) возвращает пустое значение, что имеет смысл.

Полагаю, я не понимаю, как обойти это, чтобы справиться с этим конкретным случаем. У меня нет доступа для изменения обработки ошибок, в противном случае я чувствую, что хотел бы просто вернуть сообщение об успехе. Открыты для любых советов о том, как справиться с этой ситуацией или альтернативных подходов.

...