Shell Script - Telnet несколько хостов: порты

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

person TPatriot    schedule 01.04.2015    source источник
comment
Если telnet работает как ssh, то он съедает содержимое стандартного ввода, прежде чем ваш цикл сможет зацикливаться. Перенаправьте stdin для процесса telnet и посмотрите, поможет ли это.   -  person Etan Reisner    schedule 01.04.2015
comment
@EtanReisner Если я сделаю «telnet $ host $ port‹ ›...», while будет повторяться, однако «$ host $ port» внутри telnet не изменит значения. :(   -  person TPatriot    schedule 01.04.2015
comment
Я не понимаю. Стандартное перенаправление ввода не меняет раскрытие переменных в командной строке оболочки. telnet не знает, что были переменные. Если перенаправление стандартного ввода заставляет цикл продолжаться, тогда read будет читать следующую строку и установить host и port соответственно, чтобы они работали каждый раз в цикле. Сначала попробуйте более простой случай, чтобы убедиться, что он работает: echo .... | while read host port; do echo "host: $host"; echo "port: $port"; done.   -  person Etan Reisner    schedule 01.04.2015
comment
@EtanReisner Переменные, отображаемые внутри значения изменения if, но не переменные внутри telnet, поэтому он продолжает выполнять операции Telnet с одним и тем же host port, в то время как echo печатает host port, который он на самом деле должен ... странно, я знаю ...   -  person TPatriot    schedule 01.04.2015
comment
В телнете нет переменных. Вы используете telnet $host $port. Если echo $host $port работает правильно, то и telnet $host $post. Но я также только что заметил, что вы, кажется, убиваете фоновую суб-оболочку, а не саму команду telnet. Это намеренно?   -  person Etan Reisner    schedule 01.04.2015
comment
@EtanReisner Noob, вопрос, разве это kill $! не убьет последний запущенный процесс? который в данном случае должен быть telnet. Также в telnet, возможно, было плохо сказано, хорошо, что вы поняли :)   -  person TPatriot    schedule 01.04.2015
comment
$! - последний фоновый процесс. Единственный имеющийся у вас фоновый процесс - это суб-оболочка. Так что это будет либо под-оболочка, либо ничего (в зависимости от того, как именно она взаимодействует), я думаю.   -  person Etan Reisner    schedule 01.04.2015


Ответы (2)


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

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

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

к этому:

telnet $host $port </dev/null > ~/test_con/telnet_test.txt
person glenn jackman    schedule 01.04.2015
comment
Спасибо, что по указанию Этана о фоновом процессе я отредактировал строку с помощью telnet $host $port </dev/null > ~/test_con/telnet_test.txt & (sleep 2; kill $!)&, и это ALIIIIIVE! :) Теперь, чтобы скрыть это сообщение Connected, которое случайно появляется в bash: P - person TPatriot; 01.04.2015
comment
Вероятно, вы захотите перенаправить stderr telnet на / dev / null - person glenn jackman; 01.04.2015

Я добавил файл сценария оболочки и просто запустил его. Этот скрипт получает серверы и порты из списка ниже.

for i in {10.21.xxx.yyy,10.21.xxx.yyy,10.23.xxx.yyy};
do
        for j in {5501,5502,5503,5504,7701,7702,7703,7704,5551,5552,5553,7771,7772,7773};
        do
                (echo > /dev/tcp/${i}/${j}) > /dev/null 2>&1 && echo "${i}:${j} :: it's getting connected" || echo "${i}:${j} :: it's not connecting"
        done
done
person Anand Varkey Philips    schedule 24.08.2018