2015-04-01 1 views
0

Я не эксперт в сценарии оболочки любыми способами. Я получил идею структуры из другого сообщения (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 
+2

Если 'telnet' работает на всех, как' ssh' то ест содержимое стандартного ввода до вашего цикла цикл может. Переадресовывайте stdin для процесса telnet и смотрите, помогает ли это. –

+0

@EtanReisner Если я делаю «telnet $ host $ port <> ...», то итерация выполняется, однако «$ host $ port» внутри telnet не изменяет значение. :( – TPatriot

+0

Я не понимаю Стандартное перенаправление ввода не изменяет расширение переменных в командной строке оболочки. 'Telnet' не знает, что существуют переменные. Если перенаправление стандартного ввода заставляет цикл продолжать, тогда' read' прочитает следующую строку и задает «хозяин» и «порт» соответственно, чтобы они работали каждый раз через цикл. Сначала попробуйте более простой случай, чтобы убедиться, что вы можете заставить его работать: 'echo .... | while read host port; do echo «host: $ host»; echo «port: $ port»; done'. –

ответ

1

Как отметил Этан, telnet поедает остальную часть вашего ввода. Исправление состоит в перенаправлении ввода для telnet.

Изменить это:

telnet $host $port > ~/test_con/telnet_test.txt 

к этому:

telnet $host $port </dev/null > ~/test_con/telnet_test.txt 
+0

Спасибо, что по указанию Etan в фоновом процессе я отредактировал строку с 'telnet $ host $ port ~/test_con/telnet_test.txt & (sleep 2; kill $!) &' И это ALIIIIIVE!:) Теперь, чтобы скрыть это сообщение Connected, которое случайно появляется в bash: P – TPatriot

+0

Возможно, вы захотите перенаправить stderr telnet в/dev/null –