2015-10-28 63 views
1

我有以下腳本,應該從文件device-list.txt中提取IP地址,然後telnet到設備,登錄並執行show run。腳本成功登錄到設備,但在此之後給我一個錯誤。任何想法,我會出錯?期望telnet到多個思科設備並執行show run

for device in `cat device-list.txt`; do ./test4 $device;done 

cat test4 
#!/usr/bin/expect -f 


set hostname [lindex $argv 0] 

set user myusername 

set pass mypassword 

set timeout 10 


log_file -a ~/results.log 


send_user "\n" 

send_user ">>>>> Working on $hostname @ [exec date] <<<<<\n" 

send_user "\n" 


spawn telnet $hostname 

expect "Username:" 

send "$user\n" 

expect "Password:" 

send "$pass\n" 

expect "#" 

send 「term len 0\n」 

send 「show running-config\n」 

expect 「end\r」 

send 「\n」 

send 「exit\n」 

User Access Verification 

Username: myusername 
Password: 

ROUTER#usage: send [args] string 

    while executing 

"send 「term len 0\n」" 

    (file "./test4" line 26) 

回答

0

你的問題是由於雙引號不正確。你必須使用雙引號",而不是智能引號

send 「term len 0\n」 ; # Wrong 
send "term len 0\r"; # Correct 

注:

基本上,Expect將有兩個可行的命令,如sendexpect工作。如果使用send,則必須在expect之後(大部分情況下)。 (反之亦然,不一定是強制性的)

這是因爲如果沒有這個,我們將錯過在產生的過程中發生的事情,因爲Expect會假設您只需發送一個字符串值而不是期待會議中的其他東西。

因此,我們建議在每個send之後使用expect,以確保我們的命令實際發送到派生進程。 (在發送諸如term len 0\r之類的命令後,您還沒有使用過expect)。此外,請使用\r而不是\n

+0

謝謝Dinesh!我不知道那些大括號如何到達那裏。我還有一個關於劇本的問題。我將如何配置,以便我必須在腳本運行時手動輸入用戶名和密碼,而不是將它們保存在實際腳本中? – JulianP

+0

使用'interact'。看看[這裏](http://linux.die.net/man/1/expect) – Dinesh