it-swarm.com.de

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

Ich möchte netcat verwenden, 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 netcat beenden, nachdem ich eine Antwort vom Echodienst erhalten habe?

8
David Dai

Gerade ausprobiert - etwas anderes Verhalten zwischen netcat-openbsd Und netcat-traditional (Ubuntu 16.4). Die OpenBSD-Variante macht das, was Sie erwarten, während ich mit der Netcat-Traditional den -q 1 Hinzufügen muss, um nicht auf weitere Eingaben zu warten.

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

Benutze das:

cat <(echo command) - | nc Host port

Das Problem ist, dass nc die Verbindung sofort nach dem Schließen von stdin schließt, was für eine einfache my_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 zweitem Argument ein: cat wartet auf stdin, um mehr Inhalt zu erhalten, nachdem der Inhalt des ersten Arguments gesendet wurde. Das erste Argument besteht darin, den Befehl echo über cat abzurufen - es kann sich auch um eine Datei mit Ihren Befehlen a la cat < file - | ... Handeln.

Der Nachteil davon ist jetzt, dass es offen bleibt, bis Sie ^C Oder ^D Auf der Shell drücken. 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 diese Antwort auf eine identische Superuser-Frage .

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

Genau so soll netcat funktionieren: Sobald es EOF auf stdin) erreicht hat, schließt es (Einweg) die Verbindung/zum/Server und wartet dann auf Daten kommen vom Server. Wenn dieser die Verbindung schließt (umgekehrt: Server-> Client), stoppt netcat.

Wenn Ihr Befehl netcat nicht beendet wird, passiert auf Netzwerkebene vermutlich etwas Seltsames, das den Server echo auf zusätzliche Eingaben wartet.

Sie können das -q Option, um netcat zu zwingen, N Sekunden nach EOF auf stdin:

netcat -q1 server echo <<< "test"

(<<< "test" ist ein bashism, benutze dein echo ... | Syntax, wenn Sie nicht bash) verwenden

5
xhienne

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
2
Azeem Ilyas

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

1
yannick1976

Ich würde stattdessen socat empfehlen:

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

(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 von nc/netcat und funktioniert im Allgemeinen zuverlässiger. Es ist Ihr ultimatives Schweizer Taschenmesser.

Zitieren der Manpage für das -t Möglichkeit:

-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 socat beendet, ohne auf das Timeout zu warten.

Also oben, nachdem echotest\n, es wird beendet, wodurch das Rohr geschlossen wird. socat sieht EOF auf seinem - channel (stdin), schließt dann die Schreibrichtung des Sockets TCP) und wartet auf das Herunterfahren des Remote-Dienstes oder auf 10 Sekunden Inaktivität, je nachdem, was zuerst eintritt. echo service 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 auf Linux, der zumindest in neueren Versionen von Debian und Derivaten der Standard ist, wäre eine Annäherung nc -Nw10 server 7 (das ist anders darin, dass nc 's -w ist sowohl ein Verbindungszeitlimit als auch ein Inaktivitätszeitlimit.)

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

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

(das fork, um einen Prozess für jede eingehende Verbindung zu verzweigen, nofork, um cat direkt in diesem Prozess mit seinem stdin/stdout being the = auszuführen TCP Socket, wie bei Verwendung von (x)inetd).

Etwas 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
0

Ich überprüfe einfach das cmd timeout, während ich den Befehl nc versuche, wie:

echo "test" | timeout 10 netcat server 7

Dies wartet 10 Sekunden, bevor die Verbindung geschlossen wird.

0
Alexandre

sende einen Ping an Redis und grep den PONG:

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

Funktioniert als Ansible-Befehl.

0
OlliO

Der beste Weg, um die Verbindung ordnungsgemäß zu schließen, ist das Senden des Content-Length Header wie folgt. Der Client (wie curl schließt die Verbindung nach dem Empfang der Daten.

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;
0
user1067920