Welches Unix-ähnliche System bietet wirklich die spezielle Datei / dev / tcp?

9

Ich weiß, dass /dev/tcp/<host>/<port>es sich um einen magischen Pfad handelt, der speziell von einigen Muscheln in Umleitungen behandelt wird. Aber laut man bash:

Wenn das Betriebssystem, auf dem bash ausgeführt wird, diese speziellen Dateien bereitstellt, verwendet bash sie. Andernfalls werden sie intern emuliert [...]

Auf der Linux-Box, die ich gerade verwende, ist die /dev/tcpspezielle Datei nicht vorhanden, daher wird sie vom Bash emuliert . Aber gibt es tatsächlich ein Unix-ähnliches System, das der /dev/tcpspeziellen Datei dieselbe Semantik verleiht wie der von Bash unterstützten?

Sylvain Leroux
quelle
Es würde ein emuliertes Verzeichnis erfordern. Das Erstellen emulierter Verzeichnisse ist nur mit bestimmten Dateisystemen möglich, z. B. können procfs oder sysfs dies tun. /devist ein tmpfs unter aktuellen Linux, und es war auf der Root-Partition in älteren. Deshalb ist es derzeit unmöglich. Es könnte leicht mit einer sysfs- oder procfs-Erweiterung ermöglicht werden (beide fs sind sehr flexibel und ähnlich (eigentlich weiß wahrscheinlich niemand, warum sie nicht gleich sind)), niemand tut es heute, aber es könnte in ungefähr 100 gemacht werden Zeilen von Code.
Peterh
Aber gibt es ein anderes Betriebssystem, das dies bereits tut? Irgendwann dachte ich, Plan 9 hätte es geschafft, aber ich habe mich geirrt.
Sylvain Leroux
1
Ich weiß es nicht, wahrscheinlich auch nicht (soweit ich weiß, handelt es sich um eine Bash-Erfindung). Ich habe Ihre Frage abgelehnt, weil die Antwort auch für mich interessant ist. Soweit ich weiß, kann dies kein beliebtes x86-fähiges Unix-Betriebssystem.
Peter

Antworten:

8

Ich denke, die Bash-Dokumentation ist zu diesem Thema etwas irreführend. Wenn Sie sich den Code ansehen, gehen Sie sogar zurück zu Version 2.04, in der Netzwerkumleitungen eingeführt wurden, /dev/tcpund /dev/udpfunktionieren Sie wie folgt:

  • Während der Erstellung configureüberprüft das Skript, ob verschiedene Netzwerkfunktionen unterstützt werden. Wenn dies der Fall ist und Netzwerkumleitungen aktiviert sind (was standardmäßig der Fall ist), ist interner Netzwerkcode integriert.
  • zur Laufzeit, wenn der interne Netzwerkcode integriert ist /dev/tcpund /dev/udp(im richtigen Format) intern verarbeitet wird; Andernfalls wird eine Warnung ausgegeben ("/ dev / (tcp | udp) / host / port wird ohne Netzwerk nicht unterstützt") und Bash versucht, den angegebenen Pfad auf dem System zu öffnen.
  • Wenn Netzwerkumleitungen konfiguriert sind, wird nichts Besonderes getan.

Worauf es ankommt, ist:

  • Wenn die Netzwerkumleitung aktiviert ist:
    • wenn das Netzwerk auf der Zielplattform unterstützt wird /dev/tcpund /dev/udpimmer intern gehandhabt wird;
    • Andernfalls warnt Bash und versucht, die Datei "blind" zu öffnen. Wenn das System dies irgendwie unterstützt /dev/(tcp|udp)/host/port, wird dies verwendet, andernfalls schlägt die Umleitung aller Wahrscheinlichkeit nach fehl.
  • Wenn die Netzwerkumleitung deaktiviert ist, wird keine spezielle Behandlung durchgeführt. Wie oben, wenn das System irgendwie unterstützt /dev/(tcp|udp)/host/port, wird dies verwendet, andernfalls schlägt die Umleitung aller Wahrscheinlichkeit nach fehl.

/dev/tcpexistiert auf einigen Systemen, aber meines Wissens unterstützt keine die gleiche Abstraktion wie Bash. Wird unter Solaris /dev/tcpmit dem nddTool zum Abfragen und Ändern der Netzwerkkonfiguration verwendet. In XTI (siehe auch Open Group, wenn Sie Mitglied sind) kann die t_openFunktion /dev/tcpzum Öffnen einer TCP-Verbindung verwendet werden, verwendet jedoch kein pfadbasiertes Setup. Es gibt eine separate Datenstruktur zum Angeben des Zielhosts und Port (und andere Parameter).

Stephen Kitt
quelle
Die Funktion selbst stammt von ksh93. / dev / tcp auf SysV-Systemen wäre ein Handle auf dem STREAMS- TCP-Modul.
Stéphane Chazelas