이 bash 변수는 유효한 IP v4 또는 6 주소입니까?

이 bash 변수는 유효한 IP v4 또는 6 주소입니까?

bash (최신 Debian test/bookworm apt의 v5.2)라는 변수가 있습니다 TARGET. 콘텐츠가 유효한 IPv4 또는 IPv6 주소이고 유사한 주소가 아닌지 어떻게 확인합니까 ERROR?

답변1

bash 정규식을 사용하여 간단한 유효성 검사를 수행하여 변수가 예상 형식과 일치하는지 확인할 수 있습니다.

is_ipv4_address() {
  [[ $1 =~ [0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3} ]]
}

위의 함수를 사용하여 다음 스크립트를 실행할 수 있습니다.

for data in 1.2 1.2.3 1.2.3.4; do
  echo -n "$data: "
  is_ipv4_address "$data" && echo yes || echo no
done

출력을 얻습니다.

1.2: no
1.2.3: no
1.2.3.4: yes

이는 "느슨한" 검증입니다. 즉, 999.999.999.999패턴과 일치하지만 유효한 주소가 아닙니다. 보다 완벽한 솔루션이 필요한 경우 다음을 사용할 수 있습니다.Linux 저널 기사이 주제에 대해.


IPv6은 조금 더 복잡합니다. 완전히 확장된 형식을 일치시키는 것은 간단하지만 0을 축소할 수 있으므로 그 자체로는 좋지 않습니다.

다음과 같이 시작할 수 있습니다.

is_ipv6_address() {
  [[ $1 =~ ^([0-9a-fA-F]{0,4}:){0,7}[0-9a-fA-F]{1,4}$ ]]
}

이전 솔루션과 마찬가지로 이는 느슨한 일치입니다.~ 할 것이다일치는 실제로 ipv6 주소의 내용이 아니지만 필요에 따라 괜찮을 수도 있습니다. 다음은 몇 가지 테스트 사례입니다.

testcases=(
1.2.3.4
2001:foo
"i am not an ip address"
2001:0000:3238:DFE1:0063:0000:0000:FEFB
2001:0000:3238:DFE1:63:0000:0000:FEFB
2001:0000:3238:DFE1:63::FEFB
2001:0:3238:DFE1:63::FEFB
2c:f0:5d:c9:12:a9
)

for testcase in "${testcases[@]}"; do
  echo -n "$testcase: "
  is_ipv6_address "$testcase" && echo yes || echo no
done

위의 출력은 다음과 같습니다.

1.2.3.4: no
2001:foo: no
i am not an ip address: no
2001:0000:3238:DFE1:0063:0000:0000:FEFB: yes
2001:0000:3238:DFE1:63:0000:0000:FEFB: yes
2001:0000:3238:DFE1:63::FEFB: yes
2001:0:3238:DFE1:63::FEFB: yes
2c:f0:5d:c9:12:a9: yes

따라서 유효한 ipv6 주소 형식과 일치하고 명백히 잘못된 형식은 거부하지만 MAC 주소와 일치한다는 것을 알 수 있습니다. 개선의 여지가 있지만 이것이 출발점이 되기를 바랍니다.

답변2

ipcalc-ngIP 주소의 유효성을 확인하는 실행 파일이 포함된 Debian 패키지가 있습니다 .

$ ipcalc-ng -c ::xx; echo $?
ipcalc-ng: bad IPv6 address: ::xx
1
$ ipcalc-ng -c ::1; echo $?
0

관련 정보