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 № 1Dans 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.
}
}