TCP-соединение, только bash
Я нашел эту строку в script. Хотя я в глобальном масштабе понимаю, что он делает - открывая двунаправленное TCP-соединение, мне нужны объяснения по синтаксису. Здесь строка:
exec 5<>"/dev/tcp/${SERVER}/${PORT}"
И мои вопросы:
-
<
и >
обычно используются для перенаправления IO. Что это значит? Можно ли использовать его в другом контексте? Как?
- Почему это работает, а
/dev/tcp
не существует?
- Почему 5? Может быть, это еще один номер? Каковы допустимые значения?
- Почему требуется
exec
? (если ничего не выполняется)
Спасибо.
Ответы
Ответ 1
< и > обычно используются для перенаправления IO. Что это значит? Можно ли использовать его в другом контексте? Как?
То же самое: ввод и вывод перенаправляются на fd 5.
Почему это работает, а /dev/tcp не существует?
Это специальный файл: если хост является допустимым именем хоста или интернет-адресом, а порт является целым номером порта или именем службы, bash пытается открыть TCP-соединение с соответствующим сокетом.
Почему 5? Может быть, это еще один номер? Каковы допустимые значения?
Да, это может быть любое значение, но вам нужно убедиться, что вы не используете fd, который уже используется.
Почему нужен exec? (если ничего не выполняется)
exec означает, что перенаправление происходит в текущей оболочке, а не под подоболочкой.
Ответ 2
Я могу ответить только за часть exec:
exec без указанной команды может использоваться для изменения перенаправления ввода-вывода. < > в этом случае означает открытый для чтения + запись. 5 - номер канала (или дескриптор файла). Это имеет смысл, если другие команды отправляют свой вывод/считывают свои данные с канала 5.
Для "/dev/tcp/${SERVER}/${PORT}" Я не знаю, является ли это особенностью конкретной версии Linux или если она имеет функцию bash (я предполагаю, что последняя).
- ИЗМЕНИТЬ: из справочной страницы bash: -
Bash handles several filenames specially when they are used
in redirections, as described in the following table:
/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.