Подтвердить что ты не робот

TCP-соединение, только bash

Я нашел эту строку в script. Хотя я в глобальном масштабе понимаю, что он делает - открывая двунаправленное TCP-соединение, мне нужны объяснения по синтаксису. Здесь строка:

exec 5<>"/dev/tcp/${SERVER}/${PORT}"

И мои вопросы:

  • < и > обычно используются для перенаправления IO. Что это значит? Можно ли использовать его в другом контексте? Как?
  • Почему это работает, а /dev/tcp не существует?
  • Почему 5? Может быть, это еще один номер? Каковы допустимые значения?
  • Почему требуется exec? (если ничего не выполняется)

Спасибо.

4b9b3361

Ответ 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.