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

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

共感・応援の気持ちを伝えよう!

  • 回答数5
  • 閲覧数290
  • ありがとう数14

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

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

よくわからないとのことですので、私の考えを実験する方法から説明します。 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をあけなくていい) 一度やってみてください。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

再度回答ありがとうございました。 この手順で実行してみたところ、実行されました。 なるほど、ちょっと意味がわかったような気がします。 参考になりました。ありがとうございました!

関連するQ&A

  • sudoコマンドについて。

     sudoコマンドについての質問です。 OSはFreeBSD 5.2です。  sudoコマンドというのは、初めにユーザのパスワードを聞いてきますよね。 っで、BSD上で実行するときはパスワードを入力すれば問題ないのですが、隣接したマシン(Win2000)のWeb上からCGIを使って実行しようとすると、 パスワードでとまってしまい、Webからは実行できなくなってしまいます。 BSD上でパスワードを入力して、その後5分間は(デフォルトのままなので)Web上からでも自由にsudoコマンドが使えます。 ですが、Webを使うにはBSD上でパスワードを入力する必要があるので、この作業もWebで全てさせたいと考えています。 ログイン画面のようなものを作って、sudoコマンド時のユーザーパスワードを入力してログインさせて以降は時間を気にせずsudoが実行できるようにしたいと思っています。 ですが、CGIでフォームを作ってどのようにすればいいでしょうか? 例えば「sudo ipfw show」と現在のIPFWのルール設定を見ようと思ったら 「Password:」と聞いてくるのでそれに対してパスワードを送信しなくてはいけないわけですが、 Web上のテキストボックスに「sudo ipfw show」として送信すると、止まってしまいます。 そのままフリーズのようになってしまい、その後パスワードを入力することができません。 CGIでサーバとの対話的通信(?)のように行ったり来たりの通信をするには どのようにすればいいのでしょうか?

  • sudoでシェルスクリプトを実行させたい

    /usr/bin/sudo を使って、xxx.shを実行させたいので、設定でxxx.shを許可しました。 その後Apacheで動くCGI(perlスクリプト)から、``を使って実行させようと考えています。 このときにこのxxx.shがうまく動きません。多分シェルにアクセスできないのだと思いますが、どうしたらこのスクリプトをroot権限で動かす事ができるようになるのでしょうか。関係あるかどうかわかりませんが、xxx.shの中身はディレクトリ作成コマンドなどです。ネットで検索したら、シェルスクリプトだけ許可にすればよいとあったのですが・・。セキュリティ的には/bin/shを許可するのはまずそうな気がするのですが、こちらを許可してもよいものでしょうか。 環境等 xxx.sh 755 所有者(user1) Apache実行ユーザ (apache) CGIの実行ユーザ(apache?) 挑戦したコマンド(とアパッチのログ) `/usr/bin/sudo sh ./xxx.sh`; ->パスワード求められます (/bin/shの権限がない?) `/usr/bin/sudo ./xxx.sh`; ->/usr/bin/sudo: unable to exec ファイルのパス No such file or directory (xxx.shのファイルの場所はあってます) `/usr/bin/sudo フルパス/xxx.sh`; ->/usr/bin/sudo: unable to exec ファイルのパス No such file or directory (xxx.shのファイルの場所はあってます) 不足の点などあればご指摘ください。

  • 対話的にコマンドを送受信するには?

    FreeBSD 5.3のIPFWの設定を隣接したWindowsマシンからリモートでさせようとしています。 apacheを入れ、CGIを使って、現在はWeb上からリモート設定が可能な状態となっています。 sudoコマンドを使ってのリモート操作です。 リモートでルールを破棄しようとしているんですが、できずにいます。 BSDマシン上で「ipfw flush」とコマンドを打てばルールはすべて破棄されていましたが、 「sudo ipfw flush」とすると「are you sure?[yn]」と確認されるので ここで「y」とするとルールが破棄できます。 ですが、これをWeb上からリモートでしようとすると、対話的に通信する必要があるため、実現できません。 「sudo ipfw flush」というコマンドは送信できますが、その後に対する「y」というコマンドが送信できません。 こういった、送ったコマンドの返答に対してさらにコマンドを送るといったような、 対話的にコマンドを送信するにはCGIではどのようにしたらいいでしょうか? 一度、「sudo ipfw flush」と送ってしまうと、Web上ではフリーズしてしまい、 その後はapacheをストップして再起動しないと動作がおかしくなってしまいます。 CGIで対話的にコマンドを送受信するにはどのようにすればいいのでしょうか? チャットのようにすればいいのでしょうか?

    • ベストアンサー
    • CGI

その他の回答 (4)

  • 回答No.4

下の回答の訂正: loot→root

共感・感謝の気持ちを伝えよう!

  • 回答No.3

