Bash предоставляет псевдо-устройства, с которыми вы, вероятно, знакомы, например /dev/null
. Однако есть и другие устройства, такие как /dev/tcp
и /dev/udp
для тестирования сетевых подключений, которые вы также можете использовать в скриптах Bash.
выдержка из справочной страницы Баша
Bash обрабатывает несколько имен файлов, особенно когда они используются в перенаправлениях, как описано в следующей таблице:
/dev/fd/fd
If fd is a valid integer, file descriptor fd is duplicated.
/dev/stdin
File descriptor 0 is duplicated.
/dev/stdout
File descriptor 1 is duplicated.
/dev/stderr
File descriptor 2 is duplicated.
/dev/tcp/host/port
If host is a valid hostname or Internet address, and port
is an integer port number or service name, bash attempts to
open a TCP connection to the corresponding socket.
/dev/udp/host/port
If host is a valid hostname or Internet address, and port
is an integer port number or service name, bash attempts to
open a UDP connection to the corresponding socket.
пример
Вот я тестирую соединение с хостом в моем домене с именем 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