GNU bash , 버전 4.3.42 (1)-릴리스 (arm-openwrt-linux-gnu)
bash 배열을 사용하여 iptables 규칙을 스크립팅하려고합니다.
$ NETID는 네트워크 주소를 만드는 데 사용됩니다. 예 : 192.168. 10 .0 / 24, 192.168. 20 .0 / 24 등
$ {NETID [@]}의 "i"가 $ NETID_TMP에서 제거 된 임시 변수 ($ NETID_TMP)를 만들려고합니다 . 예를 들어 "i"= 10이면 NETID_TMP = (20 30 40)입니다.
스크립트:
#!/opt/bin/bash
NETID=(10 20 30 40)
for (( i=0; i<${#NETID[@]}; i++ )); do
NETID_TMP=(${NETID[*]})
unset NETID_TMP[${NETID[i]}]
iptables -I FORWARD -s 192.168.${NETID[i]}.0/24 -d 192.168.${NETID_TMP[0]}.0/24,192.168.${NETID_TMP[1]}.0/24,192.168.${NETID_TMP[2]}.0/24 -j DROP
done
결과는 ...
iptables -I FORWARD -s 192.168.10.0/24 -d 192.168.20.0/24,192.168.30.0/24,192.168.40.0/24 -j DROP
iptables -I FORWARD -s 192.168.20.0/24 -d 192.168.10.0/24,192.168.30.0/24,192.168.40.0/24 -j DROP
iptables -I FORWARD -s 192.168.30.0/24 -d 192.168.10.0/24,192.168.20.0/24,192.168.40.0/24 -j DROP
iptables -I FORWARD -s 192.168.40.0/24 -d 192.168.10.0/24,192.168.20.0/24,192.168.30.0/24 -j DROP
netid=(10 20 30 40)
for i in "${netid[@]}"; do
out="iptables -I FORWARD -s 192.168.$i.0/24 -d "
for j in "${netid[@]}"; do
(( i == j )) && continue
out+="192.168.$j.0/24,"
done
out="${out%,} -j DROP"
printf '%s\n' "$out"
done
이 Bash 스크립트는
iptables -I FORWARD -s 192.168.10.0/24 -d 192.168.20.0/24,192.168.30.0/24,192.168.40.0/24 -j DROP
iptables -I FORWARD -s 192.168.20.0/24 -d 192.168.10.0/24,192.168.30.0/24,192.168.40.0/24 -j DROP
iptables -I FORWARD -s 192.168.30.0/24 -d 192.168.10.0/24,192.168.20.0/24,192.168.40.0/24 -j DROP
iptables -I FORWARD -s 192.168.40.0/24 -d 192.168.10.0/24,192.168.20.0/24,192.168.30.0/24 -j DROP
이중 루프를 통해. 내부 루프는 루프 변수가 외부 루프의 루프 변수와 수치 적으로 동일한 반복을 건너 뛰어 원하는 효과를 만듭니다.
에 문자열이 $out
있으면 할 수 eval
있습니다.
또는 피하려면 eval
다음을 수행하십시오.
netid=(10 20 30 40)
for i in "${netid[@]}"; do
sarg="192.168.$i.0/24"
darg=""
for j in "${netid[@]}"; do
(( i == j )) && continue
darg+="192.168.$j.0/24,"
done
darg="${darg%,}"
iptables -I FORWARD -s "$sarg" -d "$darg" -j DROP
done
변수 대체 ${parameter%word}
는 word
의 맨 끝에서 제거 $parameter
되므로 darg="${darg%,}"
af 끝에서 쉼표를 제거합니다 $darg
.
댓글에서 질문 후 업데이트 :
유일한의 bash
위의에 대한 특이 배열의 사용이다 $netid
의 +=
운영자는에 추가 할 $darg
문자열 ((...))
. 이것을 다음 sh
과 같은 스크립트 로 바꿀 수 있습니다 (여기서는 $IFS
여전히 기본값이 있다고 가정 합니다).
netid="10 20 30 40"
for i in $netid; do
sarg="192.168.$i.0/24"
darg=""
for j in $netid; do
[ "$i" -eq "$j" ] && continue
darg="${darg}192.168.$j.0/24,"
done
darg="${darg%,}"
iptables -I FORWARD -s "$sarg" -d "$darg" -j DROP
done
연결하려는 별도의 번호 목록이있는 경우 $darg
대신 내부 루프에서 사용하십시오 $netid
. 공백으로 구분 된 숫자 문자열이어야합니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다