Chuyển đổi một loạt các địa chỉ IPv4 sang netmasks bằng bash


10

Tôi có một tệp đầu vào với địa chỉ 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

Làm thế nào tôi có thể chuyển đổi phạm vi địa chỉ thành netmasks? Kết quả sẽ là:

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

3
Một số kết quả bạn yêu cầu là không chính xác, vì vậy không có tập lệnh bash hợp lệ nào tạo ra chúng. Chẳng hạn, phạm vi đầu tiên không thể biểu thị bằng cách sử dụng netmask: 94.228.16.0/21 cung cấp 94.228.16.0 - 94.228.23.255 và phạm vi rộng hơn tiếp theo 94.228.16.0/20 cho 94.228.16.0 - 94.228.31.255. Ngoài ra, các phạm vi kết thúc bằng 0 không thể được tạo bởi bất kỳ netmask nào.
zwets

@Zanna bạn đang gian lận, người đăng đã sử dụng bash . Bash của tôi không có ipcalcnội dung. ;-)
zwets

@zwets ah Tôi đã tìm ra rồi! Nhưng bạn đã đúng, vỏ cần rất nhiều sự giúp đỡ hahaha
Zanna

Câu trả lời:


14

Trước tiên, bạn sẽ cần cài đặt một gói để thực hiện chuyển đổi

sudo apt install ipcalc

Bây giờ bạn có thể làm điều đó với tập lệnh nhỏ này (xin lưu ý rằng nó không hoạt động nếu bạn trích dẫn biến):

$ 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

hoặc dễ đọc hơn

while read line; do
   if [[ $line = *-* ]]; then 
     (ipcalc $line | sed '2!d')
   else echo $line
   fi
done < file

@Oleksii luôn là một niềm vui :)
Zanna

3

Có lẽ không có gì đáng ngạc nhiên, có một mô-đun CPAN perl Net :: CIDR cho việc này.

Ví dụ:

$ 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

Mô-đun có sẵn trên Ubuntu bằng cách cài đặt libnet-cidr-perlgói.

NB Tôi chưa xác thực đầu vào của bạn hoặc kết quả.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.