Linux入門:コマンド操作のきほん
所有者の変更 chown
権限は緩めたのに、Web サーバーが書き込めない
アップロード用のディレクトリをグループまで書き込み可にしたのに、アプリからファイルを保存できない。よくある原因は権限の側ではなく、持ち主の側です。ls -l の 3 列目と 4 列目には、そのファイルの持ち主と所有グループが出ています。
ターミナル
$ ls -ld /var/www/uploads
drwxrwxr-x 2 root root 4096 May 20 12:00 /var/www/uploads持ち主が root、グループも root です。Web サーバーは www-data として動いているので、所有者にもグループにも当てはまらず、いちばん右のブロックが適用されます。そこには w がありません。権限をさらに緩めるのではなく、持ち主を直すのが筋の対処です。
誰のものにするかを付け替える
ターミナル
sudo chown -R www-data:www-data /var/www/uploadschown はユーザー名とグループ名を続けて書いて、持ち主を書き換えます。-R を付けると配下すべてに同じ持ち主を配ります。デプロイでファイルを送り込んだ直後は持ち主が送信元のままになりやすいので、この 1 行が手順書に組み込まれていることがよくあります。
ユーザー名を省いて chown :developers ファイル と書けば、グループだけを付け替えられます。逆にグループを省いて chown alice ファイル と書けば、グループはそのままで持ち主だけが変わります。
名前ではなく番号で持たれていることもある
ターミナル
$ ls -ln /data/report.csv
-rw-r--r-- 1 1001 1001 240 May 20 12:00 /data/report.csvls -ln は名前ではなく番号で表示するオプションです。別のマシンで作ったファイルを持ち込むと、番号に対応する名前がこちらに無いため、こうして数字のまま出ます。Linux が本当に記録しているのはこの番号のほうで、名前は表示するときに引き当てているだけです。
コンテナとホストでディレクトリを共有したときに突然書き込めなくなるのも、同じ番号が両者で別人に割り当たっているからです。名前が合っているかではなく、番号が合っているかで判定されます。
持ち主を変えられるのは基本的に root だけ
自分のファイルを他人に譲る操作も、一般ユーザーにはできません。譲れてしまうと、使用容量の制限を他人になすりつけるといった抜け道が生まれるからです。そのため chown は、ほぼ必ず sudo とセットで打つことになります。
sudo chown -Rは、パスを打ち間違えたときの被害がとても大きい操作です。/var/www /uploadsのように余計な空白が 1 つ入るだけで、/var/www全体の持ち主が変わります。実行する前に、同じパスでls -ldを打って対象を目で確かめてください。