Wie kann ich die Netcat-Verbindung nach dem Senden der Daten automatisch schließen?

22

Ich führe den folgenden Befehl von einem Skript aus:

echo '{"hostUp": true}' | sudo /usr/local/bin/netcat localhost 8001

Der Netcat-Client bleibt jedoch auf unbestimmte Zeit geöffnet. Wie kann ich die Verbindung schließen, nachdem diese Daten gesendet wurden?

Justin Meltzer
quelle

Antworten:

17

Sowohl die anderen -cals auch die -qgegebenen Antworten sind im richtigen Kontext richtig, aber es kann hilfreich sein, zusammenzufassen, warum es mehrere Antworten gibt, und eine allgemeinere Lösung anzugeben.

Diese verschiedenen Optionen bewirken dasselbe, sind jedoch unterschiedliche Implementierungen von netcat:

  • -c GNU-Implementierung von Netcat
  • -q OpenBSD-Implementierung von netcat.
  • -w (other?) OpenBSD-Implementierung von netcat.

Einige Versionen erfordern ein int, um die Anzahl der Sekunden anzugeben, die gewartet werden muss, bevor die -qund -w-Optionen beendet werden. Dieses int muss > 0oder sein >= 0, abhängig von der Version.

Wenn Sie etwas auf mehreren Computern implementieren und nicht sicher sind, ob diese dieselbe Implementierung von netcat verwenden, sollten Sie Ihren netcat-Aufruf mit dem timeoutProgramm abschließen, um netcat nach einigen Sekunden zu beenden.

timeout 5 echo '{"hostUp": true}' | netcat localhost 8001

Dieser Ansatz ist etwas umständlich, da er die Ausführung von netcat nach oben begrenzt, unabhängig davon, ob Daten erfolgreich gesendet werden oder nicht. Wenn Sie jedoch eine kleine Datenmenge senden und ein paar Sekunden Zeit haben, sollte dies funktionieren mit jeder Netcat-Implementierung.

7yl4r
quelle
5

Sie können -qparameter verwenden, der netcatServer wird jedoch ebenfalls geschlossen.

$ echo '{"hostUp": true}' | sudo /usr/local/bin/netcat -q 5 localhost 8001    
cuonglm
quelle
3

In meinem Fall hatte die über Homebrew (Version 0.7.1) auf meinem Mac installierte Kopie von netcat keine Option -q, aber ich konnte die Option -c verwenden, um STDIN EOF zu schließen und die zu platzieren ganzer Befehl in einer Schleife:

while true ; do printf 'HTTP/1.1 200 OK\r\n\r\ncool, thanks' | netcat -l -c -p 8888 ; done
jmaxyz
quelle
1

Auf dem Ubuntu 18.04 Server musste ich folgendes benutzen:

echo '{"hostUp": true}' | sudo /usr/local/bin/netcat -N localhost 8001

Offensichtlich -Nist das ähnlich -qoder -cauf anderen Distributionen

Daniel Schoonwinkel
quelle