わたしなら、セキュリティのことを考えて、cgiからlocalhostの特定ポートへ接続して、localhostの特定ポートで待ち受けているloot権限のプログラムからスクリプトを起動しますね。 FreeBSDでは、localhostの特定ポートを待ち受けるには、 #/sbin/inetd -wW -a localhost -p /var/run/localhost.pid /etc/localhost.conf などと起動すると、楽にできると思います。 機能をポートで分ければ内容のパースも必要ありませんし。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

回答ありがとうございます。 知識不足なので、よくわかりませんがアドバイスありがとうございました。 参考になります。 いろいろと調べているとセキュリティのことがよく書いてありますが、 とりあえず動作だけ確認したいからセキュリティを考えないでやってみようとしてもできない状態です(^_^;)

  • 回答No.2

apache を root 権限で動かしているのでしょうか? ipfw は root 権限が無ければルールの改廃ができないと思いますので、perl CGI で何かするなら  1. apache を root 権限で動かす  2. suidperl を使用して、特定の CGI だけ root 権限で動かす 必要があるでしょう。  また、「できない」ときにどんなメッセージがブラウザあるいは apache のログに出るのかが分かりませんが、CGI としては問題なく動くコードなのでしょうか?  もしコードが分からない、という話であれば、CGI の勉強をお勧めするのですが...

共感・感謝の気持ちを伝えよう!

質問者からのお礼

回答ありがとうございました。 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 と、ファイルの権限によって二種類のエラーメッセージが表示されました。

  • 回答No.1
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)

試してないですけど、 $status = system("sh ./rules.sh telnet"); とかで実行できませんか?

共感・感謝の気持ちを伝えよう!

質問者からのお礼

回答ありがとうございます。 そのままではできませんでしたが、system関数でlsコマンドやpwdコマンドなどは動作しました。 ただ、このシェルスクリプトを動かす命令は反応なしでした。

