Ich versuche, Befehle mit einer netcat
Pipe-Antwort an einen TCP-Port zu senden,
wenn ich netcat
meinen 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 netcat
Antworttext drucken?
OpenBSD netcat (Debian patchlevel 1.105-7ubuntu1)
Version; und am entfernten Ende befindet sichtelegram-cli
auf demselben Computer.netcat
der 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 diessocat
eine Option ist, würde ich es stattdessen wärmstens empfehlen. Es gibt nur einesocat
, 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.Antworten:
Wie @Patrick sagte, ist dieses Problem normalerweise auf das
netcat
Beenden zurückzuführen, bevor die Antwort gegeben wurde. Sie können dies beheben, indem Sie-q 2
der Befehlszeile hinzufügen , dhnetcat
etwa 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.quelle
-q 2
funktioniert, aber ist es vertrauenswürdig? Ich kann nicht sicher sein, ob 2s immer genug ist! kann ich ?-w
Möglichkeit, damit zu spielen. Das istman nc
natürlich alles auf der Seite.invalid option -- 'q'
nc
sofort beendet, anstatt auf eine Antwort zu warten? Wenn die Verbindung noch offen ist, sollte es eine Option geben,nc
auf das Schließen zu warten, nicht nur auf dasBenutze das:
Das Problem ist, dass
nc
die Verbindung sofort nach dem Schließen von stdin geschlossen wird, was für eine einfachemy_command
Zeichenfolge 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
cat
mit-
als zweites Argument ein: Es lässtcat
stdin abhören, um mehr Inhalt durchzuleiten, nachdem es den Inhalt des ersten Arguments gesendet hat. Das erste Argument ist nur, denecho
Befehl durchzuarbeitencat
- es könnte auch eine Datei mit Ihren Befehlen a la seincat < file - | ...
.Alternativ dazu:
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
cat
oder diewhile
Schleife sein undnc
weiterlaufen, bis Sie^C
oder^D
auf 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 Verbindungnc
nach 1 Sekunde geschlossen, abercat
so 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
nc
Client und die darin enthaltenen Prozessleitungen beendet.Diese Antwort basiert auf dieser Antwort auf eine identische Superuser-Frage .
quelle
{ echo my_command; cat;}
würde das gleiche tun und könnte als leichter zu verstehen angesehen werden.Verschiedene openbsd-netcat Versionen sind schrullig, verschiedene Kombinationen von benötigen
-w <seconds>
,-q <seconds>
,-N
und 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:
Es funktioniert jedoch mit -N, das entweder dem Server oder dem Client hinzugefügt wurde.
quelle
Ich weiß, dass dies ein bisschen alt ist, aber keine andere Antwort hat für mich funktioniert und dies tat:
Beachten Sie Folgendes
-N
: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.
quelle