HTML,CSS,PHP,ワードプレスカスタマイズ 技術情報資料

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 のファイル名を変更してください。


スポンサーリンク

スポンサーリンク

よく使うタグ

・float クリア
<br clear="all"><div style="clear:both;" class="clearfix"></div>
・角丸め
round-radius
border-radius:5px; -webkit-border-radius:10px; -moz-border-radius:10px;
・div box
overflow:scroll;min-width:300px;max-width:300px;min-height:300px;max-height:300px;
・TEXTAREAリサイズ
resize: vertical;
・サイトURL
home_url() // http://…
if(site_url()==home_url){
$shorturl_yuzu_path = substr(ABSPATH,0,strpos( ABSPATH, substr(site_url(),strlen(home_url()) ) ) ).’/’;
}else{
$shorturl_yuzu_path = ABSPATH.’/’;
}
// /var/…
・WP HOME URL
site_url() // http://…/wp
ABSPATH // /var/…/wp
・プラグイン(自分のDIR追加必要)
plugins_url() // http://…/plugins
WP_PLUGIN_URL // http://…/plugins
WP_PLUGIN_DIR // /var/…/plugins
・使用中のテーマ
get_template_directory_uri() // http://…/theme/xx
get_template_directory() // /var/…/theme/xx
・wp-content
content_url() // http://…/wp-content
WP_CONTENT_DIR // /var/…/wp-content
・画像URLからDIR変換
$pctdir=str_replace(content_url(), WP_CONTENT_DIR,$pcturl);
・パス名分解
$pathData = pathinfo($file);
echo $pathData["dirname"]; // /var/~
echo $pathData["filename"]; // xxx
echo $pathData["extension"]; // txt
echo $pathData["basename"]; // xxx.txt
・画像サイズ
list($width,$height) = getimagesize($url);
if(has_post_thumbnail()){
$thumbnail_id = get_post_thumbnail_id();
$thumbnail_img = wp_get_attachment_image_src( $thumbnail_id , ‘full’ );
$src = $image[0]; //url
$width = $image[1]; //横幅
$height = $image[2]; //高さ
・画像サイズ比率
list($src_w,$src_h) = getimagesize($file);
$dst_w = 600;$dst_h = 0;
$dst_h = ($dst_w!=0)?(intval(($src_h*$dst_w)/$src_w )):(($dst_h!=0)?(intval(($src_w*$dst_h)/$src_h)):0);
・疑似要素順
link visited hover active


特殊文字
シングルクォート : &#39;
ダブルクォート : &quot;
WP設定内表示前処理(htmlタグ許可項目)
$str = str_replace(‘<','&lt;' ,$str);
$str = str_replace(‘>’,’&gt;’ ,$str);
$str = str_replace(‘\”‘,’&quot;’,$str);
$str = str_replace(“\'”,’&#39;’ ,$str);
WO設定項目表示前処理(htmlタグ許可項目)
$str = str_replace(‘\”‘,'”‘,$str);
$str = str_replace(“\'”,”‘”,$str);
・テーマ
get_theme_root_uri()
get_theme_root()
・WP 情報
get_bloginfo( $show )
・Wp config FTP 情報 設置
define( ‘FTP_HOST’, ‘host’ );
define( ‘FTP_USER’, ‘id’ );
define( ‘FTP_PASS’, ‘pw’ );
define( ‘FTP_SSL’, false );
弾に使う
placeholder:ユーザー入力補助

カテゴリー

MW WP FORM のフックが効かない。

MW WP FORM のフックが効かない。 MW WP FORM のフックが効かない。MW WP FORM は、各種フックがあってカスタマイズが便利~とか言われているプラグインですが。。。マニュアルにはあるのにフックが効かないフックがかなりある

MW WP FORM のショートコードで出力される内容をカスタマイズする。

MW WP FORM のショートコードで出力される内容をカスタマイズする。 MW WP FORM のショートコードで出力される内容をカスタマイズしたくなりました。非表示フィールド type=”hidden” にデータをためておいて、それをメール送信する

WelCart 買い物かごのカスタマイズ、テンプレートファイルの場所

WelCart 買い物かごのカスタマイズ、テンプレートファイルの場所 WelCart 買い物かごのカスタマイズするとき、毎回テンプレートファイルを探すのでメモしておきます。WelCart 買い物かごのカスタマイズ、テンプレートファイルの場所WelCart 買い物かごのカ

WelCart で投稿ページに商品購入欄を作る

WelCart で投稿ページに商品購入欄を作る WelCart の商品ページは、ご存知んごとくウルトラダサい。これをカスタマイズしないとなんとも素人っぽさの抜けないサイトになってしまう。WelCart で投稿ページに商品購入欄を作るときのモジュール

FB 広告 最適化~グーグルアナリティクスとサーチコンソールの連動のさせかた(必要な分だけ)

FB 広告 最適化~グーグルアナリティクスとサーチコンソールの連動のさせかた(必要な分だけ) FB 広告 最適化にあたって必要になってくるツールがグーグルアナリティクスとサーチコンソール。別にグーグルのアナリティクス、サーチコンソールでなくてもアクセス解析はできるんだけど、グーグルはユーザー囲

FB 広告 最適化~グーグルアナリティクスの使い方(必要な分だけ)

FB 広告 最適化~グーグルアナリティクスの使い方(必要な分だけ) FB 広告 最適化にあたって必要になってくるツールがグーグルアナリティクス。別にグーグルのアナリティクスでなくてもアクセス解析はできるんだけど、グーグルはユーザー囲い込みの為他のアクセス解析では見せな