VoIPBL 업데이트 스크립트의 일부가 있습니다.
cat /tmp/voipbl.txt | awk '{ print "if [ ! -z \""$1"\" -a \""$1"\" != \"#\" ]; then /usr/sbin/ipset -A voipbl_temp \""$1"\" ;fi;"}'
다음과 같은 줄이 생성됩니다.
if [ ! -z "1.2.3.4/32" -a "1.2.3.4/32" != "#" ]; then /usr/sbin/ipset -A voipbl_temp "1.2.3.4/32" ;fi; | sh
두 번째 부분은 파일(IP)의 한 줄을 ipset에 추가하는 것으로 알고 있지만 테스트 조건은 무엇입니까? 동일한 대괄호 세트에 -z와 -a가 있으면 무엇을 의미합니까? 그리고 "#" 부분과 같지 않다는 것은 무엇을 의미합니까?
답변1
아마도 파일에서 IP를 읽은 /tmp/voipbl.txt
다음 이를 기반으로 구성하면 쉘을 생성하는 것입니다. awk 스크립트의 매개 변수 $1
는 각 줄의 첫 번째 열에 있는 항목을 참조하므로 대신에 있는 문자열은 1.2.3.4/32
각 반복에서 해당 값이 됩니다.
if [ ! -z "1.2.3.4/32" -a "1.2.3.4/32" != "#" ]; then
! -z "1.2.3.4/32"
"1.2.3.4/32"
- null이 아닌지 확인 중입니다 . -z
문자열인지 확인~이다0이지만 !
그것을 부정합니다. 이것은 -n
null이 아닌지 확인하는 것으로 대체될 수 있고 아마도 대체되어야 할 것입니다 .
"1.2.3.4/32" != "#"
- 내 생각에 파일에 나타날 수 있는 것과 "1.2.3.4/32"
같지 않은지 확인하는 것입니다 .#
운영자 -a
의 뜻은그리고. 따라서 문자열이 null이 아니고 같지 않은지 확인합니다 #
.
이러한 조건이 충족되면 다음이 실행됩니다.
/usr/sbin/ipset -A voipbl_temp "1.2.3.4/32"
이를 더 잘 이해하려면 다음 내용이 포함된 파일에서 awk 명령을 실행해 보세요.
1.2.3.4/32
# 3.4.5.6/32
이제 해당 파일에 대해 awk 명령을 실행하면 다음을 얻을 수 있습니다.
$ awk '{ print "if [ ! -z \""$1"\" -a \""$1"\" != \"#\" ]; then /usr/sbin/ipset -A voipbl_temp \""$1"\" ;fi;"}' file
if [ ! -z "1.2.3.4/32" -a "1.2.3.4/32" != "#" ]; then /usr/sbin/ipset -A voipbl_temp "1.2.3.4/32" ;fi;
if [ ! -z "" -a "" != "#" ]; then /usr/sbin/ipset -A voipbl_temp "" ;fi;
if [ ! -z "#" -a "#" != "#" ]; then /usr/sbin/ipset -A voipbl_temp "#" ;fi;
테스트를 통해 /usr/sbin/ipset
첫 번째 줄에서만 실행되고 1.2.3.4/32
다른 두 줄에서는 실행되지 않는지 확인합니다.