2016-11-15 90 views
1

我需要實施一個「whois」服務,它將監聽whois查詢(whois -h),並將使用來自phpipam API的信息進行響應。我正在使用啓動腳本的xinetd在端口43上進行偵聽。 我的問題是,當我從服務器發送響應時,第一個新行後的服務器重置連接。出於測試目的,我只是試圖發送兩個回波線,結果是一樣的。如何格式化WHOIS響應

腳本:

#!/bin/bash 
echo "One" 
echo "Two" 

lsof的:

# lsof -i | grep whois 
xinetd 17696  root 6u IPv4 91809  0t0 TCP *:whois (LISTEN) 

的whois查詢(從客戶端):

# whois -h 192.168.4.129 44.44.44.44 
One 
fgets: Connection reset by peer 

tcpdump的:

# tcpdump -n -i any -X port 43 

16:34:01.162440 IP 192.168.4.128.49374 > 192.168.4.129.nicname: Flags [S],  seq 1949234703, win 29200, options [mss 1460,sackOK,TS val 337480796 ecr 0,nop,wscale 7], length 0 
    0x0000: 4500 003c 7a53 4000 4006 3617 c0a8 0480 E..<[email protected]@.6..... 
    0x0010: c0a8 0481 c0de 002b 742e f60f 0000 0000 .......+t....... 
    0x0020: a002 7210 8a80 0000 0204 05b4 0402 080a ..r............. 
    0x0030: 141d 8c5c 0000 0000 0103 0307 0000 0000 ...\............ 
    0x0040: 0000 0000 0000 0000 0000 0000   ............ 
16:34:01.162916 IP 192.168.4.129.nicname > 192.168.4.128.49374: Flags [S.], seq 3654394026, ack 1949234704, win 28960, options [mss 1460,sackOK,TS val 25631110 ecr 337480796,nop,wscale 7], length 0 
    0x0000: 4500 003c 0000 4000 4006 b06a c0a8 0481 E..<[email protected]@..j.... 
    0x0010: c0a8 0480 002b c0de d9d1 a0aa 742e f610 .....+......t... 
    0x0020: a012 7120 eb31 0000 0204 05b4 0402 080a ..q..1.......... 
    0x0030: 0187 1986 141d 8c5c 0103 0307 0000 0000 .......\........ 
    0x0040: 0000 0000 0000 0000 0000 0000   ............ 
16:34:01.162946 IP 192.168.4.128.49374 > 192.168.4.129.nicname: Flags [.], ack 1, win 229, options [nop,nop,TS val 337480797 ecr 25631110], length 0 
    0x0000: 4500 0034 7a54 4000 4006 361e c0a8 0480 [email protected]@.6..... 
    0x0010: c0a8 0481 c0de 002b 742e f610 d9d1 a0ab .......+t....... 
    0x0020: 8010 00e5 8a78 0000 0101 080a 141d 8c5d .....x.........] 
    0x0030: 0187 1986 0000 0000 0000 0000 0000 0000 ................ 
    0x0040: 0000 0000        .... 
16:34:01.163348 IP 192.168.4.128.49374 > 192.168.4.129.nicname: Flags [P.], seq 1:14, ack 1, win 229, options [nop,nop,TS val 337480798 ecr 25631110], length 13 
    0x0000: 4500 0041 7a55 4000 4006 3610 c0a8 0480 [email protected]@.6..... 
    0x0010: c0a8 0481 c0de 002b 742e f610 d9d1 a0ab .......+t....... 
    0x0020: 8018 00e5 8a85 0000 0101 080a 141d 8c5e ...............^ 
    0x0030: 0187 1986 3434 2e34 342e 3434 2e34 340d ....44.44.44.44. 
    0x0040: 0a00 0000 0000 0000 0000 0000 0000 0000 ................ 
    0x0050: 00          . 
16:34:01.164122 IP 192.168.4.129.nicname > 192.168.4.128.49374: Flags [.], ack 14, win 227, options [nop,nop,TS val 25631110 ecr 337480798], length 0 
    0x0000: 4500 0034 b92d 4000 4006 f744 c0a8 0481 [email protected]@..D.... 
    0x0010: c0a8 0480 002b c0de d9d1 a0ab 742e f61d .....+......t... 
    0x0020: 8010 00e3 8a2c 0000 0101 080a 0187 1986 .....,.......... 
    0x0030: 141d 8c5e 0000 0000 0000 0000 0000 0000 ...^............ 
    0x0040: 0000 0000        .... 
16:34:01.165523 IP 192.168.4.129.nicname > 192.168.4.128.49374: Flags [P.], seq 1:5, ack 14, win 227, options [nop,nop,TS val 25631110 ecr 337480798], length 4 
    0x0000: 4500 0038 b92e 4000 4006 f73f c0a8 0481 [email protected]@..?.... 
    0x0010: c0a8 0480 002b c0de d9d1 a0ab 742e f61d .....+......t... 
    0x0020: 8018 00e3 d5a7 0000 0101 080a 0187 1986 ................ 
    0x0030: 141d 8c5e 4f6e 650a 0000 0000 0000 0000 ...^One......... 
    0x0040: 0000 0000 0000 0000      ........ 
