Bash
bash 和期望在同一個腳本中?
我正在嘗試編寫一個腳本,該腳本從 .csv 文件中獲取 IP 地址並遠端登錄設備以擷取“顯示版本”命令輸出。
到目前為止,我已經對此進行了編碼:
#!/bin/bash #!/usr/bin/expect -f FILE1=dispositivos.csv #file with IP's and device name set Username "user" #this is the user for telnet connection. set Password "this.is.the.pass" #pass for telnet connection. NUMERODISP="$(wc -l $FILE1 | awk '{print $1}')" #this command counts number of devices (IP's) in the file as it is a .csv file, it only counts number of lines. for i in `seq 2 $NUMERODISP`; do IP="$(awk -vnum="$i" 'NR == num { print $NF }' dispositivoss.csv)" echo "$IP" #this takes the IP from last column from .csv file done
我需要完成 for 循環,以便它通過 telnet 連接到儲存在 $IP 中的 IP 並保存“顯示版本”輸出。
我試過這個:
for i in `seq 2 $NUMERODISP`; do IP="$(awk -vnum="$i" 'NR == num { print $NF }' dispositivoss.csv)" send "telnet $IP\r" expect "Username:" send "$Username\r" expect "Password: " send "$Password\r" expect "*>" send "show version\r" log_file -noappend SN_$IP.dat; expect -ex "--More--" {send -- " "; exp_continue} expect "*>" log_file; done
但它沒有用。
這是因為我不能使用 bash 並期待嗎?
如果這是原因..我該如何發送 $ IP and $ NUMDISP 作為變數放入不同的期望腳本?(這就是為什麼我認為它與其他問題不同)
#!/bin/bash #!/usr/bin/expect -f
嗯……不。
基本上,您希望這兩個程序都閱讀您的腳本,並對每一行“做正確的事情”。除了在解釋器之間同步腳本執行之間的問題之外,很容易看出這是不可能的,因為我們有一行可以是任何一種語言的有效命令。
在你的例子中考慮這樣的事情。
set Username "user"
它實際上在 shell 和期望腳本中都有效。在 shell 中,它分別設置位置參數
$1
和$2
到Username
和user
。在expect
它分配別的東西。應該做哪一個?要麼將你的期望腳本拆分到一個不同的文件並從 shell 腳本中呼叫它,要麼使用期望在 TCL 上執行的事實,這應該允許在其本身進行循環和 IO。
幸運的是,在這種情況下,您的第二個程式碼塊中的 shell 循環中只包含一個期望片段。
所以,製作一個shell腳本
#!/bin/bash for i in `seq 2 $NUMERODISP`; do IP="$(...)" expect -f somename.expect $IP done
以及從 shell 腳本呼叫的期望腳本:
#!/usr/bin/expect -f set IP [lindex $argv 0]; spawn telnet $IP expect "Username:" send "$Username\r" ...