フォルダを指定してファイルのパーミッションを変更するプログラム
2014/09/12
フォルダを指定しパーミッションを変更するプログラムを作ってみた
プログラムを作った経緯とプログラムソース
とあるサーバで、ファイルのパーミッションをまとめて変更したい、という必要性があり、プログラムを作成してみました。
大したものではないですが、せっかく作りましたので、もし他の人も何か参考になるのならばと思ってここにアップしてみることにしました。
——————
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
<title>ファイルのパーミッション変更</title>
</head>
<form action="" method="post">
<input type="hidden" name="mode" value="submit">
フォルダ名:<input type="text" name="dir_name"><br />
※相対パスで入力し、最後の「/」は入力しない<br />
<br />
パーミッション:<input type="text" name="permission"><br />
※最初の「0」は入力しない<br />
<input type="submit" name="Chmod実行"><br />
</form>
<?php
if ( isset ( $_POST["mode"] ) ) {
if ( $_POST["mode"] == "submit" ) {
if ( !$_POST["dir_name"] ) {
echo " <br />";
echo "フォルダ名を入力してください。<br />";
} elseif ( !is_numeric ( $_POST["permission"] ) ) {
echo " <br />";
echo "パーミッションは数値で入力してください。<br />";
} else {
echo " <br />";
echo "■ファイル一覧<br />";
$dir_neme = $_POST["dir_name"] . "/";
if ( $dir = opendir ( $dir_neme ) ) {
while ( ( $file = readdir ( $dir ) ) !== false ) {
if ( $file != "." && $file != ".." ) {
$path = $dir_neme . $file;
if ( is_file ( $path ) ) {
echo $file . "<br>\n";
$perm = sprintf ( "%04d", $_POST["permission"] );
echo $perm . "<br>\n";
$res = chmod ( $path, octdec ( $perm ) );
}
}
}
closedir ( $dir );
}
}
}
}
?>
</body>
</html>
——————
サンプルソースの使い方
上記のソースプログラムを適当なファイル名のファイルにコピペして、サーバにアップして、そのファイルにアクセスすると下記のような画面が表示されます。
「フォルダ名」にフォルダ名を入力します。
相対パスで指定し、フォルダ名の最後に「/」は不要です。
「パーミッション」には指定したいパーミッションを入力します。
パーミッションの設定は「0755」「0666」など最初に「0」を付ける必要がありますが、その部分は自動付与しますので、入力は必要ありません。
「Chmod実行」ボタンをクリックすると、「フォルダ名」で指定したフォルダの中のファイルのパーミッションを「パーミッション」で指定したものに変更します。
フォルダのパーミッションは変更しません。
プログラムの解説
プログラムの解説、というほどたいそうな処理を書いているわけではありませんが、解説をしていきます。
35行目の「poendir」でフォルダを開いて、36行目の「readdir」で 1つずつのファイルを取得し、37行目で「.」「..」を排除し、39行目の「is_file」でファイルであることを確認(フォルダを排除)します。
42行目の「chmod」でパーミッションを変更します。
また、見ていただいて分かる通り、入力チェックは最低限しか行っていませんので、正しくない値を入れた場合は、想定外の不具合につながる可能性もあります。
さらに、サニタイジングも行っていませんので、使い終わったら速やかにプログラムファイルを削除しておく方がいいでしょう。
サンプルソースの注意点
このプログラムは想定通りの結果が得られない場合が多々あります。
下記のような場合は、サーバの設定によって実行できないものになりますので、あきらめるしかありません。
・chmod関数が使えない
chmod関数は、使い方を間違えるとサーバ全体に大きな影響を与えかねない関数であることから、これらの関数を利用できないようにしているサーバもあります。
・ファイルの権限が違う
サーバで動いているプログラムにはそれぞれ権限があり、FTPでアップロードしたファイルと、PHPのプログラムで生成されたファイルと、それぞれ違うユーザが割り当てられているサーバもあります。
その場合は、作成したユーザが違うためにプログラム上からパーミッションの変更ができない場合があります。
また、このプログラムは、パーミッションを変えるだけですが、設定に失敗するとシステム全体に大きな影響を与えてしまう可能性もありますので、まずは、テスト用のファイルで実験をしてみてください。
例えば、下記の様にフォルダとファイルを生成し、「test1」フォルダを指定して実験してみるとかテストファイルで試してみてください。
/test
/test/chmod_php.php
/test/test1/
/test/test1/01.txt
/test/test1/02.txt
/test/test1/03.txt
/test/test1/04.txt
/test/test1/05.txt
※「chmod_php.php」が上記サンプルのプログラムとします。
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!
関連記事
-
-
PHPのデバッグで使う print_r、var_dump、var_exportの動作の違い
PHPのデバッグ等で変数や配列の中身を確認するために使用する関数print_r、var_dump、var_exportの動作の違い、仕様の違いについて確認した。var_exportがオススメ。
-
-
WindowsのXAMPPのPHPではstrptimeは使用不可。代替はdate_parse_from_formatを使う
strptimeはWindowsのPHPには未実装。LinuxとMacで挙動が異なる。PHP8.1で非推奨になる。なので日付のチェックはdate_parse_from_formatを使おう。使い方を詳細解説。
-
-
数値がMySQLのint(11)に保存できない!PHPの変数が本当にint型か確認!
PHPでintegerとdoubleが混在するような計算をする場合は要注意!計算結果が整数値であっても途中で使用する変数にdoubleの値が入っているときは計算結果がintegerではない場合があります。
-
-
PHPで1ヵ月前、先月、今月1日、来月末の日付などの算出はDateTimeImmutableを使う
PHPには日時をオブジェクトとして生成する関数「DateTimeImmutable」「DateTime」が用意されている。これを利用して1ヶ月後、月初日、月末日、5日後などを指定して日付を取得できる。
-
-
ファイル変更だけ!ECCUBEの本番から開発環境をコピーする手順を解説
ECCUBEを本番から開発環境をコピーする際の手順を解説。PGMメンテに必要な開発環境を構築する手順を解説。ECCUBEの仕組みは簡単なので作業は5分ほど。
-
-
ECCUBEの新規追加ページがInternal Server Error・Not Foundに
ECCUBEで新規追加したページがInternal Server Errorに!原因はファイルのパーミッションの場合が多くその対処方法とプログラムの修正ポイントを解説。Not Foundも解説。
-
-
ECCUBEでアップロードできない。upload_max_filesizeを設定する場所
テンプレートをアップロードする際に発生するエラー「テンプレートファイルがアップロードされていません」の対処方法。これはファイル容量の制限に引っかかっています。
-
-
PHPパーミッション変更のchmod関数・モードを変数で指定する方法
パーミッション変更関数であるchmod関数の第二引数、ファイルモードの指定に変数を使う場合は8進数に変換するoctdec関数を使って変換します。
-
-
PHPのcURLでAPIやWebサイトへのアクセス方法。file_get_contentsとの比較
PHPからWebサイトにアクセスしてHTMLを取得、APIにアクセスして情報を取得する場合は、cURLがオススメ。file_get_contentsでも可能だがエラー制御に難がありトラブルのもとになる。
-
-
ECCUBEを開発環境から本番ドメインに変更でエラーが・パス変更について
レンタルサーバでサーバ会社から割り当てられたURLで開発し、本番公開時にドメインを当てたらエラーが!そんな場合の対処方法の解説。対処方法は簡単ですが管理画面からは対応不可。
