質問: 隣接したマシンのweb上からbsdルータのシェルスクリプトを実行させるには。 現在、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をあけなくていい) 一度やってみてください。