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
/tmp/voipbl.txt
파일에서 대략적인 IP를 읽고 이를 기반으로 쉘을 생성합니다 . 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"
. -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
다른 두 행에서는 실행되지 않도록 합니다 .