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

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

27 голосов
/ 14 октября 2011

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

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

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

  1. < и > обычно используются для перенаправления ввода-вывода.Что это значит там?Это можно использовать в другом контексте?Как?
  2. Почему это работает, а /dev/tcp не существует?
  3. Почему 5?Это может быть другой номер?Какие допустимые значения?
  4. Почему необходимо exec?(на самом деле ничего не дано выполнено )

Спасибо.

Ответы [ 2 ]

17 голосов
/ 14 октября 2011

<и> обычно используются для перенаправления ввода-вывода. Что это значит там? Это можно использовать в другом контексте? Как?

То же самое - вход и выход перенаправлены на FD 5.

Почему это работает, а / dev / tcp не существует?

Это специальный файл: если host является действительным именем хоста или интернет-адресом, а port является целочисленным номером порта или именем службы, bash пытается открыть TCP-соединение с соответствующим сокетом.

Почему 5? Это может быть другой номер? Какие значения допустимы?

Да, это может быть любое значение, но вам нужно убедиться, что вы не используете уже используемый fd.

Зачем нужен exec? (учитывая, что на самом деле ничего не выполнено)

exec означает, что перенаправление происходит в текущей оболочке, а не в подоболочке.

3 голосов
/ 14 октября 2011

Я могу ответить только за исполнительную часть:

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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...