Mit dem Befehl telnet docs.python.org 80
kann 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 HEAD
anstelle von verwenden GET
, erhalten Sie dieselbe Antwort wie bei einer GET
Anforderung, mit Ausnahme des Nachrichtentexts.
Verwenden HEAD
Sie diese Option, wenn Sie nur die HTTP-Header untersuchen möchten. (dh damit der Inhalt der Antwort Ihre Shell-Ausgabe nicht überladen.)
GET
Ihnen gepostete ausführe , wird eine408 Request Time-out
Fehlermeldung angezeigt. Auch istwget http://docs.python.org/2/license.html
keine Option?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.telnet docs.python.org 80
<ENTER>
GET /2/license.html HTTP/1.1
<ENTER>
Host: docs.python.org
<ENTER>
<ENTER>
<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-Artikelstelnet < request.txt
aber ich kann denGET
Befehl nicht zum Laufen bringen.Antworten:
Verwenden Sie also netcat (Befehl nc) anstelle von "telnet"
Telnet ist ein schneller und einfacher Hack, aber Netcat ist anscheinend das richtige Werkzeug für diesen Job.
quelle
Ich habe keine wirkliche Erfahrung damit,
telnet
aber es erfordert Eingaben von der Dateiumleitung:Ich kann es wie folgt dazu bringen, eine korrekte Verbindung zum Server herzustellen:
Vielleicht können Sie herausfinden, wie Sie den
GET
Befehl annehmen können, aber ich konnte nicht. Eine Alternative ist die Verwendung einesexpect
Skripts:Sie können das Skript dann speichern unter
telnet.exp
, es ausführbar machen und ausführen:quelle
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.nc
ist die bessere Lösung, sollten Sie es akzeptieren.interact
diesesexpect
Skript richtig beenden kann .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 vonman expect
). Auf dieseinteract
Weise kann der Benutzer die Telnet-Verbindung tatsächlich nutzen.telnet
anstatt mit ihr zu interagieren, sollten Sie damit endenclose -i $spawn_id
oder so ähnlich. Dann wird das Skript beendet. Mit konnteinteract
ich eigentlichtelnet
gar nicht aussteigen und musste mein Terminal schließen. Ziemlich elend (obwohl es teilweise meine Schuld gewesen sein kann.)