Inhalt einer Textdatei als Befehl an Telnet übergeben


10

Mit dem Befehl telnet docs.python.org 80kann ich eine manuelle HTTP-Anforderung ausführen http://docs.python.org/2/license.html, indem ich die tatsächliche Anforderung eingebe.

Anstatt es jetzt live einzugeben, möchte ich die Anfrage aus einer Textdatei füttern.

Ich habe es versucht:

cat request.txt|telnet docs.python.org 80


request.txt :

GET /2/license.html HTTP/1.1 
Host: docs.python.org

(Sie müssen die Datei mit einer leeren Zeile beenden, sonst erhalten Sie eine schlechte Anfrage!)


Die Verbindung zum Server wird jedoch sofort geschlossen.

Wie soll ich das richtig Rohr request.txt zu telnet docs.python.org 80?


bearbeiten:

Es ist gut zu wissen; Wenn Sie HEADanstelle von verwenden GET, erhalten Sie dieselbe Antwort wie bei einer GETAnforderung, mit Ausnahme des Nachrichtentexts.
Verwenden HEADSie diese Option, wenn Sie nur die HTTP-Header untersuchen möchten. (dh damit der Inhalt der Antwort Ihre Shell-Ausgabe nicht überladen.)


Könnten Sie den tatsächlichen Befehl einfügen, den Sie manuell ausführen, damit wir ihn vergleichen können? Wenn ich das von GETIhnen gepostete ausführe , wird eine 408 Request Time-outFehlermeldung angezeigt. Auch ist wget http://docs.python.org/2/license.htmlkeine Option?
Terdon

Die Befehle sind korrekt. Ich denke, Sie stellen in dem Moment, in dem Sie eintreten telnet docs.python.org 80, eine Verbindung mit dem Server her. Sie müssen sich also beeilen und diese beiden Zeilen (Kopieren, Einfügen, falls erforderlich) innerhalb weniger Sekunden eingeben, da sonst der Server einen Timeout-Fehler zurückgibt.
Bentley4

Dies sind die genauen Befehle:telnet docs.python.org 80 <ENTER> GET /2/license.html HTTP/1.1 <ENTER> Host: docs.python.org <ENTER> <ENTER>
Bentley4

1
Ich denke, der Grund, warum Sie <ENTER>am Ende ein zweites Mal eingeben müssen, ist, dass das HTTP-Protokoll nach den Anforderungsheadern eine zusätzliche Leerzeile erfordert. Siehe den Abschnitt mit den Anforderungsnachrichten des HTTP-Wiki-Artikels
Bentley4,

1
Verdammt, theoretisch sollten Sie dazu in der Lage sein, telnet < request.txtaber ich kann den GETBefehl nicht zum Laufen bringen.
Terdon

Antworten:


21

Verwenden Sie also netcat (Befehl nc) anstelle von "telnet"

cat request.txt | nc docs.python.org 80

Telnet ist ein schneller und einfacher Hack, aber Netcat ist anscheinend das richtige Werkzeug für diesen Job.


Wie ist Telnet "schneller" und "einfacher" als Netcap? Ich sehe diesbezüglich keinen Verwendungsunterschied für diesen Fall.
Bentley4

Sicher nicht für diesen Fall, aber ich denke, die Leute (lesen Sie mich und anscheinend Sie !!!) neigen dazu, Telnet zu verwenden, weil es das erste ist, was wir gelernt haben, und natürlich unter Windows und Linux, wo ich glaube, dass Netcat verfügbar ist ist unter Windows nicht vorinstalliert.
Davidgo

5

Ich habe keine wirkliche Erfahrung damit, telnetaber es erfordert Eingaben von der Dateiumleitung:

telnet < abc.txt

Ich kann es wie folgt dazu bringen, eine korrekte Verbindung zum Server herzustellen:

$ cat abc.txt
open docs.python.org 80
$ telnet < abc.txt
telnet> Trying 82.94.164.162...
Connected to dinsdale.python.org.
Escape character is '^]'.
Connection closed by foreign host.

Vielleicht können Sie herausfinden, wie Sie den GETBefehl annehmen können, aber ich konnte nicht. Eine Alternative ist die Verwendung eines expectSkripts:

#!/usr/bin/expect

spawn telnet docs.python.org 80
expect "Escape character is '^]'." { 
     send "GET /2/license.html HTTP/1.1\nHost: docs.python.org\n\n" 
}
interact

Sie können das Skript dann speichern unter telnet.exp, es ausführbar machen und ausführen:

./telnet.exp > output.html

Cool, ich wusste es nicht expect! Ich habe Davidgos Antwort gewählt, weil es nur die beste Lösung für diesen Fall ist. Ich sehe keinen Nutzungsunterschied zwischen Netcap und Telnet für das, was ich erreichen wollte. Trotzdem vielen Dank für die Mühe, Terdon, wenn ich Ihre Antwort mehr unterstützen könnte, würde ich es tun.
Bentley4

1
@ Bentley4 kein Problem, mit ncist die bessere Lösung, sollten Sie es akzeptieren.
Terdon

Ich verstehe nicht, wie ich interactdieses expectSkript richtig beenden kann .
2rs2ts

@ 2rs2ts Ich weiß sehr wenig über erwarten, Sie könnten Recht haben, aber ich kann es nicht sagen, da Ihr Kommentar mir nicht gesagt hat, warum Sie denken, dass es falsch ist. Mein Verständnis ist, dass interact"dem Benutzer die Kontrolle über den aktuellen Prozess gibt, so dass Tastenanschläge an den aktuellen Prozess gesendet werden und stdout und stderr des aktuellen Prozesses zurückgegeben werden" (das ist von man expect). Auf diese interactWeise kann der Benutzer die Telnet-Verbindung tatsächlich nutzen.
Terdon

Da es bei der ursprünglichen Frage darum ging, den Inhalt einer Datei einzuspeisen, telnetanstatt mit ihr zu interagieren, sollten Sie damit enden close -i $spawn_idoder so ähnlich. Dann wird das Skript beendet. Mit konnte interactich eigentlich telnetgar nicht aussteigen und musste mein Terminal schließen. Ziemlich elend (obwohl es teilweise meine Schuld gewesen sein kann.)
2rs2ts
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.