Ich möchte verwenden netcat
, um einen Text an den Echo-Dienst auf meinem Server zu senden, die Antwort zu erhalten und dann zu beenden, damit ich weiß, dass die Verbindung immer noch gut ist. Bisher habe ich versucht:
echo 'test' | netcat server 7
Auf diese Weise würde netcat eher auf mehr Eingaben als auf Exits warten.
Wie kann ich das Programm netcat
beenden, nachdem ich eine Antwort vom Echodienst erhalten habe?
Antworten:
Gerade ausprobiert - etwas anderes Verhalten zwischen
netcat-openbsd
undnetcat-traditional
(Ubuntu 16.4). Die OpenBSD-Variante macht das, was Sie erwarten, während ich mit der Netcat-Traditional die hinzufügen muss-q 1
, um nicht auf weitere Eingaben zu warten.quelle
Ihr Befehl sollte funktionieren. Es ist einigen Beispielen in der
netcat
Manpage sehr ähnlich .Genau so
netcat
soll es funktionieren: Sobald es EOF auf stdin erreicht hat, schließt es (Einweg) die Verbindung / zum / Server und wartet dann auf Daten, die vom Server kommen. Wenn dieser die Verbindung schließt (umgekehrt: Server-> Client), wird ernetcat
gestoppt.Wenn Ihr
netcat
Befehl nicht beendet wird, passiert auf Netzwerkebene vermutlich etwas Seltsames, das denecho
Server auf zusätzliche Eingaben wartet .Sie können die
-q
Option ausprobieren,netcat
um N Sekunden nach dem Auftreten von EOF auf stdin zu stoppen:( Ist
<<< "test"
einbash
Ismus, verwenden Sie Ihreecho ... |
Syntax, wenn Sie nicht verwendenbash
)quelle
Benutze 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 die Datei gesendet wird.Geben Sie
cat
mit-
als zweites Argument: es machtcat
hört auf stdin für mehr Inhalte Rohr durch , nachdem er 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 - | ...
.Der Nachteil davon ist jetzt, dass es offen bleibt, bis Sie schlagen
^C
oder^D
auf die Muschel. Durch Hinzufügen eines Timeouts mit-w 1
(OSX netcat) oder-i 1
(nmaps ncat) wird die Verbindung nach 1 Sekunde geschlossen, der Vorgang wird jedoch erst beendet, wenn Sie ein Zeichen eingeben.Diese Antwort basiert auf dieser Antwort auf eine identische Superuser-Frage .
quelle
cat <(echo command) <(sleep 1) | nc host port
bewirkt, dass stdin geöffnet bleibt, solange dersleep
Befehl ausgeführt wird, ohne dass nc-Zeitüberschreitungen festgelegt werden müssen oder der Benutzer "ein Zeichen eingeben" muss.Ich verstehe deine Frage nicht richtig?
Der Standard-Netcat-Listener sollte nach Erhalt der Eingabe beendet werden (in diesem Fall leitet Ihr Echo ihn an Netcat weiter, der ihn an den Listener weiterleitet).
Wenn Sie möchten, dass der abhörende Netcat-Dienst nach dem Empfang von Eingaben weiter zuhört:
Am wichtigsten ist jedoch, dass Sie die Manpages auf Netcat überprüfen. Sie sind für alle Befehle erstaunlich nützlich ...
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.
quelle
Sende einen Ping an Redis und grep den PONG:
Funktioniert als Ansible-Befehl.
quelle
Der beste Weg, um die Verbindung ordnungsgemäß zu schließen, besteht darin, den
Content-Length
Header wie folgt zu senden . Client (wiecurl
wird die Verbindung nach dem Empfang der Daten schließen.quelle
Ich überprüfe nur die
timeout
cmd, während ich dennc
Befehl versuche , wie:Dies wartet 10 Sekunden, bevor die Verbindung geschlossen wird.
quelle
Ich würde
socat
stattdessen empfehlen :(hier bis zu 10 Sekunden warten, bis der Server antwortet und herunterfährt)
socat
kann viel, viel mehr als die verschiedenen (unterschiedlichen und inkompatiblen) Implementierungen vonnc
/netcat
und funktioniert im Allgemeinen zuverlässiger. Es ist Ihr ultimatives Schweizer Taschenmesser.Zitieren der Manpage für die
-t
Option:Nach dem
echo
Schreibentest\n
wird es oben beendet, wodurch die Pipe geschlossen wird.socat
sieht EOF auf seinem-
Kanal (stdin), schließt dann die Schreibrichtung des TCP-Sockets und wartet, bis der Remote-Dienst ebenfalls heruntergefahren wird, oder auf 10 Sekunden Inaktivität, je nachdem, was zuerst eintritt. Derecho
Dienst soll die Verbindung beenden, sobald das andere Ende seine Senderichtung beendet hat, sodass der Befehl nicht länger dauern sollte als die Zeit, die zum Herstellen der Verbindung, zum Austausch der Daten und zum Herunterfahren benötigt wird.Mit OpenBSDs
netcat
oder seinem Port zu Linux , die die Rückstellung einer zumindest auf den letzten Versionen von Debian und Derivate ist, wäre eine Annäherungnc -Nw10 server 7
(die in dieser andersnc
ist-w
sowohl eine Verbindungszeit und ein Inaktivitäts - Timeout)So implementieren Sie einen TCP-
echo
Dienst auf Port 7777 zum Testen:(der
fork
einen Prozess für jede eingehende Verbindung gabeln,nofork
auszuführencat
direkt in diesem Prozess mit seinem stdin / stdout wobei der TCP - Socket, wie bei der Verwendung(x)inetd
).Einige Timing auf der Loopback-Schnittstelle, mit
zsh
:quelle
Dadurch bleibt der Eingang einige Zeit offen, um das
netcat
Ende zu verzögern .quelle