Warum muss <oder> / dev / tcp verwendet werden?

13

Wenn Sie versuchen anzurufen /dev/tcp/www.google.com/80, geben Sie Folgendes ein

/dev/tcp/www.google.com/80

Bash sagt no such file or directory. Wenn sie sich den Code anderer Leute online ansehen, verwenden sie Syntax wie

 3<>/dev/tcp/www.google.com/80

Mir ist aufgefallen, dass das auch funktioniert:

</dev/tcp/www.google.com/80

Warum werden diese Symbole benötigt, um bestimmte Dinge in der Bash aufzurufen?

John Doe
quelle
2
Was meinst du mit "anrufen"? Bitte zeigen Sie uns, was Sie tun, wenn Sie die Fehlermeldung erhalten. Versuchen Sie es auszuführen? Selbst wenn die Startseite von Google ausführbarer Code wäre, würde ich es nicht empfehlen.
Strg-Alt-Delor
/dev/tcp/www.google.com/80
john doe
Ich habe deine Frage bearbeitet, um zu sagen, was ich meine.
Strg-Alt-Delor

Antworten:

29

Denn das ist ein Merkmal der Shell (von ksh, kopiert von bash) und nur der Shell.

/dev/tcp/...Wenn es sich nicht um echte Dateien handelt, fängt die Shell die Versuche ab, zu einer /dev/tcp/...Datei umzuleiten, und führt dann in diesem Fall eine socket(...);connect(...)(stellt eine TCP-Verbindung her) anstelle einer open("/dev/tcp/..."...)(Öffnen dieser Datei) aus.

Beachten Sie, dass es so geschrieben werden muss. cat < /dev/./tcp/...oder ///dev/tcp/...funktioniert nicht und versucht stattdessen, diese Dateien zu öffnen (was auf den meisten Systemen nicht vorhanden ist und Ihnen eine Fehlermeldung angezeigt wird).

Die Richtung der Umleitung spielt ebenfalls keine Rolle. Egal , ob Sie 3< /dev/tcp/...oder 3> /dev/tcp/...oder 3<> /dev/tcp/...oder gar 3>> /dev/tcp/...keinen Unterschied machen, werden Sie zum Lesen und Schreiben von / auf diese Dateideskriptor der Lage sein , zu empfangen / Sendedaten über diesen TCP - Socket.

Wenn Sie dies tun cat /dev/tcp/..., funktioniert dies nicht, da catnicht dieselbe spezielle Behandlung implementiert wird. Dies gilt open("/dev/tcp/...")für jede Datei (außer -), nur für die Shell (nur ksh, bash) und nur für das Ziel von Umleitungen.

Dies cat -ist ein weiteres Beispiel für einen speziell behandelten Dateipfad. Anstelle von a open("-")liest es direkt aus dem Dateideskriptor 0 (stdin). catUnd viele Text-Dienstprogramme tun dies, die Shell sorgt nicht für ihre Weiterleitungen. Zum Lesen des Inhalts der -Datei benötigen Sie cat ./-oder cat < -(oder cat - < -). Auf Systemen, die keine haben /dev/stdin, bashwird jedoch etwas Ähnliches für Umleitungen von dieser (virtuellen) Datei tun. GNU awkmacht das gleiche für /dev/stdin, /dev/stdout, /dev/stderrauch auf Systeme , die solche Dateien zu tun haben , das einige Überraschungen auf Systeme wie Linux verursachen kann , wo diese Dateien anders verhalten.

zshUnterstützt auch TCP- Sockets (und Unix-Domain-Streams), dies geschieht jedoch mit ztcp(und zsocket) eingebauten Sockets, sodass es weniger eingeschränkt ist als der ksh / bash-Ansatz. Insbesondere kann es auch als Server fungieren, was ksh / bash nicht kann. Es ist jedoch immer noch viel begrenzter als das, was Sie in einer echten Programmiersprache tun können.

Stéphane Chazelas
quelle
4

Sie scheinen die Ideen zu verwirren oder eine Datei zu lesen und einen Befehl auszuführen. Der Unterschied zwischen Daten und Anweisungen.

Die Google-Startseite ist kein ausführbares Programm. Und wenn es so wäre, wäre es nicht sicher, es zu betreiben.

Die Umleitungszeichen (einschließlich <und >) werden verwendet, um Daten in einen Befehl umzuleiten .

cat < /dev/tcp/towel.blinkenlights.nl/23Dies funktioniert jedoch nicht, /dev/tcp/www.google.com/80da dieser Port erst nach dem Senden antwortetGET / HTTP/1.0\r\n\r\n

Also versuche

{
  printf >&3 'GET / HTTP/1.0\r\n\r\n'
  cat <&3
} 3<>/dev/tcp/www.google.com/80
Strg-Alt-Delor
quelle
1
Sie erhalten eine andere Fehlermeldung, wenn die Datei existiert, aber nicht ausführbar ist.
Barmar