2013-04-25 80 views
5

我想寫一個期望腳本,將ssh放入服務器,發送sudo su,然後檢查iptables狀態並將輸出放在服務器上的日誌文件中。以下是腳本。期望腳本ssh返回無效的命令名

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 

但是,雖然在調試模式下運行,我得到這樣的錯誤;

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) 

不知道我哪裏出錯了。它說無效的命令名稱「sudo」,我想這是因爲期望沒有理解這些命令。如何繞過它。請幫忙。謝謝。

回答

11

的問題是在這條線

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

在Tcl中(並且因此在預期)的方括號是用於命令替換語法(如在殼反引號)。所以,你要麼需要逃避括號或使用預防各種擴展不同的報價:

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

這帶來了一個不同的問題:你希望看到這些精確的角色?因爲你指示期望把它當作一個正則表達式,並且正則表達式中的方括號表示一個字符類,所以它將匹配單個字符,'s','u','d'或'o 」。所以,你可能需要的是這樣的:

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

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

我已將sudo su期望更改爲「subhasish的密碼:」以及您如何提及,無論是否正在運行;使用更新後的代碼, #!/ usr/bin/expect -f #! /斌/慶典 設定超時60 LOG_USER 1個 組主機*。*。*。* 設置密碼****** 組用戶subhasish 集日誌文件output.txt的 產卵的ssh -p 10022 $用戶名@ $主機01​​期望 「* assword:*?」 送 - 「$密碼\ R」 LOG_USER 1 期望 「$」 發送 - 「須藤蘇\ R」 期望 「密碼subhasish:」 發送 - - 「$ password \ r」 expect「#」 send - 「service iptables status \ r」 log_file /home/subhasish/output.log expect「#」 log_file send - 「exit \ r」; send - 「exit \ r」; 退出0 – 2013-04-29 13:04:00

+0

手動日誌記錄看起來像這樣,[root @ localhost subhasish]#ssh -p 10022 [email protected]*.*.*.* [email protected]*.*.*.*的密碼: 上次登錄時間:週一Apr 29 07:19:52 2013 from *。*。*。* [subhasish @ testhost〜] $ sudo的蘇 [須藤]密碼subhasish: [根@ testhost subhasish]# – 2013-04-29 13:09:21

+0

調試腳本顯示了其被陷在期待: 期待:做「\ r \ n上次登錄:星期一4月29日07:35:36來自*。*。*。* \ r \ r \ n \ u001b] 0; subhasish @ testhost:〜\ u0007「(spawn_id exp4)匹配glob模式」密碼爲subhasish:「?沒有 [subhasish @ testhost〜] $ expect:是「\ r \ nLast login:Mon Apr 29 07:35:36 2013 from *。*。*。* \ r \ r \ n \ u001b] 0; subhasish @ testhost:〜\ u0007 \ u001b [?1034h [subhasish @ testhost〜] $「(spawn_id exp4)匹配glob模式」subhasish的密碼:「? no – 2013-04-29 13:13:22

3

感謝格倫,它的工作現在。還有一個原因,它不工作是它需要正常登錄和sudo的登錄之間睡覺,否則「命令蘇」正在$提示符返回之前發送,引用別人,這裏是代碼,

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

等待提示非常有幫助。 – phyatt 2016-12-23 16:39:48