同じスクリプトでbashと期待しますか?


9

.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を変数として別の期待スクリプトに送信するにはどうすればよいですか?(これが他の質問とは異なると思う理由です)


2
言語を混在させないでください。unix.stackexchange.comexpect
questions /


@thrig OPは、この質問をしたばかりなので、明らかにそれはだまされているとは感じません。
terdon

私は両方の質問をしましたが、これは他の質問とは少し違うと思います。
Cesar Alejandro Villegas Yepez 2017年

回答:


13
#!/bin/bash
#!/usr/bin/expect -f

うーん...いいえ。

基本的には、両方のプログラムでスクリプトを読み取り、すべての行について「正しいことを行う」必要があります。インタープリター間でスクリプトの実行を同期することの間の問題は別として、どちらの言語でも有効なコマンドである可能性がある行があると、これは不可能であることが簡単にわかります。

あなたの例でこのようなものを考えてください。

set Username "user" 

実際には、シェルとexpectスクリプトの両方で有効です。シェルには、位置パラメータを設定する$1$2するUsernameuser、それぞれ、。その中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"
...

1
@cesar、シェルスクリプト内にexpectスクリプトを配置する方法はありますが、引用と変数の周りには常に頭痛の種があります。これが最もクリーンな方法です。
グレン・ジャックマン2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.