2013-04-25 5 views
5

Ich versuche ein Expect-Skript zu schreiben, das ssh in einen Server schreiben würde, sudo su senden, dann den iptables-Status überprüfen und die Ausgabe in eine Protokolldatei auf dem Server schreiben. Unten ist das Skript.Skript erwarten ssh gibt ungültigen Befehlsnamen zurück

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 während im Debug-Modus laufen, bekomme ich Fehler wie folgt;

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, wo ich falsch liege. Es sagt ungültigen Befehlsnamen "sudo", ich denke, das ist, weil erwarten, nicht verstehen, diesen Befehl. Wie man es umgeht. Bitte helfen Sie. Vielen Dank.

Antwort

11

Das Problem ist in dieser Zeile

-re "[sudo] password for subhasish:" {send "$password\r"} 

In Tcl (und somit in erwarten) die eckigen Klammern sind die Syntax für den Befehl Substitution (wie Backticks in der Schale). So müssen Sie entweder die Klammern zu entkommen oder verschiedene Angebote nutzen, die verschiedene Erweiterungen verhindern:

-re {[sudo] password for subhasish:} {send "$password\r"} 

, die eine andere Frage bringt: erwarten Sie genau diese Zeichen zu sehen? Da Sie anweisen, das als regulären Ausdruck zu behandeln, und eckige Klammern in einem regulären Ausdruck eine Zeichenklasse, wird ein einzelnes Zeichen, entweder ein "s", "u", "d" oder "o" verwendet ". Also, was Sie wahrscheinlich benötigen, ist dieses:

-re {\[sudo\] password for subhasish:} {send "$password\r"} 

oder

-ex {[sudo] password for subhasish:} {send "$password\r"} 
+0

Ich habe das sudo su auf "password for subhasish:" geändert und auch wie du es erwähnt hast, es funktioniert auch nicht; Verwenden Sie den unten aufgeführten Code, #!/usr/bin/expect -f #!/Bin/bash eingestellten Timeout 60 log_user 1 Satz Host *. *. *. * set password ****** set user Subhasish Satz Logfile output.txt Laich ssh -p 10022 $ user @ $ host erwarten "* assword: *?" send - "$ password \ r" log_user 1 erwarten "$" send - "sudo su \ r" erwarten "Passwort für Subhasish:" send - - "$ password \ r" erwarten "#" senden - "service iptables status \ r" log_file /home/subhasish/output.log erwarten "#" log_file senden - "exit \ r"; senden - "exit \ r"; Exit 0 –

+0

Die manuelle Protokollierung sieht so aus, [root @ localhost subhasish] # ssh -p 10022 [email protected]*.*.*.* [email protected]*.*.*.* Passwort: Letzte Anmeldung: Mo Apr 29 07:19:52 2013 von *. *. *.* [Subhasish @ testhost ~] $ sudo su [sudo] Passwort für Subhasish: [root @ testhost Subhasish] # –

+0

Debug-Skript zeigt seine in erwarten stecken zu bleiben: erwarten: bedeutet „\ r \ nlast Login: Mo Apr 29 07:35:36 2013 von *. *. *. * \ R \ r \ n \ u001b] 0; subhasish @ testhost: ~ \ u0007 "(spawn_id exp4) match glob muster" passwort für subhasish: "? nein [subhasish @ testhost ~] $ erwarten: "\ r \ nLetzte Anmeldung: Mo Apr 29 07:35:36 2013 von *. *. *. * \ r \ r \ n \ u001b] 0; subhasish @ testhost: ~ \ u0007 \ u001b [? 1034h [subhasish @ testhost ~] $ "(spawn_id exp4) match glob muster" passwort für subhasish: "? no –

3

Dank Glenn, es funktioniert jetzt. Ein weiterer Grund, warum es nicht funktioniert war es zwischen normaler Login und sudo Login, sonst „sudo su“ gesendet wurde schlafen erfordert, bevor die $ prompt zurück, als Referenz für andere, hier ist der Code,

#!/usr/bin/expect -f 
#! /bin/bash 

set timeout 60 
log_user 1 
set host *.*.*.* 
set password ****** 
set user subhasish 
set logfile output.txt 
spawn ssh -p 10022 [email protected]$host 
expect "*?assword:*" 
send -- "$password\r" 
#log_user 1 
sleep 2 
expect "$" 
send -- "sudo su\r" 
expect -gl {*password for subhasish:*} 
send -- "$password\r" 
expect "#" 
send -- "service iptables status\r" 
log_file /home/subhasish/output.log 
expect "#" 
log_file 
send -- "exit\r"; 
send -- "exit\r"; 
exit 0 
+0

Warten auf die Eingabeaufforderung war sehr hilfreich. – phyatt

Verwandte Themen