Почему этот фрагмент оболочки проверяет, были ли хосты запущены с отключением netcat преждевременно?

В: Почему вторая итерация выходит после 10.175.192.16? Может ли кто-нибудь объяснить это? Или я просто нашел ошибку «while / netcat»?

Содержание a.txt:

$ cat a.txt 10.175.192.14 10.175.192.16 10.175.192.17 $ 

Первая итерация, это нормально, просто выводит содержимое файла:

 $ while read oneline; do echo $oneline; done < a.txt 10.175.192.14 10.175.192.16 10.175.192.17 $ 

Вторая итерация, это плохо, она существует при приближении к 10.175.192.16:

 $ while read oneline; do nc -w 3 "$oneline" 22 >& /dev/null; echo $oneline; done < a.txt 10.175.192.14 10.175.192.16 $ 

Коды выхода:

 $ nc -w 3 "10.175.192.14" 22 >& /dev/null; echo $? 1 $ nc -w 3 "10.175.192.16" 22 >& /dev/null; echo $? 0 

Таким образом, нет SSH-сервера за 10.175.192.14. Но есть один за 10.175.192.16. Но итерация «пока» не должна выходить, прежде чем проходить через все линии, нет? Почему он пропустил 10.175.192.17? Что мне здесь не хватает?

Моя основная цель заключается в том, что у меня есть файл (a.txt), содержащий IP-адреса. Мне нужно отсортировать эти IP-адреса в двух файлах:

A) Те, которые достижимы (ssh запрашивает, поэтому сервер доступен)
B) То, что недоступно (тайм-аут через 3 секунды, потому что на порту 22 ничего не слышно)

«достижимый» означает, что есть что-то, что прослушивает порт 22 за IP.

Я думаю, что у меня есть ответ: когда nc пытается получить IP-адрес с сервером, который прослушивает порт 22 (который обычно является SSH-сервером), он считывает остальную часть ввода и передает ее серверу на порт 22. Сервер SSH I работают на моих домашних машинах, просто ест вход.

У nc I (система Slackware 13.1) есть опция «-z», для «нулевого ввода-вывода». Пытаться

 nc -z -w 3 "$oneline" >& /dev/null 

как команда в вашем while-loop. Я думаю, что существуют другие nc реализации. Например, есть netcat GNU, но он также имеет параметр «-z».

Может быть, ломается, что у вас есть специальный символ в конце 10.175.192.16? Вы можете попытаться проанализировать файл без команды «читать»:

 HOSTS=`cat a.txt` for host in $HOSTS; do code=`nc -w 3 -z "$host" 22 >& /dev/null; echo $?` if [ "$code" == "0" ]; then echo $host >> reachable.txt else echo $host >> unreachable.txt fi done