it-swarm.com.de

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

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 auf SuSE 10.1.

33
Chris

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

cat file - | nc Host port

(Im Wesentlichen speichert cat den Inhalt der Datei auf stdout und wartet dann auf stdin).

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

cat <(echo command) - | nc Host port
33
Chaitanya Gupta

Mit nc unter Ubuntu:

nc -q -1 Host port

Von der Ubuntu nc Manpage :

 -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 nc -Optionen zwischen den Distributionen sehr unterschiedlich sind, sodass dies bei Ihnen möglicherweise nicht funktioniert (OpenSUSE).

15

Ich habe es gefunden:

echo command | netcat Host port -

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

11
Chris

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 es eine Verbindung zum entfernten TCP -Port herstellt und auf einem lokalen Unix-Domain-Socket lauscht (theoretisch, damit die Verbindung die ganze Zeit aufrecht erhalten werden kann), aber sobald der lokale Prozess abgebrochen ist Der Unix-Socket (ein anderer Socat, der den Unix-Socket mit stdin/out verbindet) schloss die Socat-Sitzung TCP.

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 entfernten Ende öffnet und dann lokal auf einem Socket/Pipe/Fifo oder was auch immer lauscht und dann einfach das sendet Daten in der vorhandenen TCP Pipe und gibt die Ergebnisse zurück.

3
Majenko

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

Standardmäßig schließt nc die Verbindung nach Abschluss, wenn Sie ihn nicht ausdrücklich auffordern, weiter zuzuhören (mit der Option -k):

 -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 streame erfolgreich Daten zwischen zwei Computern wie diesen:

  • absender:

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

    nc -kl <port> 
    
2
Campa

Georges 'Methode funktioniert gut mit einer interaktiven Shell, hilft jedoch nicht beim Schreiben von Skripten, wenn Sie z. Rufen Sie Ihr Skript als Nohup ./script & auf.

Ich fand das Ersetzen von stdin durch ein Dummy-FIFO hilfreich.

 mkfifo dummy
 cat command.txt dummy | nc Host port

Da nach der Ausgabe der Datei niemals etwas in das FIFO geschrieben wird, bleibt cat auf unbestimmte Zeit daran hängen.

1
SF.

Die shut-none-Option von socat sollte hier Abhilfe schaffen:

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

Wahrscheinlich müssen Sie auch die Standard-Zeitüberschreitungszeit mit -t <timeout> überschreiben, andernfalls wird der Socket nach 0,5 s geschlossen. 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.

0
Jeremy

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).

0
allo