Итак, у меня есть простой скрипт, который входит в сетевое устройство, а затем взаимодействует, позволяя пользователям вызывать различные макросы. У меня есть пример ниже: пользователь находится на устройстве, попадает «! P», а затем сценарий хочет, чтобы пользователь вводил команду.TCL/Expect - После Interact, expect_user не отвечает
все работает нормально, за исключением того, что программа не повторяет то, что пользователь вводит, поэтому для них невозможно исправить ошибки.
Решение, которое у меня есть, составляет stty echo
до expect_user
и stty -echo
после. Но в этом решении захватываются обратные пространства и клавиши со стрелочными клавишами, поэтому пользователь все еще не может исправить свои ошибки.
Я не совсем уверен, как это исправить, но то, что, как я полагаю, происходит, - это порожденная программа, управляющая STDOUT, поэтому, когда вызывается функция expect_user, она находится в фоновом режиме.
set hostname 10.0.0.1
set password 1234qwer
spawn ssh -o StrictHostKeyChecking=no $hostname
expect {
"assword:" {
send "$password\r"
expect "#"
}
}
interact {
"!p" {
send_user "\nInput command: "
expect_user -re "(.*)\r" {
puts "\n$expect_out(1,string)"
}
}
}
Еще раз спасибо за ответы на все мои вопросы. достаточно интересно, я попробовал «stty cooked», но не «stty cooked echo». на боковой ноте, есть ли какая-либо польза от использования 'expect_user' vs' set var [получает stdin] ' – genx1mx6
@ genx1mx6: я пропустил ваш комментарий к этому другому вопросу. Возможно, на это мог бы ответить. Кстати, когда дело доходит до 'ожидать', всегда лучше использовать' expect_user'. Взгляните на ответ г-на Донала Феллоуза [this] (http://stackoverflow.com/a/10390474). – Dinesh