ipv6 서브넷을 구축하는 간단한 for 루프 스크립트

ipv6 서브넷을 구축하는 간단한 for 루프 스크립트

/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 bla8printf "500%x" 8​​되어라5008

따라서 마지막 3자리 숫자를 자리 표시자 %x로 바꾼 다음 16진수 범위 c00-dff에 해당하는 10진수를 제공해야 합니다. 이는 10진수로 3072-3583입니다(불행히도 bash 범위 연산자는 16진수를 이해하지 못합니다). .

그런데 3자리보다 작은 숫자부터 계산을 시작하려면 자리 표시자에 패딩을 지정할 수도 있습니다. 예를 들어 000-200이라는 숫자의 경우 자리 표시자를 사용할 수 있습니다 %03x. 03자리 미만의 패딩에 사용하려는 문자이며 3원하는 최소 숫자 길이입니다.

관련 정보