/ / TCL / Expect - Después de Interact, expect_user no hace eco - ssh, tcl, espera

TCL / Expect - Después de Interact, expect_user no hace eco - ssh, tcl, espera

Así que tengo un script simple que inicia sesión en unDispositivo de red, y luego interactúa permitiendo a los usuarios llamar a varias macros. Tengo un ejemplo a continuación: el usuario está en el dispositivo, pulsa "! P" y luego el script quiere que el usuario ingrese un comando.

todo funciona bien, excepto que el programa no hace eco de lo que escribe el usuario, por lo que es imposible para ellos corregir los tipos de error.

La solución que tengo actualmente es stty echo antes de expect_user y stty -echo después. Pero en esta solución, los espacios en blanco y las pulsaciones de las teclas de flecha se capturan para que el usuario aún no pueda corregir su error.

No estoy exactamente seguro de cómo solucionar este problema, pero supongo que lo que está ocurriendo es que el programa generado tiene el control de STDOUT, de modo que cuando se llama a expect_user, está en segundo plano.

set hostname 10.0.0.1
set password 1234qwer

spawn ssh -o StrictHostKeyChecking=no $hostname
expect {
"assword:" {
send "$passwordr"
expect "#"
}
}
interact {
"!p" {
send_user "nInput command: "
expect_user -re "(.*)r" {
puts "n$expect_out(1,string)"
}
}
}

Respuestas

1 para la respuesta № 1

En su forma más simple, el interact comando establece una conexión entre el usuario y el proceso generado actualmente. los el terminal del usuario se pone en modo crudo Para que la conexión sea transparente.

Modo crudo es un tipo específico de orientado al carácter Modo, donde no se aplican interpretaciones especiales a los caracteres de entrada. Por ejemplo, Ctrl-C ya no sirve como una interrupción, y Ctrl-D ya no actúa como una interrupción. eof. Lo contrario a modo crudo es modo cocido. Representa la forma más común de orientado a líneas modos

Por lo tanto, para lograr lo que desea, debe poner el terminal en modo cocinado antes de solicitar la entrada del usuario.

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

Dado que el terminal está en modo raw para interactuar, no se hará eco de los caracteres, como ya se habrá notado. Es decir, cuando escribe !p, no lo verás en absoluto. Hay una opción disponible para hacer que se repita. -echo bandera con interact Hará ese trabajo.

Por ejemplo, interact -echo "Hello" {puts " World"} hará eco Hello , mientras el usuario lo escribe. Esto también se puede agregar a su script.

Agregando todos estos aspectos, el código finalizado se puede escribir de la siguiente manera,

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.
}
}