2015-05-07 1 views
0

Итак, у меня есть простой скрипт, который входит в сетевое устройство, а затем взаимодействует, позволяя пользователям вызывать различные макросы. У меня есть пример ниже: пользователь находится на устройстве, попадает «! 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)" 
       } 
     } 
} 

ответ

1

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

Сырье Режим представляет собой специфический тип символов-ориентированный режим, где никакие специальные интерпретации не применяются для ввода символов. Например, Ctrl-C больше не служит прерыванием, а Ctrl-D больше не действует как eof. Противоположность необработанный режим is приготовленный режим. Он представляет собой наиболее распространенную форму линейно ориентированных режимов.

Итак, чтобы достичь того, чего вы хотите, вы должны положить терминал в приготовленный режим, прежде чем запрашивать ввод от пользователя.

stty -raw echo; # Put the terminal to cooked mode, echo is enabled. 
stty raw -echo; # Put the terminal to raw mode, echo is disabled. 

Поскольку терминал находится в нестандартном режиме для взаимодействуют между собой, это не эхо символов в все, что вы, возможно, уже заметили. то есть, когда вы вводите !p, вы не увидите этого вообще. Существует опция, позволяющая сделать ее эхом. -echo флаг с interact будет выполнять эту работу.

Например, interact -echo "Hello" {puts " World"} будет отображать Hello, пока пользователь печатает его. Это также можно добавить к вашему скрипту.

Добавление всех этих аспектов, доработанный код можно записать следующим образом,

interact { 
     -echo "!p" { 
       send_user "\nInput command: " 
       stty -raw echo; # Enabling cooked mode 
       expect_user -re "(.*)\n" { 
         set input $expect_out(1,string) 
         puts "You have typed : $input" 
         # Process the user input as per your idea 
       } 
       stty raw -echo; # Enabling raw mode again. 
      } 
} 
+0

Еще раз спасибо за ответы на все мои вопросы. достаточно интересно, я попробовал «stty cooked», но не «stty cooked echo». на боковой ноте, есть ли какая-либо польза от использования 'expect_user' vs' set var [получает stdin] ' – genx1mx6

+0

@ genx1mx6: я пропустил ваш комментарий к этому другому вопросу. Возможно, на это мог бы ответить. Кстати, когда дело доходит до 'ожидать', всегда лучше использовать' expect_user'. Взгляните на ответ г-на Донала Феллоуза [this] (http://stackoverflow.com/a/10390474). – Dinesh

Смежные вопросы