netcat druckt keine Antwort

12

Ich versuche, Befehle mit einer netcatPipe-Antwort an einen TCP-Port zu senden,
wenn ich netcatmeinen Befehl ausführe und eingebe. Er gibt die Antwort korrekt aus, aber wenn ich einen Befehl von einer Pipe übergebe, sendet er den Befehl korrekt, druckt aber keine Antwort

Das funktioniert also richtig:

netcat  localhost 9009

Dies sendet zwar nur einen Befehl, gibt jedoch keine Antwort aus:

echo 'my_command' | netcat  localhost 9009

Warum?
Wie kann ich den netcatAntworttext drucken?

RYN
quelle
Das passiert dir wahrscheinlich
Jeff Schaller
@ JeffSchaller: nein! Leider hilft es nicht, diese Befehle zu verwenden! diesmal blockiert es für immer!
RYN
Welchen Netcat benutzt du? Leider gibt es ein Dutzend verschiedene Varianten des Netcat-Tools, und sie verhalten sich nicht alle gleich. Was ist auch am entfernten Ende?
Patrick
@Patrick: Mein Netcat ist OpenBSD netcat (Debian patchlevel 1.105-7ubuntu1)Version; und am entfernten Ende befindet sich telegram-cliauf demselben Computer.
RYN
Ich glaube, ich habe eine Manpage für diesen Netcat gefunden, aber ich sehe keine Flags, die steuern könnten, was meiner Meinung nach passiert. Ich vermute, dass netcatder EOF , sobald er auf STDIN empfangen wurde, sofort beide Seiten des Sockels herunterfährt, anstatt ihn halb zu schließen und darauf zu warten, dass die entfernte Seite sein Ende schließt. Wenn dies socateine Option ist, würde ich es stattdessen wärmstens empfehlen. Es gibt nur eine socat, so dass Sie keine Portabilitätsprobleme haben, da es ein Dutzend verschiedene Geschmacksrichtungen gibt, es sich viel vernünftiger verhält und hochgradig konfigurierbar ist.
Patrick

Antworten:

8

Wie @Patrick sagte, ist dieses Problem normalerweise auf das netcatBeenden zurückzuführen, bevor die Antwort gegeben wurde. Sie können dies beheben, indem Sie -q 2der Befehlszeile hinzufügen , dh netcatetwa 2 Sekunden nach dem Erkennen von EOF an der Standardeingabe warten. Natürlich können Sie es auch eine andere Anzahl von Sekunden warten lassen.

Ralph Rönnquist
quelle
Vielen Dank; -q 2funktioniert, aber ist es vertrauenswürdig? Ich kann nicht sicher sein, ob 2s immer genug ist! kann ich ?
RYN
1
Verwenden Sie eine größere Zahl, damit es länger wartet, oder eine negative Zahl, damit es unbegrenzt wartet. Es gibt auch die -wMöglichkeit, damit zu spielen. Das ist man ncnatürlich alles auf der Seite.
Ralph Rönnquist
5
es heißtinvalid option -- 'q'
phil294
Ich denke, eine gute Folgefrage ist: Warum wird ncsofort beendet, anstatt auf eine Antwort zu warten? Wenn die Verbindung noch offen ist, sollte es eine Option geben, ncauf das Schließen zu warten, nicht nur auf das
Beenden von
6

Benutze das:

cat <(echo command) - | nc host port

Das Problem ist, dass ncdie Verbindung sofort nach dem Schließen von stdin geschlossen wird, was für eine einfache my_commandZeichenfolge sehr schnell ist und daher nie die Chance erhält, eine Antwort zu erhalten. (Wenn Sie eine sehr große Datei weiterleiten, werden Sie möglicherweise eine Antwort erhalten, bevor das Senden der Datei abgeschlossen ist.)

Geben Sie catmit -als zweites Argument ein: Es lässt catstdin abhören, um mehr Inhalt durchzuleiten, nachdem es den Inhalt des ersten Arguments gesendet hat. Das erste Argument ist nur, den echoBefehl durchzuarbeiten cat- es könnte auch eine Datei mit Ihren Befehlen a la sein cat < file - | ....

Alternativ dazu:

(echo command; while true; do sleep 0.01; echo -n "#"; done) | nc host port

Dies sendet unbegrenzte #Zeichen in der 2. Zeile der Eingabe. Die Verwendung #funktioniert für eine Bash wie Remote, die dies als Kommentar ignoriert. Ich habe hier eine kleine Wartezeit von 10 Millisekunden gewählt, damit sie am Verbindungsende schneller reagiert. YMMV.

Der Nachteil davon kann das catoder die whileSchleife sein und ncweiterlaufen, bis Sie ^Coder ^Dauf der Shell treffen . Es kommt wirklich auf das entfernte Ende an.

Wenn Sie eine Zeitüberschreitung mit -w 1(OSX netcat) oder -i 1(nmap's ncat) hinzufügen, wird die Verbindung ncnach 1 Sekunde geschlossen, aber catso lange ausgeführt, bis Sie ein Zeichen eingeben und die Pipe bricht (glaube ich).

Es funktioniert jedoch, wenn die Remote-Seite die Verbindung nach dem Empfang und der Verarbeitung des Befehls automatisch schließt. Dadurch werden auch der ncClient und die darin enthaltenen Prozessleitungen beendet.

Diese Antwort basiert auf dieser Antwort auf eine identische Superuser-Frage .

Alexander Klimetschek
quelle
{ echo my_command; cat;}würde das gleiche tun und könnte als leichter zu verstehen angesehen werden.
G-Man sagt 'Reinstate Monica'
1

Verschiedene openbsd-netcat Versionen sind schrullig, verschiedene Kombinationen von benötigen -w <seconds>, -q <seconds>, -Nund sogar verschiedene Argumente müssen je nachdem , was am anderen Ende der Verbindung ausgeführt wird . Die Verwendung von Timeout-Optionen mit bestimmten Versionen oder Servern führt zu Verzögerungen. Wenn Sie diese nicht verwenden, kann dies zu einer extrem langen (unendlichen?) Verzögerung führen. Und ich würde verschiedene Macken mit gnu netcat erwarten, weiß aber nicht, ob sie sich zwischen den Versionen unterscheiden.

Zum Beispiel dauert die Version 1.130_3 von archlinux extrem lange (für immer?), Wenn ich das mache:

$ echo response | nc -l 9999 &
[1] 15190

$ time echo request | nc localhost 9999
request
response

(wait forever possibly)

Es funktioniert jedoch mit -N, das entweder dem Server oder dem Client hinzugefügt wurde.

Peter
quelle
1

Ich weiß, dass dies ein bisschen alt ist, aber keine andere Antwort hat für mich funktioniert und dies tat:

echo 'test' | netcat -N $server $port

Beachten Sie Folgendes -N:

Fahren Sie den Netzwerk-Socket nach EOF am Eingang herunter. Einige Server benötigen dies, um ihre Arbeit zu beenden.

Arbeitete für mich sowohl unter Windows als auch unter Linux.

Hinweis: Dies ist eine Kopie der Antwort, die ich für eine doppelte Frage gepostet habe .

Ich denke, das könnte nützlich sein. Mods können jederzeit bearbeitet / gelöscht werden, wenn dies gegen Richtlinien oder ähnliches verstößt.

yannick1976
quelle