Яка система, схожа на 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 рядки коду.
peterh

Але чи є якась інша ОС, яка це вже робить? У якийсь момент я подумав, що План 9 це зробив, але помилявся.
Сільвен Леру

1
Я не знаю, напевно, ні (наскільки я знаю, це вигадливий винахід). Я проголосував за ваше запитання, бо відповідь цікава і для мене. Наскільки я знаю, жодна популярна x86-сумісна ОС Unix не може цього зробити.
петерх

Відповіді:


8

Я думаю, що документація Баша на цю тему дещо вводить в оману. Дивлячись на код, навіть повернутися до версії 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 буде ручкою модуля STREAMS tcp.
Стефан Шазелас
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.