- PR -

PHPで外部コマンド実行

1
投稿者投稿内容
EMIKO
常連さん
会議室デビュー日: 2004/02/29
投稿数: 40
投稿日時: 2006-01-30 00:48
PHPでexec()関数を使って、PerlのCGIを実行しようとしていますが、どうしてもなりません。

それは、PHPでmkdir()を実行するとnobodyでディレクトリが出来てしまい、FTPで削除されないので、CGIでディレクトリを作成しようと思っています。

$UploadDirSiteT = "/home/***/public_html";
$userT = "user";
$SiteNameET = "abc";
$mkdir_cgi = "/home/***/public_html/mkdir.cgi";

$a = exec("$mkdir_cgi, $UploadDirSiteT $userT $SiteNameET");


このような感じでmkdir.cgiを実行したいのですが、exec()関数の記述の仕方が分かりません。
exec("$mkdir_cgi, $UploadDirSiteT $userT $SiteNameET");

このように$mkdir_cgiの後には、mkdir.cgiに渡したいデータを書いていいのでしょうか?
その辺が色々調べたのですが分かりませんでした。

---------------
mkdir.cgiの内容
---------------
#!/usr/bin/php -p
<?
if($_SERVER["argv"][1] AND $_SERVER["argv"][2] AND $_SERVER["argv"][3])
{
$_SERVER["argv"][1] = $UploadDirSite;
$_SERVER["argv"][2] = $user;
$_SERVER["argv"][3] = $SiteNameE;
if(mkdir($UploadDirSite ."/" .$user. "/" .$SiteNameE, 0755)
{
echo 'ok';
exit;
}
}
?>

このような感じです。

お分かりになられる方、宜しくお願いします。



[ メッセージ編集済み 編集者: EMIKO 編集日時 2006-01-30 00:49 ]
takepon
ベテラン
会議室デビュー日: 2005/11/28
投稿数: 55
お住まい・勤務地: 千葉県・東京都
投稿日時: 2006-01-30 06:23
おはようございます。

以下、間違ってたらすいません。

引用:

EMIKOさんの書き込み (2006-01-30 00:48) より:
PHPでexec()関数を使って、PerlのCGIを実行しようとしていますが、どうしてもなりません。

それは、PHPでmkdir()を実行するとnobodyでディレクトリが出来てしまい、FTPで削除されないので、CGIでディレクトリを作成しようと思っています。




nobody でディレクトリが出来るというのは、ディレクトリの所有者が nobody になるとおっしゃっているのでしょうか。
だとしたら、方式をCGIに変えて改善されるのか疑問です。
なぜ nobody になるかお分かりですか?

それと、Perl のCGIとおっしゃっている割には、


引用:

---------------
mkdir.cgiの内容
---------------
#!/usr/bin/php -p
<?
・・・・



実は PHP でお書きのようですね。(^^;
_________________
takepon
てんてこダンス
EMIKO
常連さん
会議室デビュー日: 2004/02/29
投稿数: 40
投稿日時: 2006-01-30 19:01
お返事ありがとうございます。

そうです。nobodyの所有者で、ディレクトリが出来てしまうのです。
それで、CGI(PerlでもPHP)でディレクトリを作成すると、所有者nobodyではできないと聞いたので・・・

PerlのCGIというのは間違いでした。PHPをCGIとして動作させようとしていました。

nobodyになるのか・・・だいたいは分かります。(間違っているかもしれませんが)
PHPは、Apache権限?で動作するからですか?
CGIにしてしまうと、その所有者権限でファイル等の作成を行える??
こんな感じで理解していました。
kalze
ぬし
会議室デビュー日: 2003/10/23
投稿数: 406
お住まい・勤務地: 東京・東京
投稿日時: 2006-01-30 20:10
引用:

そうです。nobodyの所有者で、ディレクトリが出来てしまうのです。
それで、CGI(PerlでもPHP)でディレクトリを作成すると、所有者nobodyではできないと聞いたので・・・



ちゃんと調べたほうがいいとおもいます。

引用:

nobodyになるのか・・・だいたいは分かります。(間違っているかもしれませんが)
PHPは、Apache権限?で動作するからですか?
CGIにしてしまうと、その所有者権限でファイル等の作成を行える??
こんな感じで理解していました。



PHPファイルをブラウザから呼び出したとき、
PHPをapacheのモジュールとして実行していれば、
そのPHPファイルはapacheを実行しているユーザー権限で実行されます。
そのため、nobodyでディレクトリができます。

そのPHPの中で、execで外部コマンドを実行した場合、
その外部コマンドは元のPHPを実行しているユーザー権限で実行されるので、
今やってることは無駄ではないかとおもいますが。

たぶん、CGIの場合にってのは、suExecが有効な場合に、
ブラウザからそのCGIスクリプトを呼び出すと、
通常のapacheに実行ユーザーではなく、
そのCGIスクリプトファイルの所有者権限で実行されるので、
作ったディレクトリの所有者がnobodyではないって話しではないでしょうか。

PHPの中でスーパーユーザーになれるのであれば、
chownでユーザー書き換えてしまう手もあります。

単純にFTPクライアントとかでアクセスしたときに、
書き込み権限がないために削除できないからというなら、
書き込み権限をchmodでディレクトリに対して与えてやればいいんじゃないでしょうか。

もしかしたら他の方法があったりするかもしれませんが、参考になれば。
EMIKO
常連さん
会議室デビュー日: 2004/02/29
投稿数: 40
投稿日時: 2006-01-31 01:55
お返事ありがとうございます。

そうです。PHPをapacheのモジュールとして実行しているので、所有者がnobodyとしてディレクトリが作成されます。

引用:

suExecが有効な場合に、
ブラウザからそのCGIスクリプトを呼び出すと、
通常のapacheに実行ユーザーではなく、
そのCGIスクリプトファイルの所有者権限で実行されるので、
作ったディレクトリの所有者がnobodyではないって話しではないでしょうか



そうです、そうです。suExecが有効な場合ですね。
私の自宅サーバーの方では、suExecが有効でないので無意味な事をしていたのかもしれません。

引用:

単純にFTPクライアントとかでアクセスしたときに、
書き込み権限がないために削除できないからというなら、
書き込み権限をchmodでディレクトリに対して与えてやればいいんじゃないでしょうか。



そうです。FTPクライアントで、そのディレクトリに対してファイルのアップロードや削除等を行いたいのですが、パーミッションは[777]にしています。
やはり、所有者が違うのでFTPでは何もできないのですよね?

何かいい方法があればいいのですが・・・
kalze
ぬし
会議室デビュー日: 2003/10/23
投稿数: 406
お住まい・勤務地: 東京・東京
投稿日時: 2006-01-31 04:21
引用:

そうです、そうです。suExecが有効な場合ですね。
私の自宅サーバーの方では、suExecが有効でないので無意味な事をしていたのかもしれません。



suExecが有効であり、そのCGIスクリプトがapacheから呼ばれた場合
だとおもいますが。
仮にsuExecが有効な状態で、モジュール版のPHPで動作するPHPスクリプトから、
execでCGIスクリプトが実行されても、今となんら変わらないとおもいますが。

引用:

そうです。FTPクライアントで、そのディレクトリに対してファイルのアップロードや削除等を行いたいのですが、パーミッションは[777]にしています。
やはり、所有者が違うのでFTPでは何もできないのですよね?

何かいい方法があればいいのですが・・・



やってみればはっきりするとおもいますが。
PHPで作成したディレクトリのオーナーがnobodyであっても、
パーミッションが777であるならば、
別のユーザーでFTPクライアントを用いて接続すれば、
そのディレクトリに対して、
・読み込み(ディレクトリ内の表示、ファイルのダウンロード)
・書き込み(ディレクトリの削除、ファイルのアップロード・削除)
は普通にできます。

むしろできないとパーミッションを777にしている意味がないとおもいませんか?




[ メッセージ編集済み 編集者: kalze 編集日時 2006-01-31 04:27 ]
takepon
ベテラン
会議室デビュー日: 2005/11/28
投稿数: 55
お住まい・勤務地: 千葉県・東京都
投稿日時: 2006-01-31 06:03
おはようございます。

引用:


そうです。FTPクライアントで、そのディレクトリに対してファイルのアップロードや削除等を行いたいのですが、パーミッションは[777]にしています。
やはり、所有者が違うのでFTPでは何もできないのですよね?




kalze さんのおっしゃる通り、わたしの認識では普通に出来るはずですが、
パーミッションが[777]なのに所有者が違うのでFTPでは何もできない、という
例を示されてはどうですか?


もしかしたら、ディレクトリ自体にスティッキィビットが立っていたりすると、
他のユーザでは削除できないです。



_________________
takepon
てんてこダンス

[ メッセージ編集済み 編集者: takepon 編集日時 2006-01-31 06:04 ]
1

スキルアップ/キャリアアップ(JOB@IT)