簡體   English   中英

如何在響應中返回某個字符后關閉netcat連接?

[英]How can I close a netcat connection after a certain character is returned in the response?

我們有一個非常簡單的tcp消息傳遞腳本,它將一些文本捕獲到服務器端口,該端口返回並顯示響應。

我們關心的腳本部分看起來像這樣:

cat someFile | netcat somehost 1234

一旦我們得到返回的某個字符代碼(特別是&001C ),服務器返回的響應就是“完成”。

當我收到這個特殊字符時,如何關閉連接?

(注意:服務器不會為我關閉連接。雖然我現在只是CTRL + C腳本,但我可以告訴它已完成,我希望能夠一個接一個地發送許多這些消息。)

(注意: netcat -wx不夠好,因為我希望盡快推送這些消息)

創建一個名為client.sh的bash腳本:

#!/bin/bash

cat someFile

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

然后從主腳本調用netcat,如下所示:

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

(你需要使用bash版本3進行正則表達式匹配)。

這假定服務器正在以行的形式發送數據 - 如果不是,您將不得不調整client.sh,以便它一次讀取和回顯一個字符。

這個怎么樣?

客戶端:

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'后,服務器端關閉並打印'關閉......',確保連接確實已關閉。

嘗試:

(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逐行操作。

也許看看Ncat:

“Ncat是Netcat 1.x,Netcat6,SOcat,Cryptcat,GNU Netcat等各種Netcat版本的許多關鍵特性的高潮.Ncat具有許多新功能,如”連接代理“,TCP / UDP重定向, SOCKS4客戶端和服務器支持,能夠“鏈接”Ncat進程,HTTP CONNECT代理(和代理鏈接),SSL連接/偵聽支持,IP地址/連接過濾,以及更多。“

http://nmap-ncat.sourceforge.net

這對我來說效果最好。 只需使用while循環讀取輸出,然后使用if語句檢查“0x1c”。

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

這非常有效:

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.01秒內接收0個字節。

[root @ localhost~]#

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM