PHP で cifs マウントすると chmod の警告が出る
◆ noperm をマウントオプションに追加する
ある PHP で作られたページを開くと
PHP Warning: chmod(): Operation not permitted in ***
というエラーが毎回のようにでていました
エラーの場所は chmod 関数が実行されていました
composer であれこれライブラリ読み込んでいてその中の部分なので原因特定が大変そう
なんかめんどうだから後でいいや を続けていました
ですが エラーログを見たときにすごく邪魔だったのでそろそろどうにかしようと思いました
ライブラリとか全く関係なかった!
再現する方法
方法はここ参考に
Windows と Linux のファイル共有
share という名前のユーザでアクセス権限はフルコントロールにします
このフォルダに test.php というファイルを作ります
「notepc」 は Windows の PC 名です
これで /var/www/html/share01/test.php へのアクセスが Windows の test.php へのアクセスになりました
/var/www/html が DocumentRoot なので
http://fedora/share01/test.php
とアクセスすれば PHP が実行されてフォルダが作られるはずです
「fedora」は Linux のホスト名で家の中だと通常は IP アドレスになります
私は IP アドレス覚えれないので Linux はディストリビューション名にして hosts 設定しています
ここの下の方参考に
https で通信できるサーバを作る
PHP Warning: chmod(): Operation not permitted in /mount/test.php on line 4
絶対 0777 だから 0777 にしてもエラー出ないと思うんだけど
PHP だと何か問題あるのかと試してみる
何もおきない
ここで詰まってしまったのですが しばらく考えていると
web で動いてるときは apache ユーザだった!
ということに気づいて root 以外のユーザでやってみました
警告出たっ!
root 以外だと起きるようです
通常 mkdir して自分で作ったものは自分のものなので chmod できます
ですが cifs マウントなので自分で作ったものも root が所持者になります
なので chmod で警告が出る ということのようでした
chmod でエラーにならないようにする設定がないのか調べてみると ありました
noperm
permission を無視してくれます
設定するには mount のときのオプションに noperm を追加するだけ
無事 PHP の警告がなくなりました
Windows の設定で 共有設定はフルコントロールですが セキュリティタブでは共有用ユーザに書き込み権限がありませんでした
これが原因か と思ってフルコントロールにすると警告がでなくなりました
そういうことかぁ と思ってブログにまとめるために別 PC で同じことをして確認すると……警告出てる
そのときは複雑なライブラリの中のものそのまま試していて たまたま そこを通らないような if だったようです
設定変えて F5 しただけなのでてっきりそれが原因だと騙されました
やっぱりシンプルに再現出来る環境を準備してからがいいですね
ところで セキュリティタブで書き込み権限ないのに なぜ mkdir はできたんだろうと調べてみると
Authenticated Users に属しているので書き込み権限がありました
A から始まってるのは Administrators という思い込みでちゃんと見てなかったです
この Authenticated Users ですが Everyone みたいなもので 基本全員が対象だけど Guest だけは除いたものらしいです
ちゃんとしたユーザみんな ということらしいです
そういうもののためにグループユーザを追加削除もできないようで net localgroup コマンドでも出てきませんでした
PHP Warning: chmod(): Operation not permitted in ***
というエラーが毎回のようにでていました
エラーの場所は chmod 関数が実行されていました
composer であれこれライブラリ読み込んでいてその中の部分なので原因特定が大変そう
なんかめんどうだから後でいいや を続けていました
ですが エラーログを見たときにすごく邪魔だったのでそろそろどうにかしようと思いました
環境
まずは問題切り分けようと単純に chmod をシンプルな PHP で使ってみると同じ現象がおきましたライブラリとか全く関係なかった!
再現する方法
Windows
まずは Windows で share01 というフォルダを作ってフォルダを共有します方法はここ参考に
Windows と Linux のファイル共有
share という名前のユーザでアクセス権限はフルコントロールにします
このフォルダに test.php というファイルを作ります
<?php
mkdir("dir");
chmod("dir", 0777);
mkdir("dir");
chmod("dir", 0777);
Linux
これを Linux でマウントして apache の DocumentRoot の内側からシンボリックリンクを作ります「notepc」 は Windows の PC 名です
mkdir /mount
mount -t cifs //notepc/share01 /mount -o username=share,password=password,iocharset=utf8,file_mode=0777,dir_mode=0777
ln -s /mount /var/www/html/share01
mount -t cifs //notepc/share01 /mount -o username=share,password=password,iocharset=utf8,file_mode=0777,dir_mode=0777
ln -s /mount /var/www/html/share01
これで /var/www/html/share01/test.php へのアクセスが Windows の test.php へのアクセスになりました
/var/www/html が DocumentRoot なので
http://fedora/share01/test.php
とアクセスすれば PHP が実行されてフォルダが作られるはずです
「fedora」は Linux のホスト名で家の中だと通常は IP アドレスになります
私は IP アドレス覚えれないので Linux はディストリビューション名にして hosts 設定しています
ここの下の方参考に
https で通信できるサーバを作る
実行する
実行してみるとPHP Warning: chmod(): Operation not permitted in /mount/test.php on line 4
原因は?
マウントは 0777 オプションですし ll で見てもこうなってます[root@fedora ~]# ll /mount/
合計 1
drwxrwxrwx 2 root root 0 4月 1 11:58 dir
-rwxrwxrwx 1 root root 42 3月 31 21:51 test.php
合計 1
drwxrwxrwx 2 root root 0 4月 1 11:58 dir
-rwxrwxrwx 1 root root 42 3月 31 21:51 test.php
絶対 0777 だから 0777 にしてもエラー出ないと思うんだけど
PHP だと何か問題あるのかと試してみる
[root@fedora ~]# cd /mount
[root@fedora mount]# php -a
Interactive shell
php > mkdir("dir1");
php > chmod("dir1", 0777);
php > exit
[root@fedora mount]# php -a
Interactive shell
php > mkdir("dir1");
php > chmod("dir1", 0777);
php > exit
何もおきない
ここで詰まってしまったのですが しばらく考えていると
web で動いてるときは apache ユーザだった!
ということに気づいて root 以外のユーザでやってみました
[root@fedora mount]# sudo -u user php -a
Interactive shell
php > mkdir("dir2");
php > chmod("dir2", 0777);
PHP Warning: chmod(): Operation not permitted in php shell code on line 1
php > exit
Interactive shell
php > mkdir("dir2");
php > chmod("dir2", 0777);
PHP Warning: chmod(): Operation not permitted in php shell code on line 1
php > exit
警告出たっ!
root 以外だと起きるようです
通常 mkdir して自分で作ったものは自分のものなので chmod できます
ですが cifs マウントなので自分で作ったものも root が所持者になります
なので chmod で警告が出る ということのようでした
解決方法
PHP に限らずシェルで mkdir → chmod しても同じくパーミッションが許可されていないエラーになりますchmod でエラーにならないようにする設定がないのか調べてみると ありました
noperm
permission を無視してくれます
設定するには mount のときのオプションに noperm を追加するだけ
[root@fedora /]# umount /mount
[root@fedora /]# mount -t cifs //notepc/share01 /mount -o username=share,password=password,iocharset=utf8,file_mode=0777,dir_mode=0777,noperm
[root@fedora /]# cd /mount
[root@fedora /mount]# php -a
Interactive shell
php > mkdir("dir3");
php > chmod("dir3", 0777);
php > exit
[root@fedora /]# mount -t cifs //notepc/share01 /mount -o username=share,password=password,iocharset=utf8,file_mode=0777,dir_mode=0777,noperm
[root@fedora /]# cd /mount
[root@fedora /mount]# php -a
Interactive shell
php > mkdir("dir3");
php > chmod("dir3", 0777);
php > exit
無事 PHP の警告がなくなりました
騙された 編
最初に調べてた時のことWindows の設定で 共有設定はフルコントロールですが セキュリティタブでは共有用ユーザに書き込み権限がありませんでした
これが原因か と思ってフルコントロールにすると警告がでなくなりました
そういうことかぁ と思ってブログにまとめるために別 PC で同じことをして確認すると……警告出てる
そのときは複雑なライブラリの中のものそのまま試していて たまたま そこを通らないような if だったようです
設定変えて F5 しただけなのでてっきりそれが原因だと騙されました
やっぱりシンプルに再現出来る環境を準備してからがいいですね
ところで セキュリティタブで書き込み権限ないのに なぜ mkdir はできたんだろうと調べてみると
Authenticated Users に属しているので書き込み権限がありました
A から始まってるのは Administrators という思い込みでちゃんと見てなかったです
この Authenticated Users ですが Everyone みたいなもので 基本全員が対象だけど Guest だけは除いたものらしいです
ちゃんとしたユーザみんな ということらしいです
そういうもののためにグループユーザを追加削除もできないようで net localgroup コマンドでも出てきませんでした