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

#linux #bash #sockets #tcp

#linux #bash #сокеты #tcp

Вопрос:

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

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

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

  1. < и > обычно используются для перенаправления iOS. Что это значит там? Можно ли использовать его в другом контексте? Как?
  2. Почему это работает, хотя /dev/tcp не существует?
  3. Почему 5? Может ли это быть другой номер? Какие допустимые значения?
  4. Зачем это 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. Хороший момент! Я действительно ценю предупреждения о совместимости.