Który system uniksowy naprawdę udostępnia specjalny plik / dev / tcp?

9

Wiem, że /dev/tcp/<host>/<port>to magiczna ścieżka obsługiwana przez niektóre pociski w przekierowaniach. Ale zgodnie z man bash:

Jeśli system operacyjny, na którym działa bash, zapewnia te specjalne pliki, bash ich użyje; w przeciwnym razie będzie naśladować je wewnętrznie [...]

Na komputerze z Linuksem, którego teraz używam, /dev/tcpspecjalny plik nie jest obecny, więc Bash go naśladuje . Ale czy faktycznie istnieje system podobny do Uniksa, który zapewnia /dev/tcpspecjalnemu plikowi ten sam semantyczny, co ten obsługiwany przez Bash?

Sylvain Leroux
źródło
Wymagałoby to emulowanego katalogu. Tworzenie emulowanych katalogów jest możliwe tylko w określonych systemach plików, na przykład procfs lub sysfs mogą to zrobić. /devjest tmpfs na aktualnych linuksach, i był na partycji root w starszych. Dlatego obecnie jest to niemożliwe. Można to łatwo uczynić za pomocą rozszerzenia sysfs lub procfs (oba fs są bardzo elastyczne i podobne (w rzeczywistości prawdopodobnie nikt nie wie, dlaczego nie są takie same)), nikt tego dzisiaj nie robi, ale można to zrobić w około 100 wiersze kodu.
peterh - Przywróć Monikę
Ale czy jest już jakiś inny system operacyjny? W pewnym momencie myślałem, że Plan 9 to zrobił, ale się myliłem.
Sylvain Leroux
1
Nie wiem, prawdopodobnie nie (o ile wiem, to wynalazek bash). Głosowałem za twoim pytaniem, ponieważ odpowiedź jest dla mnie interesująca. O ile wiem, żaden popularny system operacyjny Unix z procesorem x86 nie jest w stanie tego zrobić.
peterh - Przywróć Monikę

Odpowiedzi:

8

Myślę, że dokumentacja Bash jest nieco myląca w tym temacie. Patrząc na kod, nawet wracając do wersji 2.04, gdzie zostały wprowadzone przekierowania sieci, /dev/tcpi /dev/udpdziała w następujący sposób:

  • w czasie kompilacji configureskrypt sprawdza, czy obsługiwane są różne funkcje sieciowe; jeśli tak, jeśli przekierowania sieciowe są włączone (tak jest domyślnie), wbudowany jest wewnętrzny kod sieci;
  • w czasie wykonywania, jeśli wewnętrzny kod sieci jest wbudowany /dev/tcpi /dev/udp(we właściwym formacie) jest obsługiwany wewnętrznie; w przeciwnym razie generowane jest ostrzeżenie („/ dev / (tcp | udp) / host / port nie jest obsługiwane bez pracy w sieci”) i Bash próbuje otworzyć daną ścieżkę w systemie;
  • jeśli skonfigurowano przekierowania sieciowe, nic specjalnego nie zostanie zrobione.

Sprowadza się to do:

  • jeśli przekierowanie sieci jest włączone:
    • jeśli sieć jest obsługiwana na platformie docelowej /dev/tcpi /dev/udpzawsze będzie obsługiwana wewnętrznie;
    • w przeciwnym razie Bash ostrzeże i spróbuje otworzyć plik „na ślepo”; jeśli system jakoś obsługuje /dev/(tcp|udp)/host/port, to zostanie użyte, w przeciwnym razie przekierowanie nie powiedzie się;
  • jeśli przekierowanie sieci jest wyłączone, nie jest przeprowadzana żadna specjalna obsługa; jak wyżej, jeśli system w jakiś sposób obsługuje /dev/(tcp|udp)/host/port, zostanie użyty, w przeciwnym razie przekierowanie nie powiedzie się.

/dev/tcpistnieje w niektórych systemach, ale o ile wiem, żaden nie obsługuje takiej samej abstrakcji jak Bash. W /dev/tcpsystemie Solaris jest używany z nddnarzędziem do wysyłania zapytań i zmiany konfiguracji sieci. W XTI (patrz także otwarta grupa, jeśli jesteś członkiem), t_openfunkcji można użyć /dev/tcpdo otwarcia połączenia TCP, ale nie używa ona konfiguracji opartej na ścieżce, istnieje osobna struktura danych, aby określić hosta docelowego i port (i inne parametry).

Stephen Kitt
źródło
Sama funkcja pochodzi z ksh93. / dev / tcp w systemach SysV byłby uchwytem w module STREAMS tcp.
Stéphane Chazelas