verwenden Sie erwarten, dass spawn Befehl mit Argumenten, die Leerzeichen enthalten
Möchte ich expect
zum ausführen eines einfachen Befehl cat /tmp/id_rsa.pub
über ssh.
In einer shell, ich kann laufen, wo diese problem (mit manuell in das Passwort)
ssh root@localhost 'cat /tmp/id_rsa.pub'
Möchte ich den Vorgang automatisieren, mit expect
. Meine expect
Skript ist,
#!/usr/bin/expect
eval spawn ssh root@localhost 'cat /tmp/id_rsa.pub'
expect "password:"
send "123456"
expect eof
Wirft er Fehler bash: cat /tmp/id_rsa.pub: no such file or directory
. es sieht sehr seltsam zu mir. Was könnte die mögliche Ursache?
Edit: nach einigen Tests, ich finde, das ist üblich, nicht nur im Fall von cat
. Wenn das argument hervorgebracht Befehl wird mit Leerzeichen (auch wenn es in Anführungszeichen), wird es schwer haben. Ersetzen Sie beispielsweise cat /tmp/id_rsa.pub
mit anderen Kommandos mit Leerzeichen, wie
eval spawn ssh root@localhost 'which java'
beschwert es sich mit bash: which java: command not found
. Aber wenn austauschen, die mit pwd
wie
eval spawn ssh root@localhost 'pwd'
es funktionieren.
- Haben Sie versucht, entfernen Sie die Anführungszeichen um 'command-argument'? Es scheint, dass die Wurzel des Problems ist, versucht er zu interpretieren ist die gesamte Zeichenfolge in Anführungszeichen als name des Befehls, sondern als Aufteilung in Befehl und Argumente...
- das ist die Arbeit. Ich habe auch versucht, die doppelten Anführungsstriche, wo/ problem. Nur aus Neugier, kann u erklären, ein bisschen was ist das Besondere an single-quotes?
- Ich hätte zu Graben, die
expect
docs, um zu sehen, was es sagt - weiß nicht, aus der Spitze von meinem Kopf. Ich schlug vor, dass, basierend auf der syntax der jeweiligen Fehlermeldung, die Sie immer waren...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einfache Anführungszeichen (
'
) haben keine spezielle Bedeutung zu Erwarten, im Gegensatz zu sh und anderen kompatiblen shells.Dies bedeutet, dass Ihr statment
analysiert wird, in den folgenden Worten:
spawn
ssh
root@localhost
'cat
- nicht, bis der andere single quote./tmp/id_rsa.pub'
Den Einsatz in sh ist die Gruppe, diese zu einem einzigen argument. In Tcl kann man entweder doppelte Anführungszeichen verwenden (
"
) oder geschweifte Klammern ({}
). Innerhalb von doppelten Anführungszeichen, Tcl-Variablen ersetzt werden, während die Inhalte in{}
ist vergangen ohne substitution1.tl;dr Die Expect/Tcl äquivalent von sh ist
'
sind{}
.1 Eine
\
bevor ein Zeilenumbruch wird immer noch ersetzten.Als Johannes sagte, mit
'
funktioniert nicht.Ich hatte ein ähnliches problem, aber ich wollte zum ausführen mehrere Befehle, und dann noch eine login-shell. Ich schaffte es mit
"
:Ich denke, dass Sie Sie nicht benötigen
eval
es. Entfernen Sie es und überprüfen.Überprüfen Sie diese erwarten Beispiele link ausführliche Beispiele zum Thema "wie verwenden Sie
expect
?" .Hoffe, das hilft.
eval
, aber ohne Erfolg.