Тест, если порт telnet активен в рамках сценария оболочки

Редактирование командной строки (включая ярлыки) является функцией оболочки, не эмулятором терминала (по большей части). Поэтому просто поместите удар в emacs режим на удаленном xterm:

$ set -o emacs
10
05.09.2014, 04:33
4 ответа

Bash предоставляет псевдоустройства, с которыми вы, вероятно, знакомы, такие как / dev / null . Однако есть и другие устройства, такие как / dev / tcp и / dev / udp для тестирования сетевых соединений, которые вы также можете использовать из скриптов Bash.

отрывок из справочной страницы Bash

Bash обрабатывает несколько имен файлов специально, когда они используются в перенаправления, как описано в следующей таблице:

  / dev / fd / fd
  Если fd - действительное целое число, дескриптор файла fd дублируется.
  / dev / stdin
  Дескриптор файла 0 дублируется.
  / dev / stdout
  Дескриптор файла 1 дублируется.
  / dev / stderr
  Дескриптор файла 2 дублируется.
  / dev / tcp / хост / порт
  Если host - допустимое имя хоста или Интернет-адрес, а порт
  - это целочисленный номер порта или имя службы, bash пытается
  открыть TCP-соединение с соответствующим сокетом.
  / dev / udp / хост / порт
  Если host - допустимое имя хоста или Интернет-адрес, а порт
  - это целочисленный номер порта или имя службы, bash пытается
  открыть UDP-соединение с соответствующим сокетом.
 

Пример

Вот я тестирую соединение с хостом в моем домене с именем skinner и смотрю, могу ли я подключиться к его порту 22.

ПРИМЕЧАНИЕ: Порт 22 предназначен для SSH, для использования telnet порт 23.

$ echo > /dev/tcp/skinner/22 && echo "it's up" || echo "it's down"
it's up

Отлично, давайте попробуем не порт:

$ echo > /dev/tcp/skinner/223 && echo "it's up" || echo "it's down"
bash: connect: Connection refused
bash: /dev/tcp/skinner/223: Connection refused
it's down

Хорошо, это работает, но вывод выглядит ужасно некрасиво. Не беспокоиться. Вы можете запустить echo> / dev / tcp / ... в подоболочке и перенаправить весь вывод в / dev / null , чтобы немного очистить его. Вот шаблон, который вы можете использовать в своих сценариях оболочки:

$ (echo > /dev/tcp/skinner/22) > /dev/null 2>&1 \
    && echo "it's up" || echo "it's down"
it's up

$ (echo > /dev/tcp/skinner/223) > /dev/null 2>&1 \
    && echo "it's up" || echo "it's down"
it's down
14
27.01.2020, 20:00

Вы на правильном пути, используя nc, но если вы действительно хотите просто проверить, можете ли вы установить соединение, используйте nc-z переключатель:

#!/bin/bash
REMOTEHOST=10.11.12.13
REMOTEPORT=1234
TIMEOUT=1

if nc -w $TIMEOUT -z $REMOTEHOST $REMOTEPORT; then
    echo "I was able to connect to ${REMOTEHOST}:${REMOTEPORT}"
else
    echo "Connection to ${REMOTEHOST}:${REMOTEPORT} failed. Exit code from Netcat was ($?)."
fi
7
27.01.2020, 20:00

Я нашел похожий отчет об ошибке в трекере ошибок, который дал мне правильный намек. https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=190669#c11

В основном отсутствует каталог Include. Поэтому я использую тюрьмы и мой clang версии 3.4.1, но в моем базовом jail включить каталог, где только include файлы для 3.3. Так что решение было просто скопировать файлы включения из базы в мои тюрьмы.

$ cd /usr/jails/basejail/usr/include/clang
$ ls
3.3
$ sudo cp -r /usr/include/clang/3.4.1 /usr/jails/basejail/usr/include/clang
-121--186473-

В случае, если ссылки идет вниз, вот резюме.

Сначала перейдите к master.cf и зарегистрируйте сценарий «myhook», добавив следующую строку:

myhook unix - n n - - флаги канала = F user = www-data argv =/path/to/script.sh $ {sender} $ {size} $ {recipient}

Кроме того, отредактируйте smtp-строку, чтобы сообщить Postfix запустить фильтр для любой почты, поступающей через SMTP-доставку:

smtp inet n - - - smtpd -o content_filter=myhook:dummy

Please обратите внимание, что если вы отправляете почту с помощью команды «sendmail», фильтр не запустится. В этом случае добавьте опцию после метода доставки «pickup»:

pickup fifo n - - 60 1 pickup -o content_filter=myhook:dummy

Restart postfix: postfix reload

Сделайте сценарий читаемым и исполняемым кем угодно: chmod + rx script.sh

Обратите внимание, что сценарий всегда запускается для любой поступающей почты. Чтобы указать точный адрес, обратитесь к ответу @ MaringMatutiae.

-121--48391-

запуск nc -z 192,168,10,5 23 в командной строке или создайте сценарий bash для выполнения этой команды.

В случае успешного подключения возвращается приведенная ниже инструкция.

Подключение к порту 192.168.10.5 23 [tcp/*] выполнено успешно!

1
27.01.2020, 20:00

Я знаю, что ответ немного запоздал, но я искал, как это сделать, и использование nc не было вариантом из соображений безопасности, так что вот он, если он может кому-то помочь.

Чего не хватало в вашем первоначальном эхе, так это переключателя -e:

   -e     enable interpretation of backslash escapes
   -E     disable interpretation of backslash escapes (default)

И новая строка + команда quit для выхода из telnet после отключения. Таким образом:

echo -e '\035\nquit' | telnet 10.0.0.1 23 && echo "success" || echo "failed"

Очевидно, то же самое будет работать, если вы используете оператор if в блочном стиле и вычисляете $? как вы делали вначале:

echo -e '\035\nquit' | telnet 10.0.0.1 23
if [ $? -eq 1 ]
then
  echo "Console is down."
fi

Пока мы на этом, что касается nc, это зависит от того, какой вариант nc у вас есть (gnu ncat против nmap -ncat ). Gnu будет иметь переключатель -z :

.
  -z                         Zero-I/O mode, report connection status only
nc -z 10.0.0.1 23
# (evaluate $? here)

в то время как другой не будет, и вам придется передать пустую строку на ваш NC, чтобы не застрять:

echo | nc 10.0.0.1 23
# (evaluate $? here)
3
27.01.2020, 20:00

Теги

Похожие вопросы