erwarten Skript ssh gibt Ungültiger Befehl name
Ich bin versucht zu schreiben, eine expect-Skript, das würde ssh in einen server senden, sudo su, dann überprüfen Sie das iptables status und speichern Sie die Ausgabe in eine log-Datei auf dem server. Unten ist das script.
1 #!/usr/bin/expect
2 exp_internal 1
3 log_user 0
4 set timeout 10
5 set password "******"
6
7 spawn /usr/bin/ssh -l subhasish *.*.*.* -p 10022
8
9 expect {
10 -re "password: " {send "$password\r"}
11 -re "$ " {send "sudo su\r"}
12 -re "[sudo] password for subhasish:" {send "$password\r"}
13 -re "# " {send "service iptables status\r"}
14 }
15 set output $expect_out(buffer)
16 send "exit\r"
17 puts "$output\r\n" >> output.log
Aber beim ausführen im debug-Modus erhalte ich die Fehlermeldung wie diese;
expect -d testcase
expect version 5.44.1.15
argv[0] = expect argv[1] = -d argv[2] = testcase
set argc 0
set argv0 "testcase"
set argv ""
executing commands from command file testcase
parent: waiting for sync byte
parent: telling child to go ahead
parent: now unsynchronized from child
spawn: returns {24105}
invalid command name "sudo"
while executing
"sudo"
invoked from within
"expect {
-re "password: " {send "$password\r"}
-re "$ " {send "sudo su\r"}
-re "[sudo] password for subhasish:" {send "$password\r"}
..."
(file "testcase" line 9)
Nicht sicher, wohin ich gehe falsch. Es sagt ungültige Namen für den Befehl ein "sudo", ich denke, das ist, weil die erwarten, dass doesn;t verstehen diesen Befehl. Wie gehen Sie um ihn herum. Bitte helfen Sie. Danke.
InformationsquelleAutor Subhasish Chatterjee | 2013-04-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das problem ist in dieser Zeile
In Tcl (und damit rechnen) die eckigen Klammern werden die syntax für den Befehl substitution (wie backticks in der shell). So müssen Sie entweder zu entkommen, die Klammern oder andere Zitate, die verhindern, dass verschiedene Erweiterungen:
Die bis bringt eine andere Frage: erwarten Sie, um zu sehen, die genau diese Zeichen? Denn Sie weisen erwarten zu behandeln, als einen regulären Ausdruck, und eckige Klammern in einem regulären Ausdruck bedeutet, dass ein Charakter-Klasse, so wird es mit einem einzelnen Zeichen, entweder mit einem 's', 'u', 'd' oder 'o'. Also, was Sie wahrscheinlich brauchen, ist diese:
oder
die manuelle Protokollierung die so aussieht: [root@localhost subhasish]# ssh -p 10022 subhasish@*.*.*.* subhasish@*.*.*.*'s password: Last login: Mon Apr 29 07:19:52 2013 from ..*.* [subhasish@testhost ~]$ sudo su [sudo] Passwort für subhasish: [root@testhost subhasish]#
debug-Skript zeigt, stecken in erwarten: erwarten: "\r\nLast login: Mon Apr 29 07:35:36 2013 from ..*.*\r\n\r\u001b]0;subhasish@testhost:~\u0007" (spawn_id exp4) Spiel glob-Muster "Passwort für subhasish:"? Nein [subhasish@testhost ~]$ erwarten: "\r\nLast login: Mon Apr 29 07:35:36 2013 from ..*.*\r\n\r\u001b]0;subhasish@testhost:~\u0007\u001b[?1034h[subhasish@testhost ~]$ " (spawn_id exp4) Spiel glob-Muster "Passwort für subhasish:"? keine
Glob-Muster müssen entsprechend der ganzen Zeichenfolge, so dass Sie führende und nachfolgende Platzhalter:
expect -gl {*password for subhasish:*}
., Auch diese Zeichenfolgen nicht übereinstimmen, da die Worte "Passwort für" nicht angezeigt.InformationsquelleAutor glenn jackman
Danke Glenn, es funktioniert jetzt. Ein Grund mehr, warum es nicht funktionierte war es erforderlich, zu schlafen zwischen normalen login und sudo login, sonst "sudo su" gesendet wurden, bevor die $ prompt zurückgegeben, für den Verweis auf andere, hier ist der code,
InformationsquelleAutor Subhasish Chatterjee