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?
linux
bash
io-redirection
devices
John Doe
quelle
quelle
Antworten:
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 einesocket(...);connect(...)
(stellt eine TCP-Verbindung her) anstelle eineropen("/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/...
oder3> /dev/tcp/...
oder3<> /dev/tcp/...
oder gar3>> /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, dacat
nicht dieselbe spezielle Behandlung implementiert wird. Dies giltopen("/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 aopen("-")
liest es direkt aus dem Dateideskriptor 0 (stdin).cat
Und viele Text-Dienstprogramme tun dies, die Shell sorgt nicht für ihre Weiterleitungen. Zum Lesen des Inhalts der-
Datei benötigen Siecat ./-
odercat < -
(odercat - < -
). Auf Systemen, die keine haben/dev/stdin
,bash
wird jedoch etwas Ähnliches für Umleitungen von dieser (virtuellen) Datei tun. GNUawk
macht das gleiche für/dev/stdin
,/dev/stdout
,/dev/stderr
auch auf Systeme , die solche Dateien zu tun haben , das einige Überraschungen auf Systeme wie Linux verursachen kann , wo diese Dateien anders verhalten.zsh
Unterstützt auch TCP- Sockets (und Unix-Domain-Streams), dies geschieht jedoch mitztcp
(undzsocket
) 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.quelle
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/23
Dies funktioniert jedoch nicht,/dev/tcp/www.google.com/80
da dieser Port erst nach dem Senden antwortetGET / HTTP/1.0\r\n\r\n
Also versuche
quelle