星期二, 11月 08, 2005

Linux socket Programming - inetd

Sample : 用telent as client, shell script as server, 利用inetd作super daemon

因為inetd會受到DOS攻擊,所以有些server已經沒有啟動inetd了,所以先確認一下系統有沒有安裝inetd

inetd是配合/etc/services一起使用的。
/etc/services定義了service的名稱和port。
/etc/inetd.conf將service的名稱和執行的program連接起來。
inetd啟動後就會依照inetd.conf的內容,聆聽/etc/services中對應的service name定義的port number。

這個sample預計要作:
  1. create server application (script)
  2. 在command line測試server application (script)
  3. 決定一個port number給這個server用
  4. 在/etc/services中宣告這個server要使用的名字和port number
  5. 在/etc/inetd.conf中為server加入一行定義
  6. 重新啟動(或是reload) inet.d
  7. telnet到這個server的這個port,看看telnet的內容
OK,開始..script : hello.sh
寫一個shell script,顯示Hello !和目前時間:
#!/bin/bash
/bin/echo -n "Hello !"
/bin/date
測試一下,執行後cat /tmp/log.log會出現:
Hello: Thu Nov 10 09:12:26 CST 2005
這樣就OK了。
接下來要利用internet super daemon : inetd 來作網路管理的動作,將剛剛寫的test script加入成為一個一個port的service (?).
inetd的相關資訊可以info inetd,說明inetd的功能,動作方式和config file : inetd.conf的格式。
現在找一個port 3333給test script : hello.sh用,先確認系統目前沒有使用到這個port:
    1.找/etc/services有沒有列出這個port
    2.找/etc/inetd.conf有沒有使用
如果有的話,就選另一個。
先 修改/etc/services :加入一行:
hello    3333/tcp    #hello test
修改/etc/inetd.conf,加入
hello      stream tcp    nowait    root   /home/charles/hello.sh    hello.sh
第一個hello是service name,也就是定義在service裡的名字。
第二和第三 stream tcp 是protocol type。
第四是執行service的user,這裡用root。
第五是server program的位置,因為當初這個program 放在/home/charles/hello.sh。
第六是執行server program的command,因為hello.sh執行沒有argument,所以執行時的command就是hello.sh而已。

重新啟動inetd,先看看系統是不是有inetd在跑,如果有,就kill掉,因為inetd不檢查重複執行
# ps -aux | grep inetd
# kill XXX
重新啟動inetd...
# /etc/init.d/inetd start
OK。可以用telnet試試:可以看到hello.sh的輸出..
# telnet 127.0.0.1  3333
trying 127.0.0.1.
Escape character is '^]' .
Hello: Thu Nov 10 11:09:08 EST 2005
Connection closed by foreign host.

接下來作interactive的service :
跟剛剛 一樣,寫hellobidirectional.sh:
#!/bin/bash

firstname="initialization"
lastname="initialization"
/bin/echo
while test 1; do
/bin/echo
/bin/echo "Please type Linux celebs name below:"
read frstname

firstname=$(/bin/echo ${firstname} | /usr/bin/sed -e 's/^M$//')

/bin/echo "$firstname. "
case "$firstname" in
(richard) lastname="stallman";;
(linus) lastname="torvalds";;
(maddog) lastname="hall";;
(q*) lastname="quit";break;;
(*) lastname="Unknown celebs";;
esac
/bin/echo "$lastname"
done

/bin/echo
/bin/echo "Finished"
其中sed的^M是一個control word,就是按下Ctrl key同時按下M,
如果用Vi編輯的話,這剛好是vi的command,所以要輸入Ctrl-M要輸入Ctrl-V, Ctrl-M,其中Ctrl不要放開

在command line試試這一個shell script :
#./hellobidirection.sh


Please type Linux celebs name below:
linus
:linus
torvalds

Please type Linux celebs name below:
q
:q,

Finished
Connection closed by foreign host

接著用這個shell script來代替原來的hello。
修改inetd.conf,將原來hello的那一行改為
hello    stream tcp   /home/charles/hellobidirection.sh hellobidirection.sh
重新啟動inetd:
#/etc/init.d/inetd restart
一樣,使用telnet連線,可以看到interactive的輸出(跟剛剛在shell執行時一樣)。
使用C 寫Client端程式:

沒有留言:

網誌存檔