2012-02-08 29 views
0

是否有可能在bash腳本中進行異步tcp偵聽?
請你可以提供一個簡單的例子或者描述相同事物的鏈接。如何在bash腳本中異步監聽?

+0

你想做什麼? – Mat 2012-02-08 13:32:49

+0

試圖在任何端口異步偵聽,'netcat'是否順便這樣做?或者它是同步的? – 2012-02-08 13:41:48

+0

爲什麼你想在bash中做到這一點?異步偵聽本身是無用的,如果你想捕獲一個傳入的SYN,你需要一個套接字的持久綁定。也許你應該看看xinetd? – Mat 2012-02-08 13:53:10

回答

0

這裏是一個hacky irc客戶端(我們將它稱爲stackirc)作爲一個例子(使用telnet,但您可以輕鬆選擇使用netcat或bash的內置/ dev/tcp處理)您將需要telnet和Xdialog使用它,但它基本上只是產生一個子shell來觀看一個文件(使用Xdialog --tailbox ...),這個文件稍後通過telnet進行更新。在這個例子中,我使用了標準管道,但如果使用了命名管道,它可能更具適應性和清晰度。

#!/bin/sh 
echo starting irc > $HOME/.irclog 
eval `Xdialog --stdout --separator " " --3inputsbox "setup" 0 0 \ 
     "USER=" "stackuser-$RANDOM" \ 
     "SERVER=" "irc.freenode.net" \ 
     "CHANNEL=" "#stackoverflow" \ 
     |while read USER SERVER CHANNEL; do 
     echo SERVER=\"$SERVER\" USER=\"$USER\" CHANNEL=\"$CHANNEL\" 
     break 
    done` 
#this is where we will get our asynchronous data 
Xdialog --title "$CHANNEL irc" --tailbox $HOME/.irclog 30 99 & 
XDPID=$! 
A='NICK '$USER' 
USER '$USER' +iw '$USER' :ashirc 
JOIN '$CHANNEL' '$USER 
while ([ "$A" ]) do echo "$A" #this sends the data to the pipe at the end 
    A=`Xdialog --timeout 200 --stdout --title "AshIRC message dialog" \ 
     --inputbox "Enter an IRC message for $CHANNEL" 0 0` 
    case $? in 
     255)A=PONG;; 
     1)kill $XDPID;; 
     0)echo $USER:$A >> $HOME/.irclog #see our messages too 
     A='PRIVMSG '"$CHANNEL"' :'"$A"'.';; 
    esac 
done | telnet $SERVER 6667 | while read LINE; do 
    echo ${LINE%%!*}:${LINE#:*:} 
done>> $HOME/.irclog