次のエントリを含む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
以下の機能は良いスタートです。foo
CSVファイルの内容を読み込み、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"
}