Как закрыть соединение netcat после возврата определенного символа в ответе?
У нас очень простая передача сообщений tcp script, которая копирует некоторый текст на порт сервера, который возвращает и отображает ответ.
Часть script, которую мы заботимся, выглядит примерно так:
cat someFile | netcat somehost 1234
Ответ, возвращаемый сервером, является "полным", когда мы получим определенный код символа (в частности &001C
).
Как я могу закрыть соединение, когда получаю этот специальный символ?
(Примечание: сервер не будет закрывать соединение для меня. Пока я в настоящее время просто CTRL + C script, когда я могу это сделать, я хочу иметь возможность отправлять многие из этих сообщений один за другим.)
(Примечание: netcat -w x
недостаточно хорош, потому что я хочу как можно быстрее пропустить эти сообщения)
Ответы
Ответ 1
Создайте bash script client.sh:
#!/bin/bash
cat someFile
while read FOO; do
echo $FOO >&3
if [[ $FOO =~ `printf ".*\x00\x1c.*"` ]]; then
break
fi
done
Затем вызовите netcat из основного script следующим образом:
3>&1 nc -c ./client.sh somehost 1234
(вам понадобится bash версия 3 для соответствия регулярных выражений).
Предполагается, что сервер отправляет данные в строки - если нет, вам придется настроить client.sh так, чтобы он читал и эхо-символ за раз.
Ответ 2
Try:
(cat somefile; sleep $timeout) | nc somehost 1234 | sed -e '{s/\x01.*//;T skip;q;:skip}'
Для этого требуется GNU sed.
Как это работает:
{
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
}
Обратите внимание, что это предполагает, что после \x01 будет новая строка. sed не увидит ее иначе, поскольку sed работает по очереди.
Ответ 3
Как насчет этого?
Клиентская сторона:
awk -v RS=$'\x1c' 'NR==1;{exit 0;}' < /dev/tcp/host-ip/port
Тестирование:
# 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.
Клиентская сторона создает:
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
После появления "J" серверная сторона закрывается и печатает "закрыто...", гарантируя, что соединение действительно закрыто.
Ответ 4
Возможно, посмотрите и на Ncat:
"Ncat является кульминацией многих ключевых функций от различных воплощений Netcat, таких как Netcat 1.x, Netcat6, SOcat, Cryptcat, GNU Netcat и т.д. Ncat обладает множеством новых функций, таких как" Соединение Брокерство ", TCP/UDP Redirection, SOCKS4 клиент и сервер supprt, возможность" Chain "Ncat-процессов, проксирование HTTP CONNECT (и цепочка прокси-серверов), поддержка SSL-соединения/прослушивания, фильтрация IP-адресов/соединений и многое другое".
http://nmap-ncat.sourceforge.net
Ответ 5
Это сработало лучше для меня. Просто прочитайте вывод с циклом while, а затем проверьте "0x1c" с помощью оператора if.
while read i; do
if [ "$i" = "0x1c" ] ; then # Read until "0x1c". Then exit
break
fi
echo $i;
done < <(cat someFile | netcat somehost 1234)
Ответ 6
Это отлично работает:
echo ^C | nc -v 29.7.144.21 1364
См. вывод ниже:
[root @localhost ~] # echo ^ C | nc -v 29.7.144.21 1364 Ncat: версия 6.40 (http://nmap.org/ncat) Ncat: подключен к 29.7.144.21:1364. ^ C Ncat: отправлено 3 байта, 0 байт получено через 0,01 секунды.
[root @localhost ~] #