/119 IPv6 네트워크를 스캔하기 위해 nmap을 사용하려고 합니다. (주소 512개). 이 작업을 수행하기 전에 해당 범위의 모든 IP 주소로 채워진 파일을 생성하고 싶습니다. 네트워크 정보는 다음과 같습니다.
network 2607:f4a0:3:0:250:56ff:feac:3c00
Prefix length 119
network range 2607:f4a0:0003:0000:0250:56ff:feac:3c00-
2607:f4a0:0003:0000:0250:56ff:feac:3dff
그래서 다음과 같이 스크립트를 설정했습니다.
[root@ns1 ~]# for i in {1..512}; do printf "2607:f4a0:3:0:250:56ff:feac:3c00%x\n" $i >> ipv6.txt; done
파일에는 모두 위 범위 내에 있는 512개의 주소가 있을 것으로 예상됩니다. 그러나 내가 보는 것은 이것이다:
2607:f4a0:3:0:250:56ff:feac:3c001
2607:f4a0:3:0:250:56ff:feac:3c002
2607:f4a0:3:0:250:56ff:feac:3c003
2607:f4a0:3:0:250:56ff:feac:3c004
2607:f4a0:3:0:250:56ff:feac:3c005
2607:f4a0:3:0:250:56ff:feac:3c006
2607:f4a0:3:0:250:56ff:feac:3c007
2607:f4a0:3:0:250:56ff:feac:3c008
2607:f4a0:3:0:250:56ff:feac:3c009
2607:f4a0:3:0:250:56ff:feac:3c00a
2607:f4a0:3:0:250:56ff:feac:3c00b
2607:f4a0:3:0:250:56ff:feac:3c00c
2607:f4a0:3:0:250:56ff:feac:3c00d
2607:f4a0:3:0:250:56ff:feac:3c00e
2607:f4a0:3:0:250:56ff:feac:3c00f
2607:f4a0:3:0:250:56ff:feac:3c0010
2607:f4a0:3:0:250:56ff:feac:3c0011
2607:f4a0:3:0:250:56ff:feac:3c0012
2607:f4a0:3:0:250:56ff:feac:3c0013
2607:f4a0:3:0:250:56ff:feac:3c0014
2607:f4a0:3:0:250:56ff:feac:3c0015
2607:f4a0:3:0:250:56ff:feac:3c0016
2607:f4a0:3:0:250:56ff:feac:3c0017
2607:f4a0:3:0:250:56ff:feac:3c0018
2607:f4a0:3:0:250:56ff:feac:3c0019
2607:f4a0:3:0:250:56ff:feac:3c001a
2607:f4a0:3:0:250:56ff:feac:3c001b
2607:f4a0:3:0:250:56ff:feac:3c001c
nmap을 실행하면 오류가 발생합니다.
nmap -Pn -sT -p 22 -6 -iL ipv6.txt > ipv6up
실수:
Failed to resolve given IPv6 hostname/IP: 2607:f4a0:3:0:250:56ff:feac:3c00200. Note that you can't use '/mask' or '[1-4,7,100-]' style ranges for IPv6.
이 문제를 어떻게 해결할 수 있나요?
답변1
for i in {15360..15871}; do printf "2607:f4a0:3:0:250:56ff:feac:%.4x\n" $i; done
산출:
2607:f4a0:3:0:250:56ff:feac:3c00 2607:f4a0:3:0:250:56ff:feac:3c01 2607:f4a0:3:0:250:56ff:feac:3c02 2607:f4a0:3:0:250:56ff:feac:3c03 . . . 2607:f4a0:3:0:250:56ff:feac:3dfd 2607:f4a0:3:0:250:56ff:feac:3dfe 2607:f4a0:3:0:250:56ff:feac:3dff
답변2
거의 다 왔습니다. 이 줄은 다음과 같아야 합니다.
for i in {3072..3583};do printf "2607:f4a0:3:0:250:56ff:feac:3%x\n" $i >> ipv6.txt;done
설명: printf가 입력한 숫자를 자리 표시자 앞의 숫자에 어떻게든 추가할 것이라고 생각하는 것 같습니다. 그런 일은 일어나지 않았습니다. printf가 하는 일은 자리 표시자가 아닌 모든 것을 문자열로 해석한 다음 제공한 입력을 문자열로 변환하고(변환 방법은 사용하는 자리 표시자에 따라 다름) 자리 표시자를 해당 . 그러니 printf "bla bla%x" 8
되고 bla bla8
또 printf "500%x" 8
되어라5008
따라서 마지막 3자리 숫자를 자리 표시자 %x로 바꾼 다음 16진수 범위 c00-dff에 해당하는 10진수를 제공해야 합니다. 이는 10진수로 3072-3583입니다(불행히도 bash 범위 연산자는 16진수를 이해하지 못합니다). .
그런데 3자리보다 작은 숫자부터 계산을 시작하려면 자리 표시자에 패딩을 지정할 수도 있습니다. 예를 들어 000-200이라는 숫자의 경우 자리 표시자를 사용할 수 있습니다 %03x
. 0
3자리 미만의 패딩에 사용하려는 문자이며 3
원하는 최소 숫자 길이입니다.