2009-08-13 7 views
28

Mamy bardzo prosty skrypt do przesyłania komunikatów TCP, który wysyła tekst do portu serwera, który zwraca i wyświetla odpowiedź.Jak mogę zamknąć połączenie netcat po zwróceniu określonego znaku w odpowiedzi?

Część skryptu Dbamy o wygląda mniej więcej tak:

cat someFile | netcat somehost 1234 

odpowiedź powraca serwer jest „kompletna” raz mamy pewien kod znaku (konkretnie) zwrócony.

Jak mogę zamknąć połączenie, gdy otrzymam ten znak specjalny?

(Uwaga: Serwer nie zamknie połączenie dla mnie, a ja obecnie tylko CTRL + C skrypt, kiedy mogę powiedzieć to zrobić, życzę, aby móc wysłać wiele z tych wiadomości. jedna po drugiej)

(Uwaga:. netcat -w x nie jest wystarczająco dobry, bo chcą pchnąć te wiadomości przez tak szybko jak to możliwe)

+0

jest '& 001C' 16 bit punkt kodowy Unicode czy jest to tylko postać ASCII' 0x1C'? – caf

+0

Wierzę, że to jest ostatnie. – SCdF

Odpowiedz

15

Utwórz skrypt bash nazwie client.sh:

#!/bin/bash 

cat someFile 

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

Następnie wywołać netcata z głównego skryptu tak:

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

(Musisz bash wersja 3 dla wyrażenia regularne).

Zakłada się, że serwer wysyła dane w liniach - jeśli nie, musisz zmodyfikować plik client.sh, aby czytał i odtwarzał znaki na raz.

+0

Komentując starą odpowiedź, ale moja wersja nc (1.10) potrzebuje -e zamiast -c (i wtedy to działa ładnie dla mnie). Ponadto, wybieranie nitów: unikałbym wywoływania 'printf' za każdym razem w pętli, preferując ustawienie zmiennej na wyrażenie regularne jeden raz. Na przykład: 're = $ '. * \ X1C. *'' ... następnie użyj '[[$ FOO = ~ $ re]]' jako warunkowe. – sjnarv

4

Może rzucić okiem na nkat, a także:

„nkat jest zwieńczeniem wielu kluczowych cech z różnych wcieleniach Netcat takich jak Netcat 1.x, netcat6, socat, Cryptcat, GNU Netcat itp nkat ma wiele nowych funkcji, takich jak "Connection Brokering", przekierowanie TCP/UDP, klienta SOCKS4 i supprt serwera, zdolność do "łańcucha" procesów Ncat, proxy HTTP CONNECT (i łańcuch proxy), obsługa połączeń SSL/nasłuch, adres IP/połączenie filtrowanie plus wiele więcej. "

http://nmap-ncat.sourceforge.net

7

Spróbuj:

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

wymaga GNU sed.

Jak to działa:

{ 
    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 
} 

Zauważ, że ten zakłada, że ​​nie będzie po nowej linii \ x01 - sed nie będzie to widział inaczej, jak sed działa linia po linii.

+0

To nie zadziała, ponieważ Netcat zamknie połączenie, gdy tylko 'cat' zamknie standardowe wejście Netcat. – caf

+0

naprawiony, z limitem czasu nawet :) – bdonlan

6

Co powiesz na to?

po stronie klienta:

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

Testowanie:

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

po stronie klienta produkuje:

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 

Po wyświetleniu 'J', po stronie serwera zamyka & drukuje „zamknięte ... ", zapewniając, że połączenie rzeczywiście się zamknęło.

+1

Jak zdobyłem nagrodę, kiedy najwyższa głosowana odpowiedź nie jest moja, a nie ma akceptowanej odpowiedzi? – anishsane

2

To działało najlepiej dla mnie. Wystarczy przeczytać wynik za pomocą pętli while, a następnie sprawdzić "0x1c" za pomocą instrukcji if.

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

Działa to doskonale:

echo ^C | nc -v 29.7.144.21 1364 

Zobacz wyjście poniżej:

[root @ localhost ~] # echo^C | nc -v 29.7.144.21 1364 Ncat: Wersja 6.40 (http://nmap.org/ncat) Ncat: Połączono z 29.7.144.21:1364.^C Ncat: wysłano 3 bajty, 0 bajtów odebrano w 0,01 sekundy.

[root @ localhost ~] #

+0

Chociaż przydatny, to tak naprawdę nie odpowiada na pytanie. Po prostu wychodzi z pierwszego uruchomienia, nie czeka na "specjalną postać" ... – Nick

Powiązane problemy