Wie kann ich Befehle an ein netcat weiterleiten, das am Leben bleibt?

77293
Chris
echo command | netcat host port 

Dies führt dazu, dass der Befehl an den Remote-Host gesendet wird und einige Daten zurückgelesen werden. Aber nach wenigen Sekunden wird die Verbindung geschlossen. Der Parameter -w hat nichts geändert. Ich verwende netcat v1.10 unter SuSE 10.1.

31
Sind Sie sicher, dass nicht der Remote-Host die Verbindung beendet? grawity vor 13 Jahren 0
Ja. Wenn Sie netcat ausführen und dann den Befehl manuell eingeben, bleibt netcat unbegrenzt am Leben. Chris vor 13 Jahren 0
Warum sollte es am Leben bleiben? es einfach die Echoparameter ausdrucken und dann sterben? M'vy vor 13 Jahren 0
Ich möchte, dass es am Leben bleibt, so dass es weiterhin die vom Remote-Server kommenden Daten erhält. Chris vor 13 Jahren 1
Wenn Sie es so machen, wie Sie es geschrieben haben, senden Sie es einfach an den Remote-Server. Wenn Sie etwas empfangen möchten, müssen Sie auf dem lokalen Gerät ein zuhörendes Netzwerk öffnen. M'vy vor 13 Jahren 0
Das ist nicht wahr. "netcat "öffnet einen bidirektionalen TCP - Socket. Chris vor 13 Jahren 2

8 Antworten auf die Frage

31
Chaitanya Gupta

Dies funktioniert mit dem ncBefehl unter OS X (vorausgesetzt, der Befehl, den Sie senden möchten, befindet sich in einer Datei):

cat file - | nc host port 

(Im Wesentlichen werden catdie Inhalte der Datei auf stdout ausgegeben und dann auf stdin gewartet.)

Wenn Sie den Befehl von der Shell selbst senden möchten, können Sie Folgendes tun:

cat <(echo command) - | nc host port 
Es ist schön, da es auf einem sehr nackten eingebetteten System funktioniert, in dem netcat alle ausgefallenen Optionen fehlen. SF. vor 7 Jahren 0
`` `` würde dasselbe tun und könnte als verständlicher betrachtet werden. G-Man vor 6 Jahren 0
Wenn ich es sehe, hält der `netcat'-Befehl den Socket offen, bis er das Ende der Eingabe sieht. Alle diese Beispiele zeigen dies, ohne wirklich viel über _why_ zu sagen. Ich interagiere mit [`SocketTest`] (http://sockettest.sourceforge.net/) _server_ über` netcat` für einen längeren Zeitraum, nur mit: `cat - | nc localhost 8063`. ** [SocketTest] (http://sockettest.sourceforge.net/) ** ist ein praktisches Tool, das jeden TCP- oder UDP-Port abhören oder bedienen kann. will vor 6 Jahren 1
14
Georges Dupéron

Mit ncauf Ubuntu:

nc -q -1 host port 

Auf der Ubuntu- ncManpage :

 -q seconds after EOF on stdin, wait the specified number of seconds and then quit. If seconds is negative, wait forever. 

Beachten Sie, dass die verfügbaren ncOptionen zwischen den Distributionen sehr unterschiedlich sind. Dies funktioniert möglicherweise nicht bei Ihren (OpenSUSE).

11
Chris

Ich habe es gefunden:

echo command | netcat host port - 

Mein Kollege wusste es. Ich sehe das in der Dokumentation überhaupt nicht.

3
Majenko

Ich glaube nicht, dass Sie dies entweder mit netcat oder socat schaffen werden. Ich habe gerade ausgiebig mit beiden gearbeitet, und socat sah am vielversprechendsten aus.

Es gelang mir, socat so einzurichten, dass eine Verbindung zum Remote-TCP-Port hergestellt und ein lokaler Unix-Domain-Socket abgehört werden kann (theoretisch konnte die Verbindung jedoch ständig aufrechterhalten werden), aber sobald sich der lokale Prozess vom Unix-Socket gelöst hat (ein anderer socat Verbindung des Unix-Sockets mit stdin / out) Die TCP-Socat-Sitzung wurde geschlossen.

Das Problem hierbei ist, dass jede Verbindung über netcat / socat eine neue TCP-Stream-Verbindung zum Server herstellt und diese TCP-Stream-Sitzung schließt, wenn die lokale Verbindung getrennt wird.

Ich denke, dass Sie wahrscheinlich eine eigene Proxy-Software schreiben müssen, die die TCP-Verbindung zum Remote-Ende öffnet und dann lokal auf einem Socket / Pipe / Fifo oder was auch immer hört und dann die Daten einfach über die vorhandene TCP-Pipe sendet und gibt die Ergebnisse zurück.

Hören Sie dem allmächtigen Matt Jenkins zu: D M'vy vor 13 Jahren 0
1
SF.

Georges Methode funktioniert gut mit einer interaktiven Shell, hilft aber nicht beim Scripting, wenn Sie zB Ihr Script als aufrufen nohup ./script &.

Ich fand, dass Stdin durch ein Dummy-Fifo ersetzt wird.

 mkfifo dummy cat command.txt dummy | nc host port 

Da nichts in das FIFO geschrieben wird, cathängt es nach der Ausgabe der Datei unbegrenzt daran.

1
Campa

Ist es möglich, dass die Verbindung am anderen Ende der Buchse geschlossen ist?

ncSchließt standardmäßig die Verbindung nach Abschluss, wenn Sie ihm nicht explizit mitteilen, dass er weiterhören soll (mit der -kOption):

 -k Forces nc to stay listening for another connection after its current connection is completed. It is an error to use this option without the -l option. 

Siehe man nc.1.


Ich störe erfolgreich Daten zwischen zwei Computern:

  • Absender:

    while (true); do  echo -n "$RANDOM " | nc <host> <port> done 
  • Empfänger:

    nc -kl <port> 
0
Jeremy

socatDie shut-noneOption sollte hier helfen:

Changes the (address dependent) method of shutting down the write part of a connection to not do anything.

Wahrscheinlich müssen Sie auch die Standardzeitüberschreitung mit überschreiben -t <timeout>, andernfalls wird der Socket nach 0,5 Sekunden geschlossen. Diese Option überschreibt das Standardverhalten. Dies ist:

When one of the streams effectively reaches EOF, the closing phase begins. Socat transfers the EOF condition to the other stream, i.e. tries to shutdown only its write stream, giving it a chance to terminate gracefully. For a defined time socat continues to transfer data in the other direction, but then closes all remaining channels and terminates.

Also ein Befehl wie:

echo 'blah' | socat -t 10 stdio tcp:<addr>:<port>,shut-none

hält die Steckdose für 10s offen, nachdem das 'bla' gesendet wurde.

0
allo

Ihr Befehl wird beendet, wenn entweder der Remote-Host die Verbindung beendet (oder nicht erreichbar ist) oder der Befehl, bevor die Pipe beendet wird (während netcat noch den Rest der Eingabewarteschlange sendet).