Ich habe dein Problem repliziert. Wenn ich eine Verbindung zu einem anderen nc
Browser herstelle, sehe ich, dass die Antwort sofort gesendet wird. Ich glaube, Ihr Browser erhält auch die Antwort, aber da nc
die Verbindung nicht abgebrochen wird, weiß der Browser nicht, dass dies alles ist, und es ist in Ordnung, mit der Umleitung fortzufahren.
(Hinweis: Während meiner Tests benötigte ich das letzte \r\n
in der Antwort von nc
, um meinen Browser erfolgreich umzuleiten. Daher verwenden alle meine Beispiele diesen Fix.)
Edit: einfaches Update
Hier habe ich folgendes gefunden:
HTTP-Anforderungen und HTTP-Antworten verwenden ein generisches Nachrichtenformat von RFC 822 zum Übertragen der erforderlichen Daten. Dieses generische Nachrichtenformat besteht aus den folgenden vier Elementen.
- [...]
- [...]
- Eine leere Zeile (dh eine Zeile, bei der der CRLF nichts vorausgeht), die das Ende der Kopfzeilenfelder angibt
- [...]
Ihre Antwort sollte also lauten:
printf 'HTTP/1.1 302 Moved\r\nLocation: https://www.eff.org/\r\n\r\n' | ...
Nachdem Sie dies erhalten haben, sollte Ihr Browser die Umleitung fortsetzen und die Verbindung in nc
seinem eigenen Namen beenden . Anfang Dezember 2017 arbeitet es mit Opera und Vivaldi zusammen; Es funktioniert nicht mit Firefox, Chrome oder Safari, für die Sie möglicherweise ein anderes Update benötigen (siehe unten).
Ursprüngliche, jetzt minderwertige Antwort (kann bei Nicht-HTTP-Kommunikation immer noch nützlich sein nc
)
Nach dieser Antwort auf Server Fehler Sie verwenden müssen -c
, -q
oder ähnliche Option, je nach nc
Ausführung.
In meinem Debian habe ich die -q
fähige Version installiert. Dann
printf 'HTTP/1.1 302 Moved\r\nLocation: https://www.eff.org/\r\n' | nc -q 0 -l -p 2345
funktioniert gut (Hinweis, ich muss auch -p
Port angeben). Die Erklärung lautet:
-q seconds
nachEOF
aufstdin
, warten die angegebene Anzahl von Sekunden und dann beenden. Wenn Sekunden negativ ist, warten Sie immer (Standard).
Wenn Sie nc
keine geeignete Option haben, können Sie die Kommunikation von einem Client erkennen und die gesamte Befehlszeile beenden. Ein Beispiel, das in meinem Debian funktioniert bash
:
printf 'HTTP/1.1 302 Moved\r\nLocation: https://www.eff.org/\r\n' | nc -l -p 2345 | { read foo; sleep 1; kill 0; }
Ordnet beim Ausführen einer Pipe bash
jeden Prozess in einer einzelnen Prozessgruppe an. kill 0
sendet Signale an die gesamte Prozessgruppe. Dieser Weg nc
wird etwa 1 Sekunde nach Eingang einer Anforderung, die ausgelöst wird, abgebrochen read
.