2013-04-25 14 views
5

Próbuję napisać skrypt, który będzie ssh do serwera, wysłać sudo su, a następnie sprawdzić stan iptables i umieścić dane wyjściowe w pliku dziennika na serwerze. Poniżej znajduje się skrypt.oczekiwać skryptu do ssh zwraca niepoprawną nazwę polecenia

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 

Ale podczas uruchamiania w trybie debugowania otrzymuję komunikat o błędzie;

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) 

Nie jestem pewien, dokąd zmierzam. Mówi nieprawidłowa nazwa polecenia "sudo", myślę, że to dlatego, że nie rozumiem tych poleceń. Jak obejść to. Proszę pomóż. Dzięki.

Odpowiedz

11

problem jest w tym wierszu

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

W TCL (a zatem oczekiwać) nawiasy kwadratowe są składnia podstawienia polecenia (np backticks w powłoce). Więc albo trzeba uciec nawiasy lub użyj różne cytaty, które uniemożliwiają różne ekspansje:

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

To sprowadza się inny problem: Czekasz, aby zobaczyć te dokładne znaki? Ponieważ instruujesz, że chcesz traktować to jako wyrażenie regularne, a nawiasy kwadratowe w wyrażeniu regularnym oznaczają klasę znaków, więc dopasuje ona pojedynczy znak, albo "s", "u", "d", albo "o" ". Więc co prawdopodobnie trzeba to:

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

lub

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

Zmieniłem sudo su, spodziewając się "hasła do subhasish:" oraz tego, o czym wspomniałeś, ani przypadkiem, że działa; używając zaktualizowanego poniższego kodu, #!/usr/bin/expect -f #!/Bin/bash zestaw limit czasu 60 log_user 1 zestaw hosta *. *. *. * zestaw hasło ****** zestaw subhasish użytkownik zestaw logfile output.txt tarło ssh -p 10022 $ user @ $ host oczekiwać "assword *: *" wyślij - "$ hasło \ r" log_user 1 oczekiwać "$" Wyślij - "sudo su \ r" oczekiwać "hasło subhasish:" wyślij - - "$ password \ r" oczekiwać "#" send - "stan usługi iptables \ r" plik_logowania /home/subhasish/output.log oczekiwać "#" log_file send - "exit \ r"; send - "exit \ r"; exit 0 –

+0

Ręczne logowanie wygląda następująco, [root @ localhost subhasish] # ssh -p 10022 [email protected]*.*.*.* [email protected]*.*.*.* haslo: Ostatnie logowanie: poniedziałek 29 kwietnia 07:19:52 2013 od *. *. *.* [subhasish @ testhost ~] $ sudo su [sudo] password dla subhasish: [root @ testhost subhasish] # –

+0

skrypt debug pokazuje jej utknięcie w spodziewać: spodziewać: czy „\ r \ nostatnia logowanie: Mon 29 kwietnia 07:35:36 2013 od *. *. *. * \ R \ r \ n \ u001b] 0; subhasish @ testhost: ~ \ u0007 "(spawn_id exp4) pasuje do wzorca globu" hasło do subhasish: "? no [subhasish @ testhost ~] $ oczekiwać: robi "\ r \ nNiski login: pon. 29 kwietnia 07:35:36 2013 od *. *. *. * \ r \ r \ n \ u001b] 0; subhasish @ testhost: ~ \ u0007 \ u001b [? 1034h [subhasish @ testhost ~] $ "(spawn_id exp4) pasuje do wzorca globalnego" hasło dla subhasish: "? no –

3

Dzięki Glenn, że to działa teraz. Jeszcze jeden powód, dlaczego to nie działa to wymaga spać między normalnym login i sudo logowania, w przeciwnym razie „sudo su” były wysłane przed powrócił zachęty $, odsyłające do innych, tutaj jest kod,

#!/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

Czekanie na prompt było bardzo pomocne. – phyatt

Powiązane problemy