Я ни в коем случае не эксперт в сценариях оболочки. Я получил идею структуры из другого сообщения (telnet сценария Bash для тестирования несколько адресов и портов) Мне нужно проверить соединения LAN между определенными хостами и портами через telnet.
Причина использования telnet заключается в том, что и локальная сеть, и машины надежно защищены, и у меня нет доступа к netcat, nmap или / dev / tcp. Я также не очень-то чувствую себя комфортно с Python или Pearl, чтобы попробовать этот маршрут ... (я знаю, глупый, но я доберусь туда: P).
Следующий код работает, однако по причинам, не имеющим отношения к моему пониманию, цикл while повторяется только один раз и не более ... :(.
Примечание: мне важно знать, не удалось ли установить соединение из-за тайм-аута или было отказано (порт закрыт в конечной точке).
Может ли кто-нибудь помочь мне в 1) исправлении и 2) понимании почему?
К вашему сведению: для всех, у кого может быть аналогичная потребность, вот полностью рабочий обновленный код для скрипта. В этом случае отказ в соединении считается успешным (проверка правил брандмауэра), который может быть изменен на неудачный в зависимости от необходимости.
#!/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 и посмотрите, поможет ли это. - person Etan Reisner   schedule 01.04.2015telnet
не знает, что были переменные. Если перенаправление стандартного ввода заставляет цикл продолжаться, тогдаread
будет читать следующую строку и установитьhost
иport
соответственно, чтобы они работали каждый раз в цикле. Сначала попробуйте более простой случай, чтобы убедиться, что он работает:echo .... | while read host port; do echo "host: $host"; echo "port: $port"; done
. - person Etan Reisner   schedule 01.04.2015if
, но не переменные внутриtelnet
, поэтому он продолжает выполнять операции Telnet с одним и тем жеhost port
, в то время какecho
печатаетhost port
, который он на самом деле должен ... странно, я знаю ... - person TPatriot   schedule 01.04.2015telnet $host $port
. Еслиecho $host $port
работает правильно, то иtelnet $host $post
. Но я также только что заметил, что вы, кажется, убиваете фоновую суб-оболочку, а не саму командуtelnet
. Это намеренно? - person Etan Reisner   schedule 01.04.2015kill $!
не убьет последний запущенный процесс? который в данном случае должен быть telnet. Также в telnet, возможно, было плохо сказано, хорошо, что вы поняли :) - person TPatriot   schedule 01.04.2015$!
- последний фоновый процесс. Единственный имеющийся у вас фоновый процесс - это суб-оболочка. Так что это будет либо под-оболочка, либо ничего (в зависимости от того, как именно она взаимодействует), я думаю. - person Etan Reisner   schedule 01.04.2015