Attendre dans le script bash: expect_out pas l'impression de tampon
Je suis en train d'essayer de capturer la sortie de la commande "dir" en vous connectant à un interrupteur, mais je suis incapable de le faire. Je suis l'aide d'attendre à l'intérieur de bash. Je suis en train de l'utilisation de expect_out pour capturer la sortie de cette commande dans un tampon et de l'imprimer. En fait, je veux capturer la sortie et d'effectuer certaines opérations sur elle.
SCript:
#!/bin/bash
expect -c "
spawn telnet 1.1.1.1 2000
sleep 1
send \"\r\"
send \"\r\"
expect {
Prompt> { send \"dir\r\" }
}
set output $expect_out(buffer)
"
echo "$output"
De sortie:
spawn telnet 1.1.1.1 2000
Trying 1.1.1.1...
Connected to 1.1.1.1 (1.1.1.1).
Escape character is '^]'.
Prompt>
Prompt>
Après ces messages sont affichés, les scripts sorties seulement. Aide gentiment.
EDIT:
Je divise maintenant afin que je puisse utiliser le paramètre de substitution ainsi que des guillemets simples. Maintenant, je suis confronté à d'erreur différents.
Script:
expect -c "
spawn telnet $IP $PORT1
sleep 1
send \"\r\"
send \"\r\"
"
expect -c '
expect {
Prompt> { send \"dir\r\" }
set output $expect_out(buffer)
puts "$output"
}
'
De sortie:
spawn telnet 172.23.149.139 2033
can't read "expect_out(buffer)": no such variable
while executing
"expect {
Prompt> { send \"dir\r\" }
set output $expect_out(buffer)
puts "$output"
}
"
EDIT 2:
Bonjour Chris/tous,
J'ai changé en fonction de vos suggestions. Mais je suis toujours confronté à des erreurs.
Script:
output=$(expect -c '
spawn telnet '"$IP $PORT1"'
sleep 1
send '"\r"'
send '"\r"'
expect Prompt> { send '"dir\r"' }
expect '"\n"'
expect -indices Prompt>
puts '"[string range $expect_out(buffer) 0 [expr $expect_out(0,end) - 1]]"'
')
echo "======="
echo "$output"
echo "======="
De sortie:
syntax error in expression "(0,end) - 1"
while executing
"expr (0,end) - 1"
invoked from within
"string range (buffer) 0 [expr (0,end) - 1]"
invoked from within
"puts [string range (buffer) 0 [expr (0,end) - 1]]"
=======
spawn telnet 1.1.1.1 2000
Trying 1.1.1.1...
Connected to 1.1.1.1 (1.1.1.1).
Escape character is '^]'.
Prompt>
Prompt>
=======
Donc de contourner l'erreur, j'ai changé, la ligne
puts '"[string range $expect_out(buffer) 0 [expr $expect_out(0,end) - 1]]"'
à
puts '"$expect_out(buffer)"'
Mais alors je suis pas d'erreur, mais la sortie de la dir est aussi ne pas obtenir de l'imprimé. Quelque chose comme:
Prompt>
Prompt> (buffer)
OriginalL'auteur Pkp | 2011-04-08
Vous devez vous connecter pour publier un commentaire.
La seconde de votre “split” s'Attendre à des programmes n'ont pas accès à la donné naissance à telnet processus. Lorsque vous séparer comme ça, vous avez fait de leur indépendance (on ne peut pas accéder aux variables ou de l'état de l'autre; en fait, le temps que la seconde a commencé à l'autre, et son telnet processus, n'existent plus).
Le shell va automatiquement concaténer les chaînes (qui ne sont pas séparés par des sociétés non cotées/non échappés des espaces), sans égard à la nature de citations (le cas échéant) qu'ils utilisent. Cela signifie que vous pouvez commencer à mettre de la première partie de votre Attendons programme de guillemets simples, passer à des guillemets doubles pour le paramètre de substitution, et de retourner ensuite à des guillemets simples pour le reste du programme (pour éviter d'avoir à échapper à tout de
"$\`
qui se produisent dans votre s'Attendre code).Il utilise des guillemets simples pour protéger la plupart du programme, mais permet de revenir à des guillemets pour laisser la coquille de remplacer le son HÔTE et les paramètres IP dans le texte de l'Attendent programme.
Prochain, le shell qui a commencé attendre ne peut pas accéder à une variable définie à l'intérieur de l'Attendre du programme. La voie normale de recueillir de sortie à partir d'un processus enfant est celle de l'écriture sur stdout ou stderr et avoir le shell recueillir la sortie par l'intermédiaire d'une substitution de commande (
$()
).En Tcl (et Attendre), vous pouvez utiliser
puts
pour envoyer une chaîne de caractères sur la sortie standard stdout. Mais, par défaut, devraient également envoyer sur la sortie standard la normale “interaction” de sortie (ce qu'il reçoit de la part de toute engendré des commandes et de ce qu'il a envoyé à eux; c'est à dire ce que vous verriez si vous étiez donné naissance à l'exécution de la commande manuelle). Vous pouvez désactiver cette option de journalisation par défaut aveclog_user 0
.Vous pouvez écrire votre programme comme ceci:
Dans la mise à jour de votre code vous semblez avoir déplacé la dernière déclaration de guillemets simples et un double cité la section. Ma meilleure supposition quant à pourquoi vous essayé ce que vous avez pensé de la coque requis pour faire de la substitution pour
$expect_out(buffer)
. Cette expression est partie de la Attendent du programme. Le shell va pas faire quelque chose d'utile avec lui (il sera probablement juste étendre à(buffer)
dans le fait de s'Attendre du programme, qui sera juste est juste une chaîne littérale en Tcl). Y avait-il un problème qui vous a poussé à réécrire la dernière déclaration? J'ai testé ce que j'ai posté; il fonctionne pour moi comme je l'ai écrit.OriginalL'auteur Chris Johnsen
Parce que votre script expect est entouré de guillemets doubles, le shell est en pleine expansion
$expect_out
à une chaîne vide. Mettre le corps du script expect entre guillemets simples.Lorsque vous définissez une variable en attendre, le shell n'ai aucune idée. Quand le fait de s'attendre fin du script, c'est les variables disparaissent aussi. Vous devez
puts
la expect_out tampon.Vous pouvez, dans la coquille,
export
l'HÔTE et le PORT de variables. En attendent, se référer à eux comme$env(HOST)
et$env(PORT)
OriginalL'auteur glenn jackman