16:34:01.165844 IP 192.168.4.128.49374 > 192.168.4.129.nicname: Flags [.], ack 5, win 229, options [nop,nop,TS val 337480800 ecr 25631110], length 0 
    0x0000: 4500 0034 7a56 4000 4006 361c c0a8 0480 [email protected]@.6..... 
    0x0010: c0a8 0481 c0de 002b 742e f61d d9d1 a0af .......+t....... 
    0x0020: 8010 00e5 8a78 0000 0101 080a 141d 8c60 .....x.........` 
    0x0030: 0187 1986 0000 0000 0000 0000 0000 0000 ................ 
    0x0040: 0000 0000        .... 
16:34:01.165914 IP 192.168.4.129.nicname > 192.168.4.128.49374: Flags [R.], seq 5, ack 14, win 227, options [nop,nop,TS val 25631111 ecr 337480798], length 0 
    0x0000: 4500 0034 b92f 4000 4006 f742 c0a8 0481 E..4./@[email protected] 
    0x0010: c0a8 0480 002b c0de d9d1 a0af 742e f61d .....+......t... 
    0x0020: 8014 00e3 8a23 0000 0101 080a 0187 1987 .....#.......... 
    0x0030: 141d 8c5e 0000 0000 0000 0000 0000 0000 ...^............ 
    0x0040: 0000 0000        .... 
16:34:01.166350 IP 192.168.4.129.nicname > 192.168.4.128.49374: Flags [R], seq 3654394031, win 0, length 0 
    0x0000: 4500 0028 826a 4000 4006 2e14 c0a8 0481 E..([email protected]@....... 
    0x0010: c0a8 0480 002b c0de d9d1 a0af 0000 0000 .....+.......... 
    0x0020: 5004 0000 ea03 0000 0000 0000 0000 0000 P............... 
    0x0030: 0000 0000 0000 0000 0000 0000 0000  .............. 

如果我嘗試連接到43通過telnet,一切都很好地工作:

# telnet 192.168.4.129 43 
Trying 192.168.4.129... 
Connected to 192.168.4.129. 
Escape character is '^]'. 
One 
Two 
Connection closed by foreign host. 

UPDATE:

環路喜歡這工作得很好

while read line; do 
    echo "One" 
    echo "Two" 
    break 
done 

,但是我就是不明白爲什麼它是不是隻通過兩條回波線,或者即使我嘗試用計數器運行一個while循環:

#!/bin/bash 
COUNT=0 
while [ $COUNT -lt 5 ]; do 
    echo The counter is $COUNT 
    let COUNT=COUNT+1 
done 

它在第一個循環後停止:

# whois -h 192.168.4.129 44.44.44.44 
The counter is 0 
fgets: Connection reset by peer 

也許你有什麼想法,這兩個循環之間的原因/區別是什麼?

我/etc/xinetd.d/whoistest:

service whois 
{ 
    port   = 43 
    flags   = REUSE 
    socket_type  = stream 
    protocol  = tcp 
    user   = root 
    wait   = no 
    type   = UNLISTED 
    server   = /path/to/shell/script 
    disable   = no 
    log_type  = SYSLOG authpriv 
    log_on_failure += USERID 
} 

任何支持將不勝感激。

回答

0

您需要確保您的xinetd配置正確。您的腳本還需要處理來自whois客戶端的輸入。這工作:

#!/bin/bash 
while read line; do 
    echo $line 
    echo "foo" 
    break 
done 

這讀取您的線,回聲,然後一些東西。隨意用echo替換echo $ line,無論你想要什麼。

我不得不這樣配置的xinetd爲它工作:

service whois 
{ 
    port = 43 
    flags = REUSE 
    socket_type = stream 
    protocol = tcp 
    user = root 
    wait = no 
    type = UNLISTED 
    server = /tmp/w.sh 
    disable = no 
} 

希望這有助於。如果你的xinetd服務配置錯誤,它似乎會丟棄連接。如果您的服務器實際上沒有監聽來自客戶端的輸入,則會通過對等錯誤重置連接。

Hannu

+0

謝謝@Hannu。我用xinetd config和其他見解更新了我的問題:)也許你會有任何想法,這些循環如何不同。 – raindeftas

+0

我想這與緩衝IO有關。它發送一個字符串,然後期待以換行符結束的響應,然後發送另一個字符串(可能)等等。現在,如果接收端(您的whoisd)沒有使用套接字中的任何數據,則它會阻塞,並且會出現此錯誤。即使你不使用數據讀取任何東西,你需要接收它和丟棄。 – Hannu

+0

是的,讀取輸入參數可以解決問題。再次感謝你! – raindeftas