関連するQ&A

  • LoadPowerProfile レジストリ(マシン実行)(マシンサービス)とは何であり、その役割は?教えてください。  

    お世話になります。 「システム構成ユーティリティ」より下記の2つを不具合によるエラーのためチェックを外しました。 ●名前         LoadPowerProfile 読み込み元       レジストリ(マシン実行) コマンド Rndll32.exe powrprof.dll,LoadCurrentPwrScheme ●名前         LoadPowerProfile 読み込み元       レジストリ(マシンサービス) コマンド Rundll32.exe powrprof.dll,LoadCurrentPwrScheme 上記のこの二つを同時に外してのエラーがないような状態です。 ※このどちらが、悪いのかは分かりませんので、ご存知の方の知識で片方か両方共に悪いのかご判断と、上記これらは何なのか?教えてください。

  • telnetでの接続方法

    WinXPでVB6を使用して、telnetで相手側(ルータ)コマンドを実行したい。 プログラミングしたい内容は以下です。  telnet ホスト名(or IP)   login:xxxx   password:xxxx   >コマンド実行   >close 以上の内容を行いたいのですが、教えてください。

  • telnet,rlogin,rshの違いってなに・・・・?

    どのコマンドもリモートホスト(linux系)にログインするコマンドのものですよね? この3つの具体的な違いってなんなのでしょうか?・・・ 日経リナックス(http://homepage2.nifty.com/cs/linux_command/) を参照すると telnet=>他のホストと通信をする rlogin=>リモート・マシンにログインする rsh=>リモート・マシンのコマンドを実行 となっています。 どのコマンドもリモートマシンにログインして実行するものだと思うのですが・・・。

  • テルネットしコマンドを自動実行

    今回PHPで複数台のルータにログインし、確認コマンドを実行・結果を出力するプログラムを作りたいと考えていますが、知識不足のためうまくいきません。 皆様のお力をお貸いただければと思います。 1.CSVファイルからルータのリスト(IPアドレス)を読み込みTelnetする (ログイン名やパスワードは全て同じ) 2.確認コマンドを実行 3.実行結果を新しいCSVファイルに出力する。 よろしくお願い致します。

    • 締切済み
    • PHP
  • telnet接続

    ある装置にtelnet接続し、コマンド(ccc dd ee)を送信して帰ってきた値を outou.dat というファイルに保存するプログラムを作っています。 接続すると login: と表示されるので「aaaa」と入力すると Welcome to aaaa > と表示され、「bbbb」と入力するとプロンプトが「#」に変わります。 >bbbb # そこでコマンド「ccc dd ee」を入力したときに帰ってくる応答をファイルに保存します。 #ccc dd ee ------応答データ-------- これを行うのに下記プログラムを実行しましたが、エラーは出ませんがファイルに何も 保存されませんでした。 何がいけないのかわかる方教えてください。 use strict; use Net::Telnet; my $host = '192.168.1.1'; my $login = 'aaaa'; my $enable = 'bbbb'; my $prompt1 = '/>/'; my $prompt2 = '/\S/'; my $telnet = new Net::Telnet( Timeout => 10, ); $telnet->open($host); $telnet->waitfor('/login:/i'); $telnet->print($login); $telnet->waitfor($prompt1); $telnet->print($enable); $telnet->waitfor($prompt2); my @result; $telnet->print("ccc dd ee"); ($result) = $telnet->waitfor($prompt2); open(OUT, "> outou.dat"); print(OUT "@result\n"); close(OUT); $telnet->close;

  • perl -wc

    telnet を利用できないユーザーの為に、ブラウザ上でPerl(CGI)の文法チェックができるようにしています。 フォームでファイル名を入力させ、チェックプログラム内で "perl -wc $filename" を実行して結果を出力させるだけだと思い作成したのですが、実行結果を受け取ることができません。 apache のログには実行結果が書かれているのでコマンドは正常に動作しています。  open(IN, "perl -wc $filename |");  while (<IN>) {   print $_; と  $ret=`perl -wc $filename`; でやってみましたがダメでした。 どなたかご教授願います。 よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • 構文チェックについて

    #!/usr/local/bin/perl $perl = `perl -wc web.cgi`; $perl=~s/[\r\n]/<BR>/g; print <<"END"; Content-type: text/html <HTML> <HEAD><TITLE>PERLCHECK</TITLE></HEAD> <BODY> perl<BR>$perl </BOBY> </HTML> END exit; と以上のように書いてますが。telnet上ではOKと出ますがブラウザでみるとエラーが出ます。 やりたいことは、Telnetを使っての構文チャックではなく、ブラウザ上で構文のチェックは出来ないか模索しています。上記の`UNIXコマンド`の部分で、freeやdf等のコマンドを実行させると実行結果が得られるので、その延長で出来ないかと考えてます。初心者なのですいませんが教えてください。

    • ベストアンサー
    • Perl
  • メールサーバにアクセスできない

    お世話になっております。 現在、メールサーバの設定を行っております。 クライアントマシンのメールソフトに設定を入れたのですが、サーバにアクセスできませんというエラーが出て動作しません。 クライアントマシンより以下のtelnetコマンドを実行した結果telnetでは接続できました。 telnet mail.(ドメイン) 587 telnet (ドメイン) 587 telnet (IP) 587 現在のゾーンは以下になります。 @ NS ns1.dns.ne.jp. NS ns2.dns.ne.jp. A (IP) MX 10 @ www CNAME @ mail CNAME @ ftp CNAME @ 何か原因や現象を知っている方がいたら教えていただけないでしょうか? お手数をおかけします。 何卒、宜しくお願いします。

  • sshやtelnetでログイン後、シェル(bash, csh)プロンプトからコマンド実行する方法は?

    下記掲示板(CGI)の設置で至急、「sshもしくはtelnet」の情報が必要になりました。(メールによる掲示板への投稿機能で必要) http://www.megumi-island.net/cgi.html#bbs sshやtelnetでログイン後、シェル(bash, csh)プロンプトからコマンド実行する一番簡単な方法を教えてください。なお、当方OSはWindowsXP環境です。 シェルから下記コマンドを実行したいのです。 $ ./mi_mlpost.pl (と入力し、Enterキーを押す) これでとりあえず第一難関クリアです。 付属のmi_mlpost.txtによれば、まだcronの設定があるようですが・・・

  • system関数でのシェル起動について

    system関数でシェルコマンドを発行しているC言語のプログラムがあります。 起動されるシェルコマンド(Cシェル)は2重起動防止のため以下の様にコマンド名をgrepしてPIDを取得し、2つ以上あると2重起動と見なしてコマンドを終了させています。 ps -aef | grep 自身のコマンド名 | grep -v grep ~ この時1回目の起動であるのに2重起動チェックに引っかかってしまいコマンドが実行されませんでした。 デバッグしたところ"csh コマンド名"のPIDとは別に一瞬"sh -c コマンド名"というプロセスがあってそれのPIDと合わせて2つに起動していると見なしていました。 調べたところsystem関数はsh経由(sh -c)でコマンドを実行するためだと言う事が分かり納得出来ました。 また元々バックグラウンドで起動させたいコマンドだったので以下の様に"&"を付与したところ2重起動チェックには引っかからなくなりました。 system("コマンド名 &") バックグラウンド起動させても2重起動チェックで弾かれれば納得出来るのですが、通常の起動と何が違うか分からずに釈然としません。 良く分かりませんが、通常起動だとオーバーヘッドで実行に時間がかかりチェックで弾かれるけど、バックグラウンドだと一瞬で起動されてたまたま上手く行った様に見えるだけだったりするなどなのでしょうか?? もしご存知の方がいらっしゃいましたらご教示頂けると幸いです。