2009-08-13 3 views
28

Wir haben ein sehr einfaches TCP-Messaging-Skript, das einige Text an einen Server-Port, der eine Antwort zurückgibt und zeigt.Wie kann ich eine Netcat-Verbindung schließen, nachdem ein bestimmtes Zeichen in der Antwort zurückgegeben wurde?

Der Teil des Skripts wir kümmern uns um sieht ungefähr so ​​aus:

cat someFile | netcat somehost 1234 

Die Antwort vom Server zurück ‚vollständig‘ ist, sobald wir eine bestimmte Zeichencode (speziell) zurückgegeben.

Wie kann ich die Verbindung schließen, wenn ich dieses Sonderzeichen erhalte?

(Hinweis: Der Server nicht schließen die Verbindung für mich Während ich zur Zeit CTRL + C nur das Skript, wenn ich es gemacht sagen kann, wünsche ich viele dieser Nachrichten senden zu können,. einer nach dem anderen)

(Anmerkung:. netcat -w x ist nicht gut genug, weil ich diese Nachrichten durch so schnell wie möglich schieben mag)

+0

Ist '& 001C' ein 16-Bit-Unicode-Codepoint oder ist es nur das ASCII-Zeichen' 0x1C'? – caf

+0

Ich glaube, es ist das letztere – SCdF

Antwort

15

eine bash-Skript erstellen genannt client.sh:

#!/bin/bash 

cat someFile 

while read FOO; do 
     echo $FOO >&3 
     if [[ $FOO =~ `printf ".*\x00\x1c.*"` ]]; then 
       break 
     fi 
done 

Dann netcat von Ihrem Haupt-Skript aufrufen, etwa so:

3>&1 nc -c ./client.sh somehost 1234 

(Sie werden bash Version 3 für die regexp Matching benötigen).

Dies setzt voraus, dass der Server Daten in Zeilen sendet - wenn nicht müssen Sie client.sh so optimieren, dass es ein Zeichen gleichzeitig liest und wiedergibt.

+0

Kommentieren auf eine alte Antwort, aber meine Version von nc (1.10) braucht -e anstelle von -c (und dann funktioniert das gut für mich). Auch ein Nissen: Ich würde es vermeiden, 'printf' jedes Mal durch die Schleife aufzurufen, sondern bevorzuge, eine Variable einmal auf den regulären Ausdruck zu setzen. Zum Beispiel: 're = $ '. * \ X1C. *' ... dann benutze' [[$ FOO = ~ $ re]] 'als Bedingung. – sjnarv

4

haben vielleicht einen Blick auf NCAT auch:

„NCAT ist der Höhepunkt von vielen der wichtigsten Features von verschiedenen Netcat Inkarnationen wie Netcat 1.x, Netcat6, socat, Cryptcat, GNU Netcat usw. NCAT hat eine Vielzahl neuer Funktionen wie "Verbindungsvermittlung", TCP/UDP-Umleitung, SOCKS4-Client- und -Server-Unterstützung, Fähigkeit zur Verkettung von Ncat-Prozessen, HTTP-CONNECT-Proxying (und Proxy-Verkettung), SSL-Verbindungs-/Listen-Unterstützung, IP-Adresse/Verbindung Filterung und vieles mehr. "

http://nmap-ncat.sourceforge.net

7

Versuchen:

(cat somefile; sleep $timeout) | nc somehost 1234 | sed -e '{s/\x01.*//;T skip;q;:skip}' 

Dies erfordert GNU sed.

Wie es funktioniert:

{ 
    s/\x01.*//; # search for \x01, if we find it, kill it and the rest of the line 
    T skip;  # goto label skip if the last s/// failed 
    q;   # quit, printing current pattern buffer 
    :skip  # label skip 
} 

Beachten Sie, dass diese dort übernimmt nach dem \ x01 ein Newline sein wird - sed wird es nicht anders sehen, wie sed arbeitet line-by-line.

+0

Dies funktioniert nicht, da netcat die Verbindung schließt, sobald 'cat' die Standardeingabe von netcat schließt. – caf

+0

behoben, mit einer Auszeit sogar :) – bdonlan

6

Wie wäre es damit?

Client-Seite:

awk -v RS=$'\x1c' 'NR==1;{exit 0;}' < /dev/tcp/host-ip/port 

Testing:

# server side test script 
while true; do ascii -hd; done | { netcat -l 12345; echo closed...;} 
# Generate 'some' data for testing & pipe to netcat. 
# After netcat connection closes, echo will print 'closed...' 

# Client side: 
awk -v RS=J 'NR==1; {exit;}' < /dev/tcp/localhost/12345 
# Changed end character to 'J' for testing. 
# Didn't wish to write a server side script to generate 0x1C. 

Client-Seite erzeugt:

0 NUL 16 DLE 32  48 0 64 @ 80 P 96 ` 112 p 
    1 SOH 17 DC1 33 ! 49 1 65 A 81 Q 97 a 113 q 
    2 STX 18 DC2 34 " 50 2 66 B 82 R 98 b 114 r 
    3 ETX 19 DC3 35 # 51 3 67 C 83 S 99 c 115 s 
    4 EOT 20 DC4 36 $ 52 4 68 D 84 T 100 d 116 t 
    5 ENQ 21 NAK 37 % 53 5 69 E 85 U 101 e 117 u 
    6 ACK 22 SYN 38 & 54 6 70 F 86 V 102 f 118 v 
    7 BEL 23 ETB 39 ' 55 7 71 G 87 W 103 g 119 w 
    8 BS  24 CAN 40 ( 56 8 72 H 88 X 104 h 120 x 
    9 HT  25 EM  41) 57 9 73 I 89 Y 105 i 121 y 
    10 LF  26 SUB 42 * 58 : 74 

Nach 'J' erscheint, Server-Seite schließt & druckt ‚geschlossen ... ', um sicherzustellen, dass die Verbindung tatsächlich geschlossen wurde.

+1

Wie habe ich das Kopfgeld bekommen, wenn die am höchsten gewählte Antwort nicht mir gehört, & es gibt keine akzeptierte Antwort? – anishsane

2

Dies funktioniert am besten für mich. Lesen Sie einfach die Ausgabe mit einer while-Schleife und prüfen Sie dann mit einer if-Anweisung auf "0x1c".

while read i; do 
    if [ "$i" = "0x1c" ] ; then # Read until "0x1c". Then exit 
     break 
    fi 
    echo $i; 
done < <(cat someFile | netcat somehost 1234) 
-1

Dies funktioniert gut:

echo ^C | nc -v 29.7.144.21 1364 

Siehe Ausgabe unter:

[root @ localhost ~] # echo^C | nc -v 29.7.144.21 1364 Ncat: Version 6.40 (http://nmap.org/ncat) Ncat: Verbunden mit 29.7.144.21:1364.^C Ncat: 3 Bytes gesendet, 0 Bytes in 0.01 Sekunden empfangen.

[root @ localhost ~] #

+0

Obwohl praktisch, beantwortet dies die Frage nicht wirklich. Es hört einfach beim ersten Lauf auf, es wartet nicht auf den "Sondercharakter" ... – Nick