質問: 現在、BSDをルータにして、ブロードバンドルータのように隣接したWindowsマシンからWebで IPFWの設定をできるようにしようと考えています。 そして現在、独自のルールをシェルスクリプトで作成し、case文でそのコマンドを実行すると そのルールが設定されるようになっています。 例えば [Tt][Ee][Ll][Nn][Ee][Tt]) add allow tcp from any to any 23 setup ;; という風にあって「sh ./rules.sh telnet」で実行したらルールが設定されます。 これを隣接したマシンのWeb上でやらすために、このルータにapacheとperlを入れました。 CGIを使ってやらせようと思っています。 今は、隣のWindowsマシンからBSDルータにアクセスしてtelnetのチェックボックスとOKボタンを表示させています。 これにチェックを入れ、OKボタンをクリックさせたときにこの「sh ./rules.sh telnet」というコマンドをBSDルータ上で実行させたいとおもいます。 しかし、その処理がわかりません。 どうやってこのコマンドをBSD側に送信して実行させることができるのでしょうか? 今は、CGIでチェックを入れてOKしたら「telnet」がチェックされたという情報を表示するだけの状態です。 実際にBSD側にコマンドを送るにはどうしたらいいでしょうか?
回答: よくわからないとのことですので、私の考えを実験する方法から説明します。 1. 下のshスクリプトを/tmp/test.shとして書き込みます。 --ここから #!/bin/sh echo "this script is test." whoami echo "script end." --ここまで 2. スクリプトに実行権限をつけます。 chmod 755 /tmp/test.sh を実行します。 3. /etc/servicesを編集します。 /etc/servicesの最後に次の行を追加します。 --ここから testsh 20000/tcp --ここまで 4. inetd.confに次の行を追加します。 --ここから testsh stream tcp nowait root /tmp/test.sh test.sh --ここまで 5. inetdを再起動します killall -HUP inetd この状態で、 telnet localhost 20000 とすると先ほどのスクリプトがroot権限で動きます。 ただ、この状態だとポートスキャンに非常に弱いので、localhostのみをlistenするように新規にinetdを起動する方が安全だ、といいたかったのです。 これなら、perlからでもなんでも、またどんなユーザでも当該ポートに接続してreadするだけで状態が取れるので、ちょっとシステムに偏った作業でも便利に使えます。パスワードのようなものを実装する場合は、スクリプトの最初で1行読み込むようにして、その内容をチェックすればいいでしょう。その場合は接続後にwriteしてやるだけです。 当然、コマンドをパースする気があれば、コマンドも送れます。inetdで動かすほうのスクリプトは標準入力を直接読むだけですので、これも簡単です。(sockをあけなくていい) 一度やってみてください。