Я не эксперт в сценарии оболочки любыми способами. Я получил идею структуры из другого сообщения (Bash script telnet to test multiple addresses and ports) Мне нужно проверить соединения LAN между конкретными хостами и портами через telnet.Shell Script - telnet несколько хостов: порты
Причина использования telnet заключается в том, что как LAN, так и машины в значительной степени защищены, и у меня нет доступа к netcat, nmap или/dev/tcp. Я также не знаю, где удобно с Python или Pearl, чтобы попробовать этот маршрут ... (я знаю, глупый, я туда доберусь: P). .
Следующий код работает, однако по причинам, не мое понимание итерации цикла While только один раз и не более ... :(
Примечание: это для меня важно знать, если соединение не удалось из-за тайм-аута или был отклонен (порт закрыт на конечной точке).
Может ли кто-нибудь помочь мне в 1) исправлении и 2) понять почему?
FYI: Для кого-либо, у кого может быть аналогичная потребность, это полностью обновленный код сценария. В этом случае отказ в соединении обрабатывается как успешный (проверка правил брандмауэра), который может быть изменен до отказа в зависимости от необходимости.
#!/bin/bash
path=`pwd`;
touch $path/test_telnet.out || exit;
touch $path/success.log || exit;
touch $path/failed.log || exit;
echo "10.192.168.1 1200
10.10.10.2 80
10.220.2.8 6090
10.220.2.9 6090" | (while read host port; do
telnet $host $port </dev/null > $path/test_telnet.out 2>&1 & sleep 1; kill $!;
if grep Connected $path/test_telnet.out >/dev/null;
then
echo @ $(date +"%b %d %H:%M %Y") $host:$port [ OPEN ] | tee -a $path/success_log.txt;
elif grep refused $path/telnet_test.txt >/dev/null; then
echo @ $(date +"%b %d %H:%M %Y") $host:$port [ REFUSED ] | tee -a $path/success_log.txt;
else
echo @ $(date +"%b %d %H:%M %Y") $host:$port [ TIMEOUT ] | tee -a $path/failed_log.txt;
fi;
cp /dev/null $path/test_telnet.out;
done
) 2>/dev/null #avoid bash messages
Если 'telnet' работает на всех, как' ssh' то ест содержимое стандартного ввода до вашего цикла цикл может. Переадресовывайте stdin для процесса telnet и смотрите, помогает ли это. –
@EtanReisner Если я делаю «telnet $ host $ port <> ...», то итерация выполняется, однако «$ host $ port» внутри telnet не изменяет значение. :( – TPatriot
Я не понимаю Стандартное перенаправление ввода не изменяет расширение переменных в командной строке оболочки. 'Telnet' не знает, что существуют переменные. Если перенаправление стандартного ввода заставляет цикл продолжать, тогда' read' прочитает следующую строку и задает «хозяин» и «порт» соответственно, чтобы они работали каждый раз через цикл. Сначала попробуйте более простой случай, чтобы убедиться, что вы можете заставить его работать: 'echo .... | while read host port; do echo «host: $ host»; echo «port: $ port»; done'. –