/ / TCL / Expect - Après Interact, expect_user ne résonne pas - ssh, tcl, expect

TCL / Expect - Après Interact, expect_user ne résonne pas - ssh, tcl, expect

J'ai donc un script simple qui se connecte à unpériphérique réseau, puis interagit pour permettre aux utilisateurs d’appeler différentes macros. J'ai un exemple ci-dessous - l'utilisateur est dans l'appareil, clique sur "! P", puis le script demande à l'utilisateur de saisir une commande.

tout fonctionne bien, sauf que le programme ne fait pas écho à ce que l'utilisateur tape, il est donc impossible pour eux de corriger les erreurs de frappe.

La solution que j'ai actuellement est stty echo avant expect_user et stty -echo après. Mais dans cette solution, les backspaces et les touches fléchées sont capturés, de sorte que l'utilisateur ne peut toujours pas corriger leur type d'erreur.

Je ne sais pas exactement comment résoudre ce problème, mais ce que je suppose, c’est que le programme créé a le contrôle de STDOUT. Ainsi, lorsque expect_user est appelé, c’est en arrière-plan.

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)"
}
}
}

Réponses:

1 pour la réponse № 1

Dans sa forme la plus simple, le interact Cette commande établit une connexion entre l’utilisateur et le processus en cours d’apparition. le le terminal de l'utilisateur est mis en mode brut afin que la connexion soit transparente.

Mode brut est un type spécifique de axé sur le caractère mode, où aucune interprétation spéciale n'est appliquée aux caractères saisis. Par exemple, Ctrl-C ne sert plus d'interruption et Ctrl-D n'agit plus comme une interruption. eof. L'opposé de mode brut est mode cuit. Il représente la forme la plus courante de orienté ligne modes.

Donc, pour obtenir ce que vous voulez, vous devez mettre le terminal en mode cuit avant d'inviter l'utilisateur à entrer.

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

Étant donné que le terminal est en mode brut d’interaction, il ne fera pas écho aux caractères que vous avez peut-être déjà remarqués. !p, vous ne le verrez pas du tout. Il existe une option pour le faire résonner. -echo drapeau avec interact va faire ce travail.

Par exemple, interact -echo "Hello" {puts " World"} fera écho Hello , pendant que l'utilisateur le tape. Cela peut également être ajouté à votre script.

En ajoutant tous ces aspects, le code finalisé peut être écrit comme suit,

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