이 스크립트는 어떻게 IP 주소를 무작위로 생성합니까?

이 스크립트는 어떻게 IP 주소를 무작위로 생성합니까?

누군가 아래 코드가 어떻게 작동하는지 설명해 줄 수 있나요? IP 주소를 무작위로 생성한다는 것은 알고 있지만 어떻게 생성되는지는 모르겠습니다.

while
  set $(dd if=/dev/urandom bs=4 count=1 2>/dev/null | od -An -tu1)
  [ $1 -lt 224 ] &&
  [ $1 -ne 10 ] &&
  { [ $1 -ne 192 ] || [ $2 -ne 168 ]; } &&
  { [ $1 -ne 172 ] || [ $2 -lt 16 ] || [ $2 -gt 31 ]; }
do :; done
ip_address=$1.$2.$3.$4

답변1

주문하다

dd if=/dev/urandom bs=4 count=1 2>/dev/null | od -An -tu1

유사한 데이터 생성

     251 113 126 026

dd장치에서 4바이트를 읽도록 요청한 urandom다음 각각 1바이트의 일련의 부호 없는 정수로 변환합니다 od.

set이는 위치 인수 $(...)와 함께 명령 대체( )를 통해 전달되고 정수 로 설정 됩니다 .set$1$2$3$4

그런 다음 이러한 정수에 대해 몇 가지 검사가 수행되고 테스트 중 하나가 실패할 때까지 루프가 계속됩니다. 루프 본문의 내용은 :작업이 없으며 쉘의 구문만 충족하면 됩니다.


임의의 IP 주소를 생성하는 또 다른 방법(개인 주소 범위 내에 있지 않음):

$ nmap -n -iR 10 -sL | awk '/report for/ { print $NF }'
221.37.208.42
121.3.97.158
203.225.119.103
145.139.220.88
95.153.25.126
149.73.57.221
165.178.177.39
11.187.21.175
175.211.240.124
130.89.42.47

답변2

Kusalananda가 말했듯이 이 dd | od세트는 $1..$44개의 임의의 8비트 정수이며 IPv4 주소의 4옥텟으로 간주될 수 있습니다.

그런데 스크립트의 테스트가 이상하게 보입니다. 테스트가 참인 동안 루프는 반복되거나 테스트 중 하나라도 참일 때 루프가 종료된다는 점을 기억하십시오.실패하다. 그런 다음 첫 번째 테스트에서는 첫 번째 옥텟을 224와 비교합니다.실패하다그것과 같거나 클 때. 따라서 IP 주소가 .보다 크거나 같게 됩니다 224.0.0.0. 이들은 모두 멀티캐스트 또는 예약된 주소이므로 생성기가 실제로 어떤 용도로 사용되는지 파악하기 어렵습니다.

다른 테스트에서도 개인 사용 범위가 허용되지만 훨씬 작기 224..255때문에 범위가 거의 표시되지 않습니다.

라우팅 가능한 주소를 생성하는 것이 목적이라면 테스트의 의미는 반대가 되어야 합니다.


에 관해서는 od -An -tu1,매뉴얼 페이지에서는 이러한 스위치를 설명합니다.. -An주소 인쇄를 방지하려면 -tu1입력을 1바이트 부호 없는 정수로 처리하십시오.

-A, --address-radix=RADIX
파일 오프셋의 출력 형식은 [doxn]10진수, 8진수, 16진수 또는 없음 중 하나 입니다.

-t, --format=TYPE
TYPE은 다음 사양 중 하나 이상으로 구성됩니다.
u[SIZE] 부호 없는 십진수, 정수당 SIZE바이트

관련 정보