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

32
echo command | netcat host port

Dies führt dazu, dass der Befehl an den Remote-Host gesendet und einige Daten zurückgelesen werden. Nach einigen Sekunden wird die Verbindung getrennt. Der Parameter -w hat nichts geändert. Ich benutze Netcat v1.10 unter SuSE 10.1.

Chris
quelle
Sind Sie sicher, dass nicht der Remote-Host die Verbindung beendet?
Grawity
Ja. Wenn Sie netcat ausführen und dann den Befehl manuell eingeben, bleibt netcat auf unbestimmte Zeit am Leben.
Chris
Warum sollte es am Leben bleiben? Gibt es nur die Echoparameter aus und stirbt dann?
M'vy
1
Ich möchte, dass es am Leben bleibt, damit es weiterhin die Daten vom Remote-Server empfängt.
Chris
2
Das ist nicht wahr. "netcat <host> <port>" öffnet einen bidirektionalen TCP-Socket.
Chris

Antworten:

33

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 wird catder Inhalt der Datei auf stdout abgelegt und dann auf stdin gewartet.)

Wenn Sie den Befehl über die Shell selbst senden möchten, können Sie dies folgendermaßen tun:

cat <(echo command) - | nc host port
Chaitanya Gupta
quelle
Es ist schön, da es auf einem sehr nackten Embedded-System funktioniert, bei dem netcat alle ausgefallenen Optionen fehlen.
SF.
{ echo command; cat;}würde das gleiche tun und könnte als leichter zu verstehen angesehen werden.
G-Man sagt, dass Monica
1
Aus meiner Sicht hält der netcatBefehl den Socket offen, bis das Ende der Eingabe angezeigt wird. All diese Beispiele zeigen dies, ohne wirklich viel darüber zu sagen, warum . Ich bin die Interaktion mit Server unter Verwendung von für längere Zeit nur mit: . SocketTest ist ein praktisches Tool, das jeden TCP- oder UDP-Port überwachen oder bedienen kann. SocketTest netcatcat - | nc localhost 8063
wird
14

Mit ncauf Ubuntu:

nc -q -1 host port

Von 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, sodass dies bei Ihnen möglicherweise nicht funktioniert (OpenSUSE).

Suzanne Dupéron
quelle
12

Ich habe es gefunden:

echo command | netcat host port -

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

Chris
quelle
2

Ich glaube nicht, dass Sie das mit Netcat oder Socat schaffen werden. Ich habe gerade intensiv an beiden rumgebastelt und socat sah am vielversprechendsten aus.

Ich habe es geschafft, socat so einzurichten, dass eine Verbindung zum entfernten TCP-Port hergestellt und ein lokales Unix-Domain-Socket abgehört wird (theoretisch, damit die Verbindung die ganze Zeit aufrecht erhalten werden kann), aber sobald sich der lokale Prozess vom Unix-Socket gelöst hat (ein anderes socat) Verlinkung des Unix-Sockets mit stdin / out) schloss die TCP-Socat-Sitzung.

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 das lokale Ende die Verbindung trennt.

Ich denke, Sie werden wahrscheinlich eine benutzerdefinierte Proxy-Software dafür schreiben müssen, die die TCP-Verbindung zum Remote-Ende öffnet und dann lokal auf einem Socket / einer Pipe / einem FIFO oder was auch immer lauscht und dann die Daten einfach über die vorhandene TCP-Pipe sendet und gibt die Ergebnisse zurück.

Majenko
quelle
Hören Sie sich den mächtigen Matt Jenkins an: D
M'vy
2

Könnte es sein, dass die Verbindung am anderen Ende der Buchse geschlossen ist?

Standardmäßig wird ncdie Verbindung nach Abschluss geschlossen, wenn Sie ihm nicht ausdrücklich sagen, dass er weiter zuhö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.

Sehen man nc.1.


Ich streame erfolgreich Daten zwischen zwei Computern wie diesen:

  • Absender:

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

    nc -kl <port> 
    
Campa
quelle
1

Die Methode von Georges funktioniert gut von einer interaktiven Shell aus, hilft aber nicht beim Skripten, wenn Sie z. B. Ihr Skript als aufrufen nohup ./script &.

Ich habe festgestellt, dass es hilfreich ist, stdin durch ein Dummy-FIFO zu ersetzen.

 mkfifo dummy
 cat command.txt dummy | nc host port

Da nichts jemals in das FIFO schreibt, bleibt es nach der Ausgabe der Datei catauf unbestimmte Zeit hängen.

SF.
quelle
0

socatDie shut-noneOption von 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>, da sonst der Socket nach 0,5 s geschlossen wird. Diese Option überschreibt das Standardverhalten:

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 nach dem Senden des "blah" für 10s offen.

Jeremy
quelle
0

Ihr Befehl wird beendet, wenn entweder der Remote-Host die Verbindung schließt (oder nicht erreichbar ist) oder der Befehl, bevor die Pipe beendet wird (während Netcat weiterhin den Rest seiner Eingabewarteschlange sendet).

allo
quelle