#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. Тогда это не решение в вашем случае, но, возможно, решение для кого-то другого.