Bash скрипт с операциями netcat на разных серверах и портах - PullRequest
0 голосов
/ 25 июня 2018

Я немного растерялся.Я создал скрипт, который начинается с извлечения данных из файла CSV.Каждая строка содержит IP-адрес и несколько портов для тестирования.Цель состоит в том, чтобы проверить, что возможно подключиться к каждому серверу (под данным IP) на определенных портах.Для проверки используется следующий код:

nc -w 3 -v $ipValeur >> retour.txt 2>&1

Тем не менее, он не работает и возвращает Connection Timed out.Это странно.Фактически, если я запускаю команду telnet из терминала, она работает.Тем не менее, цель состоит в том, чтобы проверить, может ли сервер быть подключен ко многим другим.Итак, если используется telnet, это будет очень долго (один или два дня?) ...

Итак, я ищу способ, позволяющий автоматически проверять доступ с одного сервера на тридцатьдругие на нескольких портах.Вы можете найти код, который на самом деле используется в Как продолжить следующую итерацию, если в Bash возникает ошибка .

Спасибо за вашу помощь.

Решение

#!/bin/bash

INPUT_FILE=$1

while IFS='' read -r line || [ -n "$line" ]; do
  IFS=';' read -ra cvsline <<<${line}

  HOSTNAME=${cvsline[0]}
  ports=("${cvsline[@]:1}")

  for port in ${ports[*]}; do
    echo -n "Verification ${HOSTNAME}:${port}..."
    echo 'QUIT' | nc -w 3 -v "${HOSTNAME}" "${port}" >/dev/null 2>&1
    if [ $? -eq 0 ]; then
     echo "OK"
    else
     echo "KO"
    fi
  done
done < $INPUT_FILE

Vinz

1 Ответ

0 голосов
/ 25 июня 2018

Ответ может быть таким, что в команде: nc -w 3 -v $ipValeur >> retour.txt 2>&1 вы не передали номер порта, а все время использовался по умолчанию один

Я не могу понять ваш исходный код, поэтому я написал свой собственный на основе описания:

#!/bin/bash

INPUT_FILE=$1

while IFS='' read -r line || [ -n "$line" ]; do
  IFS=';' read -ra cvsline <<<${line}

  HOSTNAME=${cvsline[0]}
  ports=("${cvsline[@]:1}")

  for port in ${ports[*]}; do
    echo -n "Cheking ${HOSTNAME}:${port}..."
    nc -zw 3 "${HOSTNAME}" "${port}" >/dev/null 2>&1
    if [ $? -eq 0 ]; then
     echo "connected"
    else
     echo "not connected"
    fi
  done

done < $INPUT_FILE

Использование: ./script hostlist.cvs

Где hostlist.cvs:

127.0.0.1;80;90;100;
127.0.0.2;80;88;21;
10.255.0.1;80;443;

И выходной образец:

$ ./test.sh /tmp/1
Cheking 127.0.0.1:80...not connected
Cheking 127.0.0.1:90...not connected
Cheking 127.0.0.1:100...not connected
Cheking 127.0.0.2:80...not connected
Cheking 127.0.0.2:88...not connected
Cheking 127.0.0.2:21...not connected
Cheking 10.255.0.1:80...connected
Cheking 10.255.0.1:443...not connected
...