Редактирование командной строки (включая ярлыки) является функцией оболочки, не эмулятором терминала (по большей части). Поэтому просто поместите удар в emacs режим на удаленном xterm
:
$ set -o emacs
Bash предоставляет псевдоустройства, с которыми вы, вероятно, знакомы, такие как / dev / null
. Однако есть и другие устройства, такие как / dev / tcp
и / dev / udp
для тестирования сетевых соединений, которые вы также можете использовать из скриптов 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
Вы на правильном пути, используя 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
Я нашел похожий отчет об ошибке в трекере ошибок, который дал мне правильный намек. 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/*] выполнено успешно!
Я знаю, что ответ немного запоздал, но я искал, как это сделать, и использование 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)