Perl初心者です。現在、ユーザのホームディレクトリのディスク容量を
Webでチェックできるcgiを作成しています。
my (~,$home,~)= getpwnam($user);
でユーザのホームディレクトリを取得して、
use File::Find
で容量を計算するところまではなんとか動くようになったのですが、ユ
ーザのホームディレクトリのパーミッションによっては、計算できない
ことがわかりました。
ホームディレクトリのパーミッションが、dwrx--x--x(711)だと計算で
きないのです。dwrxr-xr-x(755)なら計算できます。ほとんどのユーザ
が711なので全く意味がありません。
調べてみると、作成したCGIの権限がnobodyであることがわかりました
がここで行き詰まってしまいました。
現在ログインしているユーザの権限でCGIを実行させる方法がありまし
たらお教えください。できれば、CGIの組み方で回避できれば嬉しいの
ですが、環境やパーミッションを変更しないといけないのでしょうか?
よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (1件)

サーバーのセキュリティーを低下させるのでsetuid出来ないように


なっているところがほとんどです、確かrim netなんかはcgiスクリ
プトの実行権限がユーザー毎になっていたと思いますが、そのよう
なところでないと駄目でしょう。ちなみに、お望みのような事が出
来る回避方法がそのサーバーに公式に用意されたものでなければ、
その行為は一種のクラッキングです。
ところでなんで755とか705じゃいけないんですか?

marimo_cx

この回答への補足

回答ありがとうございます。
>ところでなんで755とか705じゃいけないんですか?
複数のユーザが、Web上で各々のユーザIDを入力することでディスク容量をチェックできるようにしたいのです。他ユーザのパーミッションを勝手に変更することができないのです。
ユーザホームディレクトリは、SunOsのファイルサーバに存在していてそれをLinux上で動くこのCGIでさせようようとしています。
root権限をもっていますので、サーバの設定を変更することは可能です。回答の中でSetuidはセキュリティが低下するとありますが、これを(いまはそれが何かわかりません)使用すれば、ユーザ権限でCGIを動作できるのでしょうか?Setuidについて調べてみようと思います。

補足日時:2001/01/30 12:34
    • good
    • 0
この回答へのお礼

回答ありがとうございました。ApacheのsuEXECを導入して試してみようと思います。汚染された変数等、問題が次々と...初心者の私には何がなんだか..?
一歩前進することが出来ました。ありがとうございます。

お礼日時:2001/02/01 11:39

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

このQ&Aと関連する良く見られている質問

Q$wfurikae = 1 if ( &ccom::getShukujitsu( &com::tD( $wwy,$wwm,$wwd )) ne '' );がよく

$wfurikae = 1 if ( &ccom::getShukujitsu( &com::tD( $wwy,$wwm,$wwd )) ne '' );

というスクリプトがあったのですが、

$wfurikae = 1 の後に;もいれずifがきています。

違和感があります。

どのような意味になるのでしょうか。

宜しくお願い致します。

Aベストアンサー

そのまんまだと思いますよ。
if 以下の条件が真の時 $wfurikae = 1となります。
Perlはいろいろな書き方ができますので、こういう書き方もありです。
英語の文法の並びにする書き方です。

Q「  」が表示されません

「main.cgi」というファイルを作り、単純にHTMLを表示するだけのCGIファイルを作成しました。

こんな感じ
------------main.cgi------------
#!/usr/local/bin/perl
print "Content-type:text/html\n\n";
print <<EOM;
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=shift_jis">
<title></title>
</head>
<body>
<略>
</body>
</html>
EOM
__END__
--------------------------------

それで、ほかのHTMLファイルに
<!--#exec cgi="main.cgi" -->
と入力してそのページを見てみると、
[an error occurred while processing this directive]
上の文章が表示されていました。
どうすれば「main.cgi」の内容を表示することができるのでしょうか?

よろしくお願いします。

「main.cgi」というファイルを作り、単純にHTMLを表示するだけのCGIファイルを作成しました。

こんな感じ
------------main.cgi------------
#!/usr/local/bin/perl
print "Content-type:text/html\n\n";
print <<EOM;
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=shift_jis">
<title></title>
</head>
<body>
<略>
</body>
</html>
EOM
__END__
...続きを読む

Aベストアンサー

Apacheの設定が
IncludesNoExec
だとSSIでexecは使えなくなるのでその設定がされているのではないでしょうか。
<!--#include virtual="main.cgi" -->
ではどうでしょうか。

QPrel正規表現で'$1$'.$saltのあたりが理解できない。

小生Perlを勉強中です。
Perl Codeに以下のようなパスワード暗号処理のサブルーチンが
ありましたが、読めません。教えて下さい。

sub encrypt{
local($inpw)=$_[0];
local(@SALT,$salt,$encrypt);

@SALT=('a'..'z','A'..'Z','0'..'9','.','\');
srand;
$salt=$SALT[int(rand(@SALT)).$SALT[int(rand(@SALT))];
$encrypt=crypt($inpw,$salt)||crypt($inpw,'$1$'.$salt);
return $encrypt;
}

とあります。
特に、下から3行目の($inpw,'$1$'.$salt)が
理解できません。
解説していただければ幸いです。

Aベストアンサー

過去に同様の質問がありました。ctpsysさんの疑問にすべて答えられるかどうかわかりませんが、すくなくとも
>下から3行目の($inpw,'$1$'.$salt)が理解できません
というご質問に対しては参考になるかと思います。

参考URL:http://oshiete1.goo.ne.jp/kotaeru.php3?q=74593,http://oshiete1.goo.ne.jp/kotaeru.php3?q=74593,

Q[perl] $xxx == 1 or $xxx == 5 or $xxx == 11 などと書くが面倒です

タイトルの通りです

if文などで長々と書くのが面倒なのですが何かいい方法はないのでしょうか?
以前はif($xxx =~ /^1$|^5$|^11$/)などと書いていたのですが、正規表現を使うと処理が遅いんですね

なるべく処理が軽くて簡潔な書き方がありましたら紹介してください

Aベストアンサー

配列なら
my @array = (1, 5, 11);
if (grep {$_ == $xxx } @array) { ... }
とかかな. ハッシュなら
my %valid = ( 1 => 1, 5 => 1, 11 => 1 );
if ($valid{$xxx}) { ... }
のような感じ (「ハッシュを使った重複チェック」のバリエーション).
あ,
if ($xxx == (1 or 5 or 11)) { ... }
のような形は, (そのままじゃないけど) Perl6 でサポートされる予定になっています. いつのことかは知りませんが.

Q$hts =~ s/##([^#]+)##/$FORM{$1}/g の意味を教えてください!

お世話になります。
perl素人なのですが必要に迫られてWEBで調べながら
ソースを解析していますが、次のコードで完全に止まってしまいました。

$hts =~ s/##([^#]+)##/$FORM{$1}/g

この場合、
#hts から ##([^#]+)## を探して $FORM{$1} に全て置き換えようとしていると思うのですが、以下2点が理解できず困っています。

1.##([^#]+)## の意味
$htsに##で囲まれた文字列が複数あるのでそれら全てを探すということでしょうか?

2.$FORM{$1} の意味
$1は1.で検索した結果だと思いますが、$FORM{ }は一体なんでしょうか?

素人がいきなり解析するのは無謀なのは承知の上ですが、
どうしても業務で必要なので、お知恵をお貸し下さい。
よろしくお願いいたします。

Aベストアンサー

1.
perlを基準に「正規表現」で調べてごらん

2.
同じくperlでHTMLのformデータを受け取る方法を調べてごらん


おすすめ情報