Skip to content

Instantly share code, notes, and snippets.

@greymd
Last active April 26, 2017 11:48
Show Gist options
  • Save greymd/7094db865e3b14576b8d975ffdbbdfe5 to your computer and use it in GitHub Desktop.
Save greymd/7094db865e3b14576b8d975ffdbbdfe5 to your computer and use it in GitHub Desktop.
書き込みと読み込み権限のみを持ったディレクトリ(rw-)ってどんな動作すんの?

読み込み、書き込み権限のみで、実行権限がない状態のディレクトリ(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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment