Как удалить IP (ы) из текстового файла на основе заданного CIDR?

#bash #awk #grep #cidr

#bash #awk #grep #cidr

Вопрос:

Чтобы продемонстрировать это, у меня есть несколько IP-адресов в текстовом файле, вызываемом blocked.txt со следующим содержимым:

 1.1.1.1
1.1.1.2
1.1.1.3
2.1.1.1
2.1.1.2
 

Итак, учитывая ввод CIDR из 1.1.1.0/24

Я хочу удалить IP-адрес, который принадлежит этому диапазону CIDR, который является 1.1.1.1 , 1.1.1.2 и 1.1.1.3

Единственное, что меня зацикливает, — это как перечислить все IP, если задана форма CIDR. Пример:

 #!/bin/bash
cidr_ip="1.1.1.0/24"
ip_exist=$(echo "${cidr_ip}" | grep_all_the_ip_in_that_CIDR in blocked.txt)
echo ${ip_exist} # This will list out all the iP and then I can use this to remove the IP
 

Ожидаемый результат blocked.txt будет иметь только это содержимое:

 2.1.1.1
2.1.1.2
 

=================================

Я тестирую с этими данными:

 161.35.169.25
104.228.72.171
177.5.53.176
103.56.43.225
20.58.48.57
27.115.124.6
1.1.1.1
111.229.188.72
27.115.124.70
51.15.179.65
77.245.149.46
180.163.220.68
71.68.239.90
45.142.120.87
42.236.10.125
42.236.10.114
212.70.149.53
1.1.1.0/24
1.1.1.9
1.1.1.10
1.1.1.2
1.1.1.3
2.1.1.0/24
2.1.1.1
3.1.1.0/24
212.70.149.84
103.249.77.2
5.178.86.76
 

Ответ №1:

РЕДАКТИРОВАТЬ: поскольку OP добавил еще несколько примеров для обработки строк с / present, можно попробовать следующее.

 awk -F'/' -v val="1.1.1.0/24" '
BEGIN{
  match(val,/.*./)
  matched=substr(val,RSTART,RLENGTH-1)
  split(substr(val,RSTART RLENGTH),arr,"/")
  for(i=arr[1];i<=arr[2];i  ){
   skip[matched"."i]
  }
}
!($1 in skip)
'  Input_file
 


Не могли бы вы, пожалуйста, попробовать следующее, написанное и протестированное с показанными примерами в GNU awk . Где переменная val — это ваш диапазон IP-адресов.

 awk -v val="1.1.1.0/24" '
BEGIN{
  match(val,/.*./)
  matched=substr(val,RSTART,RLENGTH-1)
  split(substr(val,RSTART RLENGTH),arr,"/")
  for(i=arr[1];i<=arr[2];i  ){
   skip[matched"."i]
  }
}
!($0 in skip)
'  Input_file
 

Объяснение: добавление подробного объяснения выше.

 awk -v val="1.1.1.0/24" '                        ##Starting awk program from here and creating variable val which has that range here.
BEGIN{                                           ##Starting BEGIN section of this program from here.
  match(val,/.*./)                              ##using match function to match everything till . in variable val here.
  matched=substr(val,RSTART,RLENGTH-1)           ##Creating matched which has sub string of matched regex value in var variable.
  split(substr(val,RSTART RLENGTH),arr,"/")      ##Splitting rest of value of var which is actual range into array arr here.
  for(i=arr[1];i<=arr[2];i  ){                   ##Running for loop from 1st item value to 2nd item value of array here.
   skip[matched"."i]                             ##Creating skip array which has index as matched(variable) dot and i here, it contains which ips to be negleted basically.
  }
}
!($0 in skip)                                    ##In main block of program checking condition if current line is NOT present in skip then print that line.
' Input_file                                     ##Mentioning Input_file name here.
 

Комментарии:

1. Сейчас собираюсь протестировать.

2. @KalibZen, ответы будут даны только в соответствии с показанными примерами, извините, но изменение деталей позже в вопросе не рекомендуется, поэтому, спасибо.

3. Вы правы, он не совпадал со строкой с /

4. Большое спасибо, что потратили время на помощь, и с этим комментарием к коду я действительно ценю это. работает отлично.

5. @KalibZen, пожалуйста, измените с !($1 in skip) на ($1 in skip) , и тогда это должно сработать.

Ответ №2:

Другой способ сделать это — использовать nmap, которые поддерживают нотацию CIDR:

 nmap -sn -v 1.1.1.0/24 | awk '/^Nmap scan/ { print $5 }' > ipadds.txt
 

Запустите nmap в диапазоне CIDR, выполнив простое сканирование с помощью -v, чтобы отобразить хосты, которые также могут быть недоступны. Используйте awk, чтобы удалить все, кроме IP-адресов, выводя их в файл ipadds.txt

 grep -v -f ipadds.txt blocked.txt
 

Выполните обратный поиск заблокирован.txt с использованием записей в ipadds.txt .

ПРИМЕЧАНИЕ — Решение может быть не для всех и будет зависеть от управления сетью и вашей способности использовать инструменты сетевого сканирования. Вам также понадобятся разрешения sudo для запуска nmap, чтобы гарантировать достижение наиболее оптимальных и точных результатов.

Комментарии:

1. Спасибо за это решение, но я получил много ошибок, таких как: sendto in send_ip_packet_sd: sendto(6, packet, 28, 0, 1.1.1.1, 16) => Operation not permitted Offending packet: ICMP [IP > 1.1.1.1 Echo request (type=8/code=0) id=64823 seq=0] IP [ttl=59 id=34471 iplen=28 ]

2. Да. Похоже, ICMP блокируется в сети ylur. Тогда это не решение в вашем случае, но, возможно, решение для кого-то другого.