Software Design 2016年11月号

サポートページ

この記事を読むのに必要な時間:およそ 0.5 分

補足情報

P.174「Unixコマンドライン探検隊 第7回」補足情報

(2016年10月18日更新)

ディレクトリとファイルのrwx bitsと削除

ちょっと複雑なので,誌面上に書ききれなかった,ファイル削除と権限の関係をまとめました。削除対象のファイルが存在しているディレクトリと,ファイルのアクセス権限によって,rmコマンドを実行したときの挙動を整理してあります。1つずつ確認してみてください。

下記の動作確認は,Ubuntu 16.04とmacOS 10.12でおこないました。

以下の操作はすべて,user=masa として実行


$ id -un
masa

== [自分の所有するディレクトリに対して] ==

1. ディレクトリに書き込み権限があり,自分のファイルに書き込み権限がある場合

$ ls -la
total 0
drwxr-xr-x   3 masa      staff   102 10  4 11:11 .
drwxr-xr-x  75 masa      staff  2550 10  4 11:03 ..
-rw-r--r--   1 masa      staff     0 10  4 11:11 a

$ rm a
# 確認もなく,削除成功!
2. ディレクトリに書き込み権限があり,自分のファイルに書き込み権限がない場合

$ ls -la
total 0
drwxr-xr-x   3 masa      staff   102 10  5 13:13 .
drwxr-xr-x  75 masa      staff  2550 10  5 13:12 ..
-r--r--r--   1 masa      staff     0 10  5 13:13 a

$ rm a
override r--r--r--  masa/staff for a? y
# 確認後,削除成功!
3. ディレクトリに書き込み権限がなく,自分のファイルに書き込み権限がある場合

$ ls -la
total 0
dr-xr-xr-x   3 masa      staff   102 10  5 13:36 .
drwxr-xr-x+ 75 masa      staff  2550 10  5 13:12 ..
-rw-r--r--   1 masa      staff     0 10  5 13:36 a

$ rm a
rm: a: Permission denied
# 削除失敗!
4. ディレクトリに書き込み権限がなく,自分のファイルに書き込み権限がない場合

$ ls -la
total 0
dr-xr-xr-x   3 masa      staff   102 10  4 11:11 .
drwxr-xr-x  75 masa      staff  2550 10  4 11:03 ..
-r--r--r--   1 masa      staff     0 10  4 11:11 a

$rm a
rm: a: Permission denied
override r--r--r--  masa/staff for a? y
# 確認後,削除失敗!
5. ディレクトリに書き込み権限があり,他人のファイルに書き込み権限がある場合

$ ls -la
total 0
drwxr-xr-x   3 masa      staff   102 10  5 13:39 .
drwxr-xr-x+ 75 masa      staff  2550 10  5 13:12 ..
-rw-rw-rw-   1 root      staff     0 10  5 13:39 a

$ rm a
# 削除成功!
6. ディレクトリに書き込み権限があり,他人のファイルに書き込み権限がない場合

$ ls -la
total 0
drwxr-xr-x   3 masa      staff   102 10  4 11:07 .
drwxr-xr-x  75 masa      staff  2550 10  4 11:03 ..
-rw-r--r--   1 root      staff     0 10  4 11:07 a

$ rm a
override rw-r--r--  root/staff for a? y
# 確認の後,削除成功!
7. ディレクトリに書き込み権限がなく,他人のファイルに書き込み権限がある場合

$ ls -la
total 0
dr-xr-xr-x   3 masa      staff   102 10  4 11:07 .
dr-xr-xr-x  75 masa      staff  2550 10  4 11:03 ..
-rw-rw-rw-   1 root      staff     0 10  4 11:07 a

$ rm a
rm: a: Permission denied
# 削除失敗!
8. ディレクトリに書き込み権限がなく,ファイルにも書き込み権限がない場合

$ ls -la
total 0
dr-xr-xr-x   3 masa      staff   102 10  4 11:03 .
drwxr-xr-x  75 masa      staff  2550 10  4 11:03 ..
-rw-r--r--   1 root      staff     0 10  4 11:03 a

$ rm a
override rw-r--r--  root/staff for a? y
rm: a: Permission denied
# 確認の後,削除失敗!

== [他人の所有するディレクトリに対して] ==

9. ディレクトリに書き込み権限があり,自分のファイルに書き込み権限がある場合

$ ls -la
total 0
drwxrwxrwx   3 root      staff   102 10  4 11:11 .
drwxr-xr-x  75 masa      staff  2550 10  4 11:03 ..
-rw-r--r--   1 masa      staff     0 10  4 11:11 a

$ rm a
# 確認もなく,削除成功!
10. ディレクトリに書き込み権限があり,自分のファイルに書き込み権限がない場合

$ ls -la
total 0
drwxr-xr-x   3 root      staff   102 10  4 11:11 .
drwxr-xr-x  75 masa      staff  2550 10  4 11:03 ..
-r--r--r--   1 masa      staff     0 10  4 11:11 a

$rm a
override r--r--r--  masa/staff for a? y
# 確認の後,削除成功!
11. ディレクトリに書き込み権限がなく,自分のファイルに書き込み権限がある場合

$ ls -la
total 0
dr-xr-xr-x   3 root      staff   102 10  5 13:39 .
drwxr-xr-x  75 masa   o  staff  2550 10  5 13:12 ..
-rw-r--r--   1 masa      staff     0 10  5 13:39 a

$ rm a
rm: a: Permission denied
# 削除失敗!
12. ディレクトリに書き込み権限がなく,自分のファイルに書き込み権限がない場合

$ ls -la
total 0
dr-xr-xr-x   3 root      staff   102 10  5 13:39 .
drwxr-xr-x  75 masa      staff  2550 10  5 13:12 ..
-r--r--r--   1 masa      staff     0 10  5 13:39 a

$ rm a
override r--r--r--  root/staff for a? y
rm: a: Permission denied
# 確認の後,削除失敗!
13. ディレクトリに書き込み権限があり,ファイルに書き込み権限がある場合

$ ls -la
total 0
drwxrwxrwx   3 root      staff   102 10  4 11:07 .
drwxr-xr-x  75 masa      staff  2550 10  4 11:03 ..
-rw-rw-rw-   1 root      staff     0 10  4 11:07 a

$ rm a
# 削除成功!
14. ディレクトリに書き込み権限があり,ファイルに書き込み権限がない場合

$ ls -la
total 0
drwxrwxrwx   3 root      staff   102 10  4 11:07 .
drwxr-xr-x  75 masa      staff  2550 10  4 11:03 ..
-rw-r--r--   1 root      staff     0 10  4 11:07 a

$ rm a
override rw-r--r--  root/staff for a? y
# 確認の後,削除成功!
15. ディレクトリに書き込み権限がなく,ファイルに書き込み権限がある場合

$ ls -la
total 0
drwxr-xr-x   3 root      staff   102 10  5 14:09 .
drwxr-xr-x+ 75 masa      staff  2550 10  5 13:12 ..
-rw-rw-rw-   1 root      staff     0 10  5 14:09 a

$ rm a
rm: a: Permission denied
# 削除失敗!
16. ディレクトリに書き込み権限がなく,ファイルにも書き込み権限がない場合

$ ls -la
total 0
drwxr-xr-x   3 root      staff   102 10  4 11:03 .
drwxr-xr-x  75 masa      staff  2550 10  4 11:03 ..
-rw-r--r--   1 root      staff     0 10  4 11:03 a

$ rm a
override rw-r--r--  root/staff for a? y
rm: a: Permission denied
# 確認の後,削除失敗!

まとめ

長くなりましたが,結果を表にまとめておきます。表を眺めてみると,挙動が明らかになりますね。
クリックすると画像を大きく表示できます。

表

他人に消されては困るファイルは,ファイルの存在するディレクトリへの書き込み権限を落としましょう。

ファイルに対しての書き込み権限を落としてあると,削除時に確認プロンプトが出るようになります。

sticky bitのあるディレクトリに対するファイルの削除の例

sticky bit付きのディレクトリ中のファイルの削除の例も掲載しておきます。

== [他人の所有するstickyが立ったディレクトリにに対して] ==

書き込み権限があるファイルを削除をする

$ ls -la
total 0
drwxrwxrwt   4 root      staff   136 10  5 12:31 .
drwxr-xr-x  75 masa      staff  2550 10  5 12:28 ..
-rw-rw-rw-   1 root      staff  0 10  5 12:31 a

$ rm a
rm: a: Permission denied
# ディレクトリへの書き込み権限があっても,削除できない
自分が所有する書き込み権限があるファイルを削除をする

$ ls -la
total 0
drwxrwxrwt   4 root      staff   136 10  5 12:31 .
drwxr-xr-x  75 masa      staff  2550 10  5 12:28 ..
-rw-r--r--   1 masa      staff  0 10  5 12:31 b

$ rm b
rm: b: Permission denied
# 自分のファイルなら削除できる

お詫びと訂正

本書の掲載内容に下記の誤りがございました。読者の皆様,および関係者の方々にご迷惑をおかけしましたことをお詫び申し上げます。

(2016年11月8日更新)

連載「チャーリー・ルートからの手紙 第36回
P.167リスト1 22行目のコメント

# すでに経過した天気情報は削除
こちら、不要なコメントです。