netcat: Text an Echodienst senden, Antwort lesen und dann beenden

8

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 netcatbeenden, nachdem ich eine Antwort vom Echodienst erhalten habe?

Dave.d
quelle
Netcat ist fehlerhaft - das Problem ist, dass es nicht so einfach ist, dies richtig zu machen, wie es scheint.
Peter - Wiedereinstellung Monica
Duplikat von unix.stackexchange.com/questions/289364/…
Alexander Klimetschek

Antworten:

5

Gerade ausprobiert - etwas anderes Verhalten zwischen netcat-openbsdund netcat-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.

echo 'test' | netcat -q 1 server 7
jhilmer
quelle
5

Ihr Befehl sollte funktionieren. Es ist einigen Beispielen in der netcatManpage sehr ähnlich .

Genau so netcatsoll 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 er netcatgestoppt.

Wenn Ihr netcatBefehl nicht beendet wird, passiert auf Netzwerkebene vermutlich etwas Seltsames, das den echoServer auf zusätzliche Eingaben wartet .

Sie können die -qOption ausprobieren, netcatum N Sekunden nach dem Auftreten von EOF auf stdin zu stoppen:

netcat -q1 server echo <<< "test"

( Ist <<< "test"ein bashIsmus, verwenden Sie Ihre echo ... |Syntax, wenn Sie nicht verwenden bash)

xhienne
quelle
5

Benutze das:

cat <(echo command) - | nc host port

Das Problem ist, dass ncdie Verbindung sofort nach dem Schließen von stdin geschlossen wird, was für eine einfache my_commandZeichenfolge 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 catmit -als zweites Argument: es macht cathört auf stdin für mehr Inhalte Rohr durch , nachdem er den Inhalt des ersten Arguments gesendet hat. Das erste Argument ist nur, den echoBefehl durchzuarbeiten cat- es könnte auch eine Datei mit Ihren Befehlen a la sein cat < file - | ....

Der Nachteil davon ist jetzt, dass es offen bleibt, bis Sie schlagen ^Coder ^Dauf 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 .

Alexander Klimetschek
quelle
cat <(echo command) <(sleep 1) | nc host portbewirkt, dass stdin geöffnet bleibt, solange der sleepBefehl ausgeführt wird, ohne dass nc-Zeitüberschreitungen festgelegt werden müssen oder der Benutzer "ein Zeichen eingeben" muss.
Romanows
2

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:

nc -lk 12345
  • Dabei ist 12345 die Portnummer

Am wichtigsten ist jedoch, dass Sie die Manpages auf Netcat überprüfen. Sie sind für alle Befehle erstaunlich nützlich ...

man nc
Azeem Ilyas
quelle
1

Ich weiß, dass dies ein bisschen alt ist, aber keine andere Antwort hat für mich funktioniert und dies tat:

echo 'test' | netcat -N $server $port

Beachten Sie Folgendes -N:

Fahren Sie den Netzwerk-Socket nach EOF am Eingang herunter. Einige Server benötigen dies, um ihre Arbeit zu beenden.

Arbeitete für mich sowohl unter Windows als auch unter Linux.

yannick1976
quelle
0

Sende einen Ping an Redis und grep den PONG:

echo 'PING' | nc -w 1 server 6379 | grep PONG

Funktioniert als Ansible-Befehl.

OlliO
quelle
0

Der beste Weg, um die Verbindung ordnungsgemäß zu schließen, besteht darin, den Content-LengthHeader wie folgt zu senden . Client (wie curlwird die Verbindung nach dem Empfang der Daten schließen.

DATA="Date: $(date)"; 
LENGTH=$(echo $DATA | wc -c);
echo -e "HTTP/1.1 200 OK\nContent-Length: ${LENGTH}\n\n${DATA}" | nc -l -p 8000;
user1067920
quelle
0

Ich überprüfe nur die timeoutcmd, während ich den ncBefehl versuche , wie:

echo "test" | timeout 10 netcat server 7

Dies wartet 10 Sekunden, bevor die Verbindung geschlossen wird.

Alexandre
quelle
0

Ich würde socatstattdessen empfehlen :

echo test | socat -t 10 - tcp:server:7

(hier bis zu 10 Sekunden warten, bis der Server antwortet und herunterfährt)

socatkann viel, viel mehr als die verschiedenen (unterschiedlichen und inkompatiblen) Implementierungen von nc/ netcatund funktioniert im Allgemeinen zuverlässiger. Es ist Ihr ultimatives Schweizer Taschenmesser.

Zitieren der Manpage für die -tOption:

-t <Zeitüberschreitung>
Wenn ein Kanal EOF erreicht hat, wird der Schreibteil des anderen Kanals heruntergefahren. Dann wartet socat [timeval] Sekunden, bevor es beendet wird. Die Standardeinstellung ist 0,5 Sekunden. Dieses Zeitlimit gilt nur für Adressen, bei denen der Schreib- und Leseteil unabhängig voneinander geschlossen werden kann. Wenn während des Timeout-Intervalls der gelesene Teil EOF ausgibt, wird er socatbeendet, ohne auf das Timeout zu warten.

Nach dem echoSchreiben test\nwird es oben beendet, wodurch die Pipe geschlossen wird. socatsieht 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. Der echoDienst 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 netcatoder seinem Port zu Linux , die die Rückstellung einer zumindest auf den letzten Versionen von Debian und Derivate ist, wäre eine Annäherung nc -Nw10 server 7(die in dieser anders ncist -wsowohl eine Verbindungszeit und ein Inaktivitäts - Timeout)

So implementieren Sie einen TCP- echoDienst auf Port 7777 zum Testen:

socat tcp-listen:7777,reuseaddr,fork exec:cat,nofork

(der forkeinen Prozess für jede eingehende Verbindung gabeln, noforkauszuführen catdirekt 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:

$ time echo test | socat -t10 - tcp:localhost:7777
test
echo test  0.00s user 0.00s system 54% cpu 0.001 total
socat -t10 - tcp:localhost:7777  0.00s user 0.01s system 55% cpu 0.009 total
Stéphane Chazelas
quelle
-1
(echo 'test'; sleep 1) | netcat server 7 

Dadurch bleibt der Eingang einige Zeit offen, um das netcatEnde zu verzögern .

Robotto
quelle