Об IP-адресах полезно помнить, что они на самом деле просто представления 32-битного числа.
Таким образом, вы можете преобразовать их в десятичное число, умножив октеты на 256.
Например:
217.29.0.0 == 216 * 256 ^ 3 + 29 * 256 ^2 + 0 * 256 ^1 + 0 * 256 ^ 0
== 3640655872
Итак, учитывая диапазон, подобный приведенному выше - сначала преобразуйте их оба, чтобы получить начало и конец . Затем сравните все входящие IP-адреса, чтобы убедиться, что они «подходят».
Примерно так (иллюстрирующий алгоритм):
#!/usr/bin/env perl
use strict;
use warnings;
my $ip_to_check = "204.12.5.10";
my $dword = 0;
for ( split( '\.', $ip_to_check ) ) { $dword *= 256; $dword += $_ }
print "Checking $dword\n";
while (<DATA>) {
my ( $start, $finish ) = m/([\d\.]+)/g;
my $start_dword = 0;
for ( split '\.', $start ) { $start_dword *= 256; $start_dword += $_ }
my $end_dword = 0;
for ( split '\.', $finish ) { $end_dword *= 256; $end_dword += $_ }
print "Range:\n";
print "\t$start \t=> $start_dword\n";
print "\t$finish \t=> $end_dword\n";
print "$ip_to_check is in $_\n" if $dword >= $start_dword and $dword <= $end_dword;
}
__DATA__
"217.29.0.0-217.29.255.255",
"204.12.0.0-204.12.255.255",
"198.54.223.0-198.54.223.255",
Это можно легко сделать как «сценарий проверки» - прочитав файл (а не DATA
) и получив $ ip_to_check
из STDIN
).
(примечание - поскольку чистый perl
может быть довольно легко превращен в однострочник или скрипт для вызова. Или переписан - я полагаю, вы могли бы сделать это с помощью expr
достаточно легко).
Использование встроенной функции bash для проверки открытых портов также может работать:
#!/bin/bash
host_file=/path/to/file.txt
out_file=/path/to/out.txt
while read -r ip; do
if timeout 5 bash -c "cat < /dev/null >/dev/tcp/${ip}/22"; then
echo -e "${ip}\tSuccess"
else
echo -e "${ip}\tFailure"
fi >> "$out_file"
done < "$host_file"
У меня пока недостаточно репутации, чтобы прокомментировать сообщение о том, что curl не предназначен для ssh или telnet. Это не точно. Curl поддерживает множество протоколов, включая telnet, ssh, scp, sftp, ftps и другие.
Это правильный синтаксис для curl:
curl -v telnet://127.0.0.1:22