重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

cgiプログラムから外部コマンドを実行させたいのですが,できることとできないことの区別が明確でありません.

システムコマンドのlsは実行できず,wc や cp は実行できます.

自作のプログラムはcgiプログラムと同じところある物は動きますが,それを/binや/usr/binに移動させると動かなくなります.

これはサーバのセキュリティがそのように設定されているということなのでしょうか?

A 回答 (3件)

> PATHは,printenv PATHで表示される物と同じですよね.



ひょっとして、落とし穴にはまられました?

PATH 変数の役割や概念は共通です。 しかし、PATH変数の値(内容)はプロセスによって違います。

だから、Perl の CGIから起動できるコマンドを調べるには、telnet 等でログインした時の PATH 変数を調べてもほとんどの場合役に立ちません。 CGI自身で『現在のPATHの内容』を調べてください。

> cgiプログラムと同じところある物は動きますが,それを/binや/usr/binに移動させると動かなくなります.

まずは、CGIプロセスの PATH変数中に /bin や /usr/bin が含まれているかどうかです。

次に、CGI から見える /bin や /usr/bin はあなたがコマンドをインストールした /bin や /usr/bin と同一かどうかが問題になりますが、他人が設定したサーバーのこのあたりの事をユーザーが調べるのは難しいかも知れません。

状況から察するに、レンタルサーバーですよね? 使える外部コマンドとか自作コマンドのインストール先とかが開示されて無ければ質問しましょう。
    • good
    • 0
この回答へのお礼

たびたびのご回答ありがとうございます.

>しかし、PATH変数の値(内容)はプロセスによって違います。

不勉強なもので,上記については存じておりませんでした.
ご指摘の通り,両者で表示されるPATHは異なっておりました.
#lsコマンドは/binの下にあり,これについてのパスは記述されておりました.

また,プログラム等のupload先のマシンと,Webサーバとなるマシンが異なっていたことが,もう一つの,CGIが動作しない原因となっておりました.
パスが通っていなかった/usr/local/binでも,フルパスで記述すれば動作致しました.

大変勉強になりました.重ねてお礼申し上げます.

お礼日時:2009/05/18 16:38

> コマンド単位での実行の許可,不許可というのがサーバでは可能ということですね.


> PATHを確認すればよいとのことですが,ディレクトリ毎に許可,不許可を分けているということになりますでしょうか.

技術的な詳細に興味の無い人向けにはYesと答えても良いのですが、そうでは無い場合には以下の様になります。

CGI の子プロセスとして起動する場合も、対話コマンドとして起動する場合も、ディレクトリ指定無で可能なコマンドは PATH と言う環境変数で制御されます。 この環境変数は複数のディレクトリのパスが「:」で区切られて入っています。

プロセスによって PATH環境変数の内容を変える事が、最も基本的な「そのプロセスにどのコマンドを許可するか」の制御です。

だから、PATH環境変数にリストされるディレクトリがそれぞれどんなファイルを含むかを調べれば実行できるコマンドを知る事ができます。

> ls は 実際は 'ls --color=tty' にエイリアスされていた

そのケースは影響無いでしょう。 影響があるのは、 ll が 「ls -l」 にエイリアスされてて、「ll」という名前のコマンドファイルは存在しないといった場合でしょう。


基本的で無い「実行可能なコマンドの制御」には、setuidビットの禁止とか chroot とかいろいろありますが、基本的なPATH変数で説明が付かない場合だけ調べたら良いでしょう。
    • good
    • 0
この回答へのお礼

再度のご回答ありがとうございます.

PATHは,printenv PATHで表示される物と同じですよね.

lsについては,/bin/lsにあり,パスはもちろん通っているのですが,サーバ側でディレクトリ内のファイル一覧を表示させることを禁止していることと関係しているのだと思います.

お礼日時:2009/05/18 14:10

> サーバのセキュリティがそのように設定されているということなのでしょうか?



そうだと思います。 特に共用レンタルサーバーの場合には、普通の UNIXコマンドのうち一部しか使えないのはむしろ普通だと思います。

調べるには、 $ENV{'PATH'} にリストされるディレクトリに何が入ってるかを見てください。 もしもCGIの入門勉強中であれば、それを表示する CGI作成も簡単な練習問題になります。

あるいはレンタルサーバーなら開示情報や質問で知ることもできるでしょう。
    • good
    • 0
この回答へのお礼

素早いご回答ありがとうございます.

コマンド単位での実行の許可,不許可というのがサーバでは可能ということですね.
PATHを確認すればよいとのことですが,ディレクトリ毎に許可,不許可を分けているということになりますでしょうか.

upload先のマシンと,Webサーバが動いているマシンが異なっていたため,自分の中で少し勘違いしている部分もありました.

ls は 実際は 'ls --color=tty' にエイリアスされていたことが,もしかしたら原因かもしれないと思いました.

お礼日時:2009/05/18 11:31

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!