• ベストアンサー
  • 困ってます

隣接したマシンのWeb上からBSDルータのシェルスクリプトを実行させるには。

  • 質問No.1135330
  • 閲覧数290
  • ありがとう数14
  • 回答数5

お礼率 84% (351/415)

現在、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側にコマンドを送るにはどうしたらいいでしょうか?

質問者が選んだベストアンサー

  • 回答No.5
  • ベストアンサー

ベストアンサー率 53% (182/342)

よくわからないとのことですので、私の考えを実験する方法から説明します。

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をあけなくていい)

一度やってみてください。
お礼コメント
usui323

お礼率 84% (351/415)

再度回答ありがとうございました。

この手順で実行してみたところ、実行されました。
なるほど、ちょっと意味がわかったような気がします。

参考になりました。ありがとうございました!
投稿日時:2004/12/30 22:07

その他の回答 (全4件)

  • 回答No.4

ベストアンサー率 53% (182/342)

下の回答の訂正: loot→root
  • 回答No.3

ベストアンサー率 53% (182/342)

わたしなら、セキュリティのことを考えて、cgiからlocalhostの特定ポートへ接続して、localhostの特定ポートで待ち受けているloot権限のプログラムからスクリプトを起動しますね。

FreeBSDでは、localhostの特定ポートを待ち受けるには、
#/sbin/inetd -wW -a localhost -p /var/run/localhost.pid /etc/localhost.conf
などと起動すると、楽にできると思います。
機能をポートで分ければ内容のパースも必要ありませんし。
お礼コメント
usui323

お礼率 84% (351/415)

回答ありがとうございます。

知識不足なので、よくわかりませんがアドバイスありがとうございました。
参考になります。

いろいろと調べているとセキュリティのことがよく書いてありますが、
とりあえず動作だけ確認したいからセキュリティを考えないでやってみようとしてもできない状態です(^_^;)
投稿日時:2004/12/27 12:41
  • 回答No.2

ベストアンサー率 52% (94/180)

apache を root 権限で動かしているのでしょうか? ipfw は root 権限が無ければルールの改廃ができないと思いますので、perl CGI で何かするなら

 1. apache を root 権限で動かす
 2. suidperl を使用して、特定の CGI だけ root 権限で動かす

必要があるでしょう。

 また、「できない」ときにどんなメッセージがブラウザあるいは apache のログに出るのかが分かりませんが、CGI としては問題なく動くコードなのでしょうか?
 もしコードが分からない、という話であれば、CGI の勉強をお勧めするのですが...
お礼コメント
usui323

お礼率 84% (351/415)

回答ありがとうございました。

apacheはrootの時に動かしています。
suidperlというのがよくわからなかったのですが、
ファイルの実行権を
chmod 4755 fwrules.cgiなどと変更してみたりもしましたが、変化なしでした。

エラーログには、「-rws--x--x (4755)」のとき
rules.sh : Can't open rules.sh ; Permission denied

「-rwxr-xr-x (755)」のとき
ipfw: socket: Operation not permitted

と、ファイルの権限によって二種類のエラーメッセージが表示されました。
投稿日時:2004/12/27 12:39
  • 回答No.1

ベストアンサー率 50% (3003/5914)

試してないですけど、

$status = system("sh ./rules.sh telnet");

とかで実行できませんか?
お礼コメント
usui323

お礼率 84% (351/415)

回答ありがとうございます。

そのままではできませんでしたが、system関数でlsコマンドやpwdコマンドなどは動作しました。

ただ、このシェルスクリプトを動かす命令は反応なしでした。
投稿日時:2004/12/23 00:00
関連するQ&A

その他の関連するQ&Aをキーワードで探す

ページ先頭へ