simples para script de loop para construir sub-rede ipv6

0

Estou tentando usar o nmap para escanear uma rede / 119 IPv6. (512 endereços). Antes de fazer isso, quero gerar um arquivo que preencha todos os endereços IP desse intervalo. As informações da rede são as seguintes:

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

Então eu configurei meu script assim:

[root@ns1 ~]# for i in {1..512}; do printf "2607:f4a0:3:0:250:56ff:feac:3c00%x\n" $i >> ipv6.txt; done

O que eu espero ver no arquivo são 512 endereços que estão dentro do intervalo acima. No entanto, o que vejo em vez disso é isto:

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

Quando vou executar o nmap, recebo erros:

nmap -Pn -sT -p 22 -6 -iL ipv6.txt > ipv6up

Erros:

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.

Como posso corrigir isso?

    
por user53029 26.05.2016 / 20:38

2 respostas

3
for i in {15360..15871}; do printf "2607:f4a0:3:0:250:56ff:feac:%.4x\n" $i; done

Saída:

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
    
por 26.05.2016 / 20:48
1

Você estava quase lá. A linha deve ficar assim:

for i in {3072..3583};do printf "2607:f4a0:3:0:250:56ff:feac:3%x\n" $i >> ipv6.txt;done

Explicação: Parece que você assumiu que, de alguma forma, o printf adicionaria os números que você forneceu ao número antes do espaço reservado. Não é assim que funciona. O que o printf faz é interpretar o que não é um espaço reservado como uma string e, em seguida, converter a entrada que você atribuiu a uma string (como a conversão é feita depende do marcador usado) e substituir o marcador por isso. Então, printf "bla bla%x" 8 corresponde a bla bla8 e printf "500%x" 8 torna-se 5008

Portanto, você precisa substituir os últimos 3 dígitos pelo marcador de posição% xe depois dar os números decimais correspondentes ao intervalo hexadecimal c00-dff que é 3072-3583 em decimal (infelizmente o operador do intervalo bash não entende hexadecimal números).

A propósito, se você quiser começar a contar a partir de um número com menos de 3 dígitos, você também pode especificar um preenchimento para o espaço reservado. por exemplo, para os números 000-200, você usaria o espaço reservado %03x . 0 é o caractere que você deseja usar para preencher números com menos de 3 dígitos e 3 é o tamanho mínimo de dígitos que você deseja ter.

    
por 26.05.2016 / 21:08