ファイルから読み込み、そのモードを配列に変更しますか?

ファイルから読み込み、そのモードを配列に変更しますか?

次のエントリを含むCSVファイルがあります。

ipaddress,VLAN,VLANid
10.192.168.1,vlan-xyz,3
10.192.168.1,vlan-abc,8
10.192.168.1,vlan-mnp,11
10.192.163.24,vlan-llz,3
10.192.163.24,vlan-bbz,5
10.192.163.24,vlan-xggz,23

ちょっと待ってください。リモートCiscoスイッチで次のいくつかのCiscoコマンドを実行する必要があります。

今私がこれをするなら

while read ipaddress vlan vlanid
ssh user@ipaddress << 'ENDSSH'
int VLAN vlan-xyz
switchport access vlan  vlanid
wr
ENDSSH 
done < inputfile

毎回 ssh を実行し、同じ IP アドレスに対してもファイル内のすべての行のパスワードを入力するように求められます。この問題を克服する方法はありますか?単一のIPアドレスと同様に、ファイル内の他の2つの列を配列に入れようとします。

eg for IP:10.192.168.1
array="
int VLAN vlan-xyz
switchport access vlan  3
wr
int VLAN vlan-abc
switchport access vlan  8
"
for next ip ......

など。

次のようにIPアレイをコマンドに渡すことができるようにするにはどうすればよいですか?

while read ipaddress
ssh user@ipaddress " $array"
done < inputfile

ただし、whileループで同様のIPアドレスを取得した場合は、SSHで接続しないでください。新しいIPアドレスを見つけた場合にのみ接続する必要があります。

使っていますsshを使用して非対話式にリモートスイッチにパスワードを渡しますが、リモートコマンドが失敗してもエラーが発生しないため、あまり良くありません。パスワードを含むすべてがログファイルに書き込まれます。

注:すべてのIPのユーザーパスワードは同じです。

ベストアンサー1

以下の機能は良いスタートです。fooCSVファイルの内容を読み込み、IPアドレスの配列がいっぱいになり、ssh同じIPが何度も使用されないように繰り返すたびに確認します。

# Usage: inarray "$value" "${array[@]}"
inarray()
{ 
    local n=$1 h; shift
    for h; do 
        [[ $n = "$h" ]] && return
    done
    return 1
} 

# Usage: foo "$csv_file_name"
foo()
{
    local ips=() arr=() filename="$1"
    { read; while IFS= read -r line; do
        IFS=, read -ra arr <<< "$line"
        if ! inarray "${arr[0]}" "${ips[@]}"; then
            # Do whatever you want with "${arr[@]}"
            # Example for arr:
            # arr[0]=10.192.168.1, arr[1]=vlan-xyz, arr[2]=3
            ips+=("${arr[0]}")
        fi
    done; } < "$filename"
}

おすすめ記事