.csvファイルからIPアドレスを取得し、Telnetデバイスを介して「バージョン表示」コマンド出力をキャプチャするスクリプトを作成しようとしています。
これまで私がコーディングした内容は次のとおりです。
#!/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
$ IPに保存されているIPにTelnetを介して接続し、「バージョン表示」出力を保存するためにforループを完了する必要があります。
私はこれを試しました:
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が利用できず、期待できないからですか?
それが理由だと思います。 (だから他の質問と違うと思います)
ベストアンサー1
#!/bin/bash
#!/usr/bin/expect -f
まあ..いいえ。
デフォルトでは、両方のプログラムがスクリプトを読み、各行に対して「正しい操作」を実行したいと思います。インタプリタ間でスクリプトを実行する同期の問題に加えて、両方の言語で有効なコマンドになる可能性がある行があれば、これはどうしても不可能であることが簡単にわかります。
あなたの例では、このようなことを検討してください。
set Username "user"
実際にはシェルとExpectスクリプトの両方で動作します。シェルは$1
位置パラメータとをそれぞれ$2
に設定します。それに割り当てられた他のものがあります。どちらをすべきですか?Username
user
expect
Expectスクリプトを複数のファイルに分割し、シェルスクリプトから呼び出すか、ExpectがTCLで実行されるという事実を活用してください。これにより、ループとIOを独自に実行できます。
幸い、この場合、2番目のコードブロックのシェルループにはExpectフラグメントのみが含まれています。
だからシェルスクリプトを作ってみてください。
#!/bin/bash
for i in `seq 2 $NUMERODISP`; do
IP="$(...)"
expect -f somename.expect $IP
done
そして、シェルスクリプトから呼び出される予想されるスクリプトは次のとおりです。
#!/usr/bin/expect -f
set IP [lindex $argv 0];
spawn telnet $IP
expect "Username:"
send "$Username\r"
...