다음과 같은 항목이 포함된 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 주소와 마찬가지로 파일의 다른 두 열을 배열에 넣을 생각입니다.
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"
}
답변2
Perl에게는 직업처럼 들립니다.
#!/usr/bin/perl
use strict;
use warnings;
my $input_file=shift//die "No input file name given.\n";
open my $if,'<',$input_file or die "Couldn't open $input_file: $!\n";
my %ip_data;
<$if>; # Throw away the header
while(<$if>){
my ($ip,$vlan,$vlan_id)=split /\s*,\s*/;
push $ip_data{$ip}, <<EOI;
int VLAN $vlan
switchport access vlan $vlan_id
wr
EOI
}
close $if;
for my $ip (sort keys %ip_data){ #Fork-exec an SSH process for each IP address:
my $pid = fork;
$pid ? () : exec "ssh user@$ip \"$ip_data{$ip}\"";
}
이 스크립트를 파일에 저장하고 실행 가능하게 만들고( chmod +x script_file
) 다음과 같이 호출하십시오.
$ ./script_file inputfile
댓글 2개: