chmod が効かない php で、chmod を使う方法。


スポンサーリンク

php には、chmod (パーミッション変更) コマンドがあっても、ほとんどの場面で使えません。
php は、他の言語と違ってあまりにも表に顔を出しすぎるため、セキュリティがキツカとですw

そこで perl を呼出してパーミッションを変更してやろうというわけです。

php の chmod の使い方


実際には、 php でパーミッションを変更するには、以下のように記述します。

chmod('/home/abc/www/pdir/',0777);


上の例は、/home/abc/www/pdir/ のパーミッションを 777 に変更する場合です。
このコマンドが効くサーバーもありますが(ほとんどまれ)、ほとんどは効きません。

そこで perl プログラムを1本書きます。
以下がソースプログラムです。
#!/usr/bin/perl —
#
#
#===============================================================================
# ↓ここを書換えてください(パスワード)
#===============================================================================
$pass="password";
#===============================================================================
# ここから↓は触らない
#===============================================================================
$prg_name="chmod.cgi";
#===============================================================================
$argc=0;
decARGV();
$MyPath=$argv{"path"};
#===============================================================================
if($argv{'pass'} eq $pass ){
$parm=$argv{'m'};
if($parm eq ""){$parm="777";}
HtmlHead();
if($argv{'p'} ne "" ){
system("mkdir ".$argv{'p'});
system("chmod $parm ".$argv{'p'});
print "success. chmod $parm ".$argv{'p'};
}elsif($argv{'c'} ne "" ){
system("chmod $parm ".$argv{'c'});
print "success. chmod $parm ".$argv{'c'};
}else{
print "option error\n";
}
HtmlFoot();
}
exit 0;
# ================================================================================
sub cHead
# ================================================================================
{
print "Content-type: text/html\n\n";
}
# ================================================================================
sub HtmlHead
# ================================================================================
{
local($htmltitle)=$_[0];
local($meta) =$_[1];
cHead();
print <<"EOM";
<HTML>
<HEAD>
<meta http-equiv="Content-Type" content="text/html; charset=x-sjis">
<meta http-equiv="x-ua-compatible" content="IE=8" >
<meta http-equiv="x-ua-compatible" content="IE=EmulateIE8" >
EOM
if($meta ne "" ){
print $meta;
}
print <<"EOM";
<TITLE>$htmltitle</TITLE>
</HEAD>
<body>
EOM
}
# ================================================================================
sub HtmlFoot
# ================================================================================
{
print <<"EOM";
</BODY>
</HTML>
EOM
}
# ============================================================================
sub decARGV
# ============================================================================
{
$w = $ENV{ 'QUERY_STRING' };
@warg = split(/\&/,$w);
foreach (@warg){
($smbl,$val)=split(/\=/,$_);
$argn{$argc} = $smbl;
$argv{$smbl} = $val;
$argc++;
}
}
# ============================================================================


パーミッションを変更する perl プログラム chmod.cgi の使い方


chmod.cgi をサーバーにアップして、ブラウザから chmod/cgi を呼び出します。

chmod.cgiの呼出しオプション


http://URL/chmod.cgi?pass=password&p=/home/abc/www/pdir/&n=777


オプション
pass : パスワード
p : パーミッションを変更するディレクトリ
m : 与えるパーミッション


スポンサーリンク



chmod.cgi (perl) を php から呼び出す方法


以下は、php から chmod.cgi を呼出す php の関数です。
以下の例では、wp-content/plugins/ に chmod.cgi をアップロードした場合です。
function perlchmod($file,$parm)
{
$chmod_link =";
$chmod_link =WP_PLUGIN_URL.'/chmod.cgi?';
$chmod_link.='p='.$file.'&';
$chmod_link.='m='.$parm;
file_get_contents($chmod_link1);
}


自作プラグインを使う場合、常に wp-content/plugins/ に chmod.cgi をアップロードするようにしておけば、
上記の呼出しプログラムは、共通で使うことができて便利です。

上記のプログラムも 1つのファイルにしておいて include_onceで読み込むようにしてあげれば、バッティングもしなくていいですね。

パーミッションを確認してからパーミッション変更をする方法


以下は、phpのデバッグ時にスナップショットするための関数です。
/********************************************************/
function yuzu_tracesub($buf,$sw)
/********************************************************/
{
// フォルダー名
$myfolder = 'plugin_test';
// trace stop
$trace_stop = 0; // 0:trace run 1;trace stop
//
// yuzu_tracesub("—-","w"); // first trace
// yuzu_tracesub("data","a+"); // continue trace
//
if($trace_stop==0){
$file = WP_PLUGIN_DIR."/".$myfolder."/snap.txt";
$fp = fopen($file, $sw);
fwrite($fp, "$buf\n");
fclose($fp);
}
}


tracesub の使い方


tracesub は、以下のように使います。
※上記のソースファイル

yuzu_trace('stack count='.$stack_count,"w");
foreach($stack as $line){
yuzu_trace('stack line='.$line,"a+");
}


ですが、この場合 プラグインのディレクトリに書き込みの許可がでていないとブラウザ上にワーニングエラーが表示されます。

tracesub を以下のように書き換えます。
ディレクトリのフォルダーのパーミションを確認して 777 でなければ、777 に変更する。
別に無条件で 777 にしてしまってもよかったのですが、chmod.cgi は、外部呼出しのため・・・もごもご。。。

/********************************************************/
function yuzu_tracesub($buf,$sw)
/********************************************************/
{
// フォルダー名
$myfolder = 'plugin_test';
// trace stop
$trace_stop = 0; // 0:trace run 1;trace stop
//
// yuzu_tracesub("—-","w"); // first trace
// yuzu_tracesub("data","a+"); // continue trace
//
if($trace_stop==0){
$file = WP_PLUGIN_DIR."/".$myfolder."/snap.txt";
perm_set($file,"www",'777');
$fp = fopen($file, $sw);
fwrite($fp, "$buf\n");
fclose($fp);
}
}
//**********************************************************************
function perm_set($file,$chck,$parm)
//**********************************************************************
{
// $file : ディレクトリ名
// $chck : 期待するパーミッションの値
// $parm : 設定するパーミションの値
$parm=yuzu_permcheck($file); // 指定ディレクトリのパーミションを読み込む
if( mb_substr($parm,0,1)!=$chck ){ // 期待値との一致を確認
$plugin_dir = 'plugin_test';
$chmod_link1 =";
$chmod_link1 =WP_PLUGIN_URL.'/chmod.cgi?';
$chmod_link1.='pass=password'.'&';
$chmod_link1.='p='.$file.'&';
$chmod_link1.='m='.$parm;
file_get_contents($chmod_link1); // perl の chmod.cgi を呼び出す。
}
}
//**********************************************************************
function yuzu_permcheck($file)
//**********************************************************************
{
// $file(ディレクトリ/ファイル)のパーミッションを文字列で返す
$info = ";
if( file_exists ( $file ) ){
$perms=fileperms($file);
/*
パーミッションの所有者、グループ、その他はの読み、書き、実行は、3BITづつ
*/
$info .= (($perms & 0x0080) ? 'w' : '-');
$info .= (($perms & 0x0010) ? 'w' : '-');
$info .= (($perms & 0x0002) ? 'w' : '-');
}
return($info);
}


この一連の関数によって、tracesub は、FTPを立ち上げてスナップを出力するディレクトリのパーミッションを変更しなくても使えるようになります。

chmod が効かない php で、chmod を使う方法のまとめ


プログラムの開発でのデバッグのほとんどが、変数が、そこのポイントでどうなっているのか、確認しながらの作業になります。

phpの場合、ブラウザに表示させることで多少は、対応できますけど、場所によっては、ブラウザに出せない場面があります。

そこで変数の内容をファイルに吐き出して、それを確認するという方法は、有効です。

また、chmod が使えなければ、いちいちFTPやtelnet を立ち上げてパーミションを変更する作業が発生し、「開発時の集中が途切れる」ことになります。

プログラムの開発は、頭の中での想像作業なので「集中の途切れ」は、致命的になることもあります。

そういった意味で php で chmod が効かないというのは、ほんと困ります。

この記事があなたの開発の一助になれば幸いです。



サーバーによっては、perl の chmod.cgi という名前が使えないところもありますので、その時は chmod.cgi のファイル名を変更してください。


スポンサーリンク