#linux #bash #sockets #tcp
#linux #bash #сокеты #tcp
Вопрос:
Я нашел эту строку в скрипте. Хотя я глобально понимаю, что он делает — открывает двунаправленное TCP-соединение, мне нужны некоторые пояснения по синтаксису. Вот строка:
exec 5<>"/dev/tcp/${SERVER}/${PORT}"
И мои вопросы:
<
и>
обычно используются для перенаправления iOS. Что это значит там? Можно ли использовать его в другом контексте? Как?- Почему это работает, хотя
/dev/tcp
не существует? - Почему 5? Может ли это быть другой номер? Какие допустимые значения?
- Зачем это
exec
нужно? (учитывая, что на самом деле ничего не выполняется)
Спасибо.
Ответ №1:
< и > обычно используются для перенаправления iOS. Что это значит там? Можно ли использовать его в другом контексте? Как?
Это то же самое — ввод и вывод перенаправляются на fd 5.
Почему это работает, в то время как /dev/tcp не существует?
Это специальный файл: если host является допустимым именем хоста или интернет-адресом, а port — целочисленным номером порта или именем службы, bash пытается открыть TCP-соединение с соответствующим сокетом.
Почему 5? Может ли это быть другой номер? Какие допустимые значения?
Да, это может быть любое значение, но вам нужно убедиться, что вы не используете уже используемый fd.
Зачем нужен exec? (учитывая, что на самом деле ничего не выполняется)
exec означает, что перенаправление происходит в текущей оболочке, а не в дочерней оболочке.
Комментарии:
1. В этом ответе есть важное предостережение. Bash будет учитывать «/ dev / tcp» только в том случае, если его поддержка включена при сборке bash. В частности, Red Hat создает bash с включенной функцией, в то время как Debian этого не делает (или, по крайней мере, они этого не делали, когда я проверял в последний раз, что было много лет назад). Не ожидайте, что это будет работать во всех оболочках или во всех bash.
Ответ №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.
Комментарии:
1. Это расширения, которые должны быть включены при компиляции bash (—enable-net-redirections ). Не все дистрибутивы Linux компилируют bash таким образом. Например, Debian и Ubuntu не включают его.
2. Хороший момент! Я действительно ценю предупреждения о совместимости.