.csvファイルからIPアドレスを取得し、デバイスにtelnetで「showversion」コマンドの出力をキャッチするスクリプトをコーディングしようとしています。
これまでにコーディングしました:
#!/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に接続する必要があります「showversion」の出力を保存します。
これを試してみました:
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とexpectを使用できませんか?
それが理由である場合.. $ IPと$ NUMDISPを変数として別のexpectスクリプトに送信するにはどうすればよいですか?(これ他の質問とは違うと思うのはそのためです)
コメント
回答
#!/bin/bash #!/usr/bin/expect -f
うーん…いいえ。
基本的に、両方に必要です。スクリプトを読み、すべての行に関して「正しいことをする」プログラム。インタプリタ間でスクリプト実行を同期することの間の問題は別として、どちらの言語でも有効なコマンドである可能性のある行があると、これが不可能であることが簡単にわかります。
次のようなことを検討してください。あなたの例。
set Username "user"
実際にはシェルとexpectスクリプトの両方で有効です。シェルでは、位置パラメータ$1
と$2
をUsername
と
。 expect
では、別のものを割り当てます。どちらを実行する必要がありますか?
expectスクリプトを別のファイルに分割してシェルスクリプトから呼び出すか、ExpectがTCLで実行されるという事実を使用して、ループとIOを実行できるようにします。
幸いなことに、この場合、2番目のコードブロックのシェルループ内に含まれるexpectスニペットだけがあります。
したがって、シェルスクリプトを作成します
#!/bin/bash for i in `seq 2 $NUMERODISP`; do IP="$(...)" expect -f somename.expect $IP done
およびシェルスクリプトから呼び出すexpectスクリプト:
#!/usr/bin/expect -f set IP [lindex $argv 0]; spawn telnet $IP expect "Username:" send "$Username\r" ...
コメント
- @cesar、シェルスクリプト内にexpectスクリプトを配置する方法はありますが、引用符と変数に関しては常に問題があります。これが最もクリーンな方法です。
expect
は、 unix.stackexchange.com/questions/350338/