Mengonversi rentang alamat IPv4 ke netmasks menggunakan bash

10

Saya memiliki file input dengan alamat IPv4:

94.228.16.0 - 94.228.25.255
94.241.136.0/24
94.241.136.0 - 94.241.136.255
94.29.128.0/17
94.29.128.0 - 94.29.191.0
94.29.192.0 - 94.29.255.0
94.74.181.0/24
94.74.181.0 - 94.74.181.31
94.74.181.128 - 94.74.181.255

Bagaimana saya bisa mengubah rentang alamat menjadi netmasks? Hasilnya harus:

94.228.16.0/21
94.241.136.0/24
94.241.136.0/24
94.29.128.0/17
94.29.128.0/19
94.29.192.0/19
94.74.181.0/24
94.74.181.0/27
94.74.181.128/25
Oleksii
sumber
3
Beberapa hasil yang Anda minta salah, jadi tidak ada skrip bash yang valid yang akan menghasilkannya. Misalnya, rentang pertama tidak dapat diungkapkan menggunakan netmask: 94.228.16.0/21 memberi 94.228.16.0 - 94.228.23.255, dan 94.228.16.0/20 yang lebih luas berikutnya memberi 94.228.16.0 - 94.228.31.255. Juga, rentang yang berakhiran .0 tidak dapat diproduksi oleh netmask apa pun.
zwets
@Zanna Anda curang, poster bertanya menggunakan bash . Bash saya tidak memiliki ipcalcbuiltin. ;-)
zwets
@ Zwets, ah aku sudah menemukan jawabannya! Tapi kau benar, shell membutuhkan banyak bantuan hahaha
Zanna

Jawaban:

14

Pertama, Anda perlu menginstal paket untuk melakukan konversi

sudo apt install ipcalc

Sekarang Anda dapat melakukannya dengan skrip kecil ini (harap dicatat bahwa skrip ini tidak berfungsi jika Anda mengutip variabelnya):

$ while read line; do if [[ $line = *-* ]]; then (ipcalc $line | sed '2!d'); else echo $line; fi; done < file
94.228.16.0/21
94.241.136.0/24
94.241.136.0/24
94.29.128.0/17
94.29.128.0/19
94.29.192.0/19
94.74.181.0/24
94.74.181.0/27
94.74.181.128/25

atau lebih mudah dibaca

while read line; do
   if [[ $line = *-* ]]; then 
     (ipcalc $line | sed '2!d')
   else echo $line
   fi
done < file
Zanna
sumber
@Oleksii selalu menyenangkan :)
Zanna
3

Mungkin tidak mengherankan, ada modul perl CPAN Net :: CIDR untuk ini.

Jadi misalnya:

$ perl -MNet::CIDR=range2cidr -lne 'print for range2cidr $_' yourfile
94.228.16.0/21
94.228.24.0/23
94.241.136.0/24
94.241.136.0/24
94.29.128.0/17
94.29.191.0/32
94.29.128.0/19
94.29.160.0/20
94.29.176.0/21
94.29.184.0/22
94.29.188.0/23
94.29.190.0/24
94.29.255.0/32
94.29.192.0/19
94.29.224.0/20
94.29.240.0/21
94.29.248.0/22
94.29.252.0/23
94.29.254.0/24
94.74.181.0/24
94.74.181.0/27
94.74.181.128/25

Modul ini tersedia di Ubuntu dengan menginstal libnet-cidr-perlpaket.

NB Saya belum memvalidasi input Anda atau hasilnya.

Steeldriver
sumber