Какая Unix-подобная система действительно предоставляет специальный файл / dev / tcp?

9

Я знаю, /dev/tcp/<host>/<port>что это магический путь, который обрабатывается определенными оболочками в перенаправлениях. Но согласно man bash:

Если операционная система, в которой работает bash, предоставляет эти специальные файлы, bash будет использовать их; иначе это будет подражать им внутренне [...]

На Linux-коробке, которую я сейчас использую, /dev/tcpспециального файла нет, поэтому Bash будет эмулировать его. Но существует ли на самом деле Unix-подобная система, которая предоставляет /dev/tcpспециальному файлу ту же семантику, что и поддерживаемая Bash?

Сильвен Леру
источник
Это потребовало бы эмулируемого каталога. Создание эмулируемых каталогов возможно только с конкретными файловыми системами, например, это могут делать procfs или sysfs. /devЭто tmpfs на текущих Linux, и он был в корневом разделе в старых. Вот почему это невозможно в настоящее время. Это можно легко сделать с помощью расширения sysfs или procfs (оба fs очень гибкие и похожие (на самом деле, вероятно, никто не знает, почему они не одинаковые)), никто не делает это сегодня, но это можно сделать примерно за 100 строки кода.
Петер - Восстановить Монику
Но есть ли другие ОС, которые это уже делают? В какой-то момент я думал, что План 9 сделал это, но я был неправ.
Сильвен Леру
1
Я не знаю, вероятно нет (насколько я знаю, это изобретение Bash). Я проголосовал за ваш вопрос, потому что ответ интересен и мне. Насколько я знаю, ни одна популярная x86-совместимая ОС Unix не может этого сделать.
Петер - Восстановить Монику

Ответы:

8

Я думаю, что документация Bash несколько вводит в заблуждение по этой теме. Глядя на код, даже возвращаясь к версии 2.04, где были введены перенаправления в сети, /dev/tcpи /dev/udpработает следующим образом:

  • во время сборки configureскрипт проверяет, поддерживаются ли различные сетевые функции; если это так, если сетевое перенаправление включено (что имеет место по умолчанию), встроенный внутренний сетевой код;
  • во время выполнения, если внутренний сетевой код встроен /dev/tcpи /dev/udp(в правильном формате) обрабатывается внутренне; в противном случае выдается предупреждение («/ dev / (tcp | udp) / хост / порт не поддерживается без подключения к сети»), и Bash пытается открыть указанный путь в системе;
  • если сетевые перенаправления настроены, ничего особенного не делается.

То, к чему это сводится, является:

  • если перенаправление сети включено:
    • поддерживается ли сеть на целевой платформе /dev/tcpи /dev/udpвсегда будет обрабатываться внутри организации;
    • в противном случае Bash предупредит и попытается открыть файл «вслепую»; если система каким-то образом поддерживает /dev/(tcp|udp)/host/port, то будет использоваться, иначе, по всей вероятности, перенаправление не удастся;
  • если перенаправление сети отключено, специальная обработка не выполняется; как указано выше, если система каким-либо образом поддерживает /dev/(tcp|udp)/host/port, то будет использоваться, иначе, по всей вероятности, перенаправление не удастся.

/dev/tcpсуществует в некоторых системах, но, насколько я знаю, никто не поддерживает ту же абстракцию, что и Bash. На Solaris /dev/tcpиспользуется с nddинструментом для запроса и изменения конфигурации сети. В XTI (см. Также «Открытая группа», если вы член) эту t_openфункцию можно использовать /dev/tcpдля открытия TCP-соединения, но она не использует настройку на основе пути, есть отдельная структура данных для указания целевого хоста и порт (и другие параметры).

Стивен Китт
источник
Сама функция взята из ksh93. / dev / tcp в системах SysV будет дескриптором tcp-модуля STREAMS .
Стефан