Я предвосхищу это в первый раз, когда буду работать с 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)
возвращает пустое значение, что имеет смысл.
Полагаю, я не понимаю, как обойти это, чтобы справиться с этим конкретным случаем. У меня нет доступа для изменения обработки ошибок, в противном случае я чувствую, что хотел бы просто вернуть сообщение об успехе. Открыты для любых советов о том, как справиться с этой ситуацией или альтернативных подходов.