1

Как я могу быстро узнать, открыт ли / прослушивается порт 80 на сервере через скрипт bash?

Обычно на всех рабочих станциях демон работает, но иногда он не работает. Я использую следующую команду, чтобы проверить, есть ли у IP-адреса открытый порт. Я хотел бы иметь возможность сделать это для каждой строки в файле без необходимости каждый раз вводить его вручную.

 nc -zw3 10.101.0.13 80 && echo "opened" || echo "closed"

Файл списка выглядит следующим образом, где 3333 и 3334 - строки после $ip;

10.101.0.13; 3333
10.101.0.15; 3334
10.101.0.17; 4143
10.101.0.21; 1445
10.101.0.27; 2443
10.101.0.31; 2445
10.101.0.47; 3443
10.101.0.61; 3445

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

Я попробовал что-то подобное без успеха:

while IFS=";" read ip port ; do nc -zw3 "$ip" "$port" && echo "$ip:$port => opened" || echo "$ip:$port =>  closed" ; done < list.txt

while IFS=";" read ip port ; do nc -zw3 "${ip}" "${port}" && echo "${ip}:${port} => opened" || echo "${ip}:${port} =>  closed" ; done < list.txt

3 ответа3

1

Вот самая простая и эффективная команда Nmap для выполнения того, что вы хотите (и ничего более):

#!/bin/sh
# Gather the IPs to scan for each port
perl -lanF\; -e'push @{$p{$F[1]}}, $F[0];END{$,=" ";while(($x,$y)=each%p){print $x,@$y}}' input.txt | while read port ips; do
  # Scan the appropriate port for each set of IPs
  nmap -Pn -n -oG - -p $port $ips |\
  # Put the open ones into open.txt and the closed/filtered into closed.txt
  awk 'OFS=":";$4~/^Ports:/{if(/open/){print $2,'$port' >> "open.txt"}else{print $2,'$port' >> "closed.txt"}}'
done

К сожалению, в Nmap нет встроенного способа сканирования только некоторых портов на одних IP-адресах и других портов на других IP-адресах, в противном случае это может быть намного проще.

1

Проще всего установить nmap из репозитория, а затем выполнить:

   awk -F ";" '{print $1}' data | xargs -L 1 nmap -p 80

где данные - это файл с IP-адресами для сканирования.

Редактировать:

Если это так, как @pabouk предлагает ниже, то число, следующее за IP-адресом, является портом для сканирования, тогда вы можете добиться желаемого сканирования следующим образом:

   awk -F ";" '{print "nmap " $1 " -p" $2}' data | xargs -I % sh -c '%'

Если вы хотите выполнить сканирование как для порта 80, так и для порта, считанного из файла, вы можете сделать это с помощью этой команды:

   awk -F ";" '{print "nmap " $1 " -p80," $2}' data | xargs -I % sh -c '%'

Если Nmap , как полагают, производят слишком много выхода, происходит некорректно команда будет делать:

   awk -F ";" '{print "nmap -oG - " $1 " -p80," $2}' data | xargs -I % sh -c '%' | grep Ports
1
#!/bin/bash
N=0
cat $1 | while read line
do
    N=$((N+1))
    nc -zw3 $( echo $line | tr -d ';' ) && echo -e "OPEN\t$( echo $line | sed 's/; /:/g' )" || echo -e "CLOSED\t$( echo $line | sed 's/; /:/g' )" 
done

Использование: ./script.sh Сканирует указанный файл и проверяет, открыт или закрыт каждый «$ ip; $ port».

Если вы хотите отсортированный вывод:./script.sh | Сортировать

Нет необходимости установки.

Как одна строка, которую вы можете вставить в свой терминал без необходимости создания сценария оболочки:

N=0; cat FILENAME | while read line; do; N=$((N+1)); nc -zw3 $( echo $line | tr -d ';' ) && echo -e "OPEN\t$( echo $line | sed 's/; /:/g' )" || echo -e "CLOSED\t$( echo $line | sed 's/; /:/g' )"; done

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .