.csvファイルからIPアドレスを取得し、デバイスにtelnetして「show version」コマンドの出力をキャッチするスクリプトをコーディングしようとしています。
これまでのところ私はこれをコーディングしました:
#!/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ループを完了する必要があるため、$ IPに保存されているIPにtelnetを介して接続し、「show version」出力を保存します。
私はこれで試しました:
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と$ NUMDISPを変数として別の期待スクリプトに送信するにはどうすればよいですか? (これが他の質問とは異なると思う理由です)
#!/bin/bash
#!/usr/bin/expect -f
うーん...いいえ。
基本的には、両方のプログラムでスクリプトを読み取り、すべての行について「正しいことを行う」必要があります。インタープリター間でスクリプトの実行を同期することの間の問題は別として、どちらの言語でも有効なコマンドである可能性がある行があると、これは不可能であることが簡単にわかります。
あなたの例でこのようなものを考えてください。
set Username "user"
実際には、シェルと期待スクリプトの両方で有効です。シェルでは、位置パラメータ$1
と$2
をそれぞれUsername
とuser
に設定します。 expect
では、他の何かを割り当てます。どっちがいい?
Expectスクリプトを別のファイルに分割してシェルスクリプトから呼び出すか、ExpectがTCLで実行されるという事実を使用します。これにより、ループとIO自体を実行できます。
幸いなことに、この場合、2番目のコードブロックのシェルループ内に含まれる期待スニペットのみがあります。
だから、シェルスクリプトを作る
#!/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"
...