読み込み、書き込み権限のみで、実行権限がない状態のディレクトリ(drw-)の動作が気になったのでメモ。色々検索してもこのケースは無かったので。 そもそも、wがついててxがついてないディレクトリってみないなと思ったので。
Dockerコンテナで検証 イメージはubuntu:16.04
- ディレクトリの書き込み権限と実行権限はセットになって初めて変更加えてOKかどうかを司る。
- 書き込み権限だけあってもディレクトリ内にファイルの作成はできない。
- ただし書き込み権限がついていると、ディレクトリ自体の更新・アクセス・作成時刻が現在時刻にのみ変更できる。
- 誤解しやすい点だが、ディレクトリが削除、リネームができるかどうかは、親ディレクトリの権限に依存し、そのディレクトリ自体の権限は関係ない。
# rootで実行
root# adduser user
root# cd /home/user
root# chown root:user hoge
root# chmod 766 hoge
root# ll
total 4.0K
drwxrw-rw- 2 root user 4.0K 4月 26 10:50 hoge
root# cd hoge
#ファイルをつくる
root$ echo A B C | xargs -n 1 | sed 's/.*/echo & > &/' | sh
root$ ll
-rw-r--r-- 1 root root 2 4月 26 10:52 A
-rw-r--r-- 1 root root 2 4月 26 10:52 B
-rw-r--r-- 1 root root 2 4月 26 10:52 C
ここからuser
$ sudo su user
# userのホームディレクトリ以下ではあるものの、当然アクセス権はない。
$ cd /home/user/hoge
bash: cd: /home/user/hoge: Permission denied
# ディレクトリ以下のファイルも開けない
$ cat hoge/A
cat: hoge/A: Permission denied
# ファイルは作れない。
$ touch hoge/D
touch: cannot touch 'hoge/D': Permission denied
# リダイレクトもだめ。つまり実行権限がないと事実上書き込みもできない。
$ echo D > hoge/D
bash: hoge/D: Permission denied
# うるさいがファイル一覧は表示できる。
$ ls hoge
ls: cannot access 'hoge/B': Permission denied
ls: cannot access 'hoge/C': Permission denied
ls: cannot access 'hoge/A': Permission denied
A B C
# ディレクトリの更新日時
$ ls -l
total 4
drwxrw-rw- 2 root user 4096 4月 26 10:58 hoge
# ディレクトリの作成日時
$ ls -cl
total 4
drwxrw-rw- 2 root user 4096 4月 26 10:58 hoge
# ディレクトリの参照日時
$ ls -ul
total 4
drwxrw-rw- 2 root user 4096 4月 26 10:59 hoge
# touch して更新を試みると、それらは更新される。
$ touch hoge
$ ls -l
total 4
drwxrw-rw- 2 root user 4096 4月 26 11:02 hoge
$ ls -cl
total 4
drwxrw-rw- 2 root user 4096 4月 26 11:02 hoge
$ ls -ul
total 4
drwxrw-rw- 2 root user 4096 4月 26 11:02 hoge
# しかし--dateオプションは効かない。。
$ touch --date=1960-01-01 hoge
touch: setting times of 'hoge': Operation not permitted
# -mオプション(更新日時のみ変更)をつけても同じ
$ touch --date=1960-01-01 -m hoge
touch: setting times of 'hoge': Operation not permitted
# -tオプションもだめ
$ touch -t "2003010100" hoge
touch: setting times of 'hoge': Operation not permitted
# 中に消せないファイルがあるので、当然ディレクトリは削除できない
$ rm -rf hoge
rm: cannot remove 'hoge/B': Permission denied
rm: cannot remove 'hoge/C': Permission denied
rm: cannot remove 'hoge/A': Permission denied
# ディレクトリの名前は変更できる
$ mv hoge hoge1
$ ls
hoge1
# 権限の変更、所有者の変更は当然無理
$ chmod +x hoge
chmod: changing permissions of 'hoge1': Operation not permitted
$ chown user:user hoge
chown: changing ownership of 'hoge': Operation not permitted
# 下記のコマンドをrootで実行してhogeの中身を空にする。
# rm hoge/*
# ディレクトリが空であれば、rootでなくてもディレクトリを削除できる(親ディレクトリの権限に依存するため当然か。。)。
$ rm -rf hoge
比較のため、r-xの状態のディレクトリでも同じ実験
root# mkdir /home/user/fuga
root# cd /home/user
root# chown root:user fuga
root# ll
total 8.0K
drwxr-xr-x 2 root root 4.0K 4月 26 11:13 fuga
drwxrw-rw- 2 root user 4.0K 4月 26 11:13 hoge
root# sudo su user
# ここからuser
# touch すらできない
$ touch fuga
touch: setting times of 'fuga': Permission denied
# リネームはできる
$ mv fuga fuga1
$ ls
fuga1
# 当然移動はできる
$ cd fuga
# 削除はできる
$ rmdir fuga
参考: ファイルのパーミッション設定、ディレクトリは要注意 参考: https://unix.stackexchange.com/questions/21251/execute-vs-read-bit-how-do-directory-permissions-in-linux-work