sudo rm -rf で削除できないファイルのパーミッション設定
背景
想定するのは、次のようなケース
- ownerがrootでパーミッション設定が700のディレクトリmydir配下のディレクトリ・ファイルをすべて削除したい
- mydir配下のディレクトリ・ファイルのパーミッションはすべて700
- 削除を実行するのはsudo権限を持った一般ユーザー
- mydirのパスは、/tmp/mydir
普通にrootユーザーから削除しようと思ったら、
# rm -rf /tmp/mydir/*
を実行すればいいだけです。
と、いうことは、sudo権限を持っている一般ユーザーならば、
$ sudo rm -rf /tmp/mydir/*
とすればいいのではないか!
となるのが、素直な発想。
しかし、どうやらrmに関してはそうもいかないらしい。
最終的には、mydirのパーミッションを777に変更して、
$ sudo rm -rf /tmp/mydir/*
と実行して、その後にまたパーミッションを700に戻すという愚直な方法で解決しました。
以下、動作確認の備忘録です。
環境
MacOS 10.11.6 El Capitan
Vagrant 2.0.1
CentOS 7.2.1511
動作確認
mydirの作成
まずは、mydirを作成します。
rootになります。
sudo su -
mydirをはじめとするファイル群をつくります。
$ mkdir /tmp/mydir $ mkdir /tmp/mydir/aaa /tmp/mydir/bbb $ touch /tmp/mydir/aaa/c /tmp/mydir/aaa/d
現在のパーミッションを確認します。
$ yum install -y tree $ tree /tmp/mydir/ -pug mydir/ ├── [drwxr-xr-x root root ] aaa │ ├── [-rw-r--r-- root root ] c │ └── [-rw-r--r-- root root ] d └── [drwxr-xr-x root root ] bbb
パーミッションを変更します。
$ chmod 700 /tmp/mydir/ --recursive
確認します。
$ tree /tmp/mydir/ -pug /tmp/mydir/ ├── [drwx------ root root ] aaa │ ├── [-rwx------ root root ] c │ └── [-rwx------ root root ] d └── [drwx------ root root ] bbb```
期待通り、再帰的にパーミションの変更ができました。 mydirのパーミッションも確認します。
$ ls -l /tmp/ total 0 drwx------ 4 root root 26 Jan 18 04:06 mydir
そもそもこのディレクトリに対して、rootは期待する動作を実行できるのでしょうか。
$ rm -rf /tmp/mydir/* $ tree /tmp/mydir -pug /tmp/mydir 0 directories, 0 files
これはOKですね。 もう一度作り直します。
$ mkdir /tmp/mydir/aaa /tmp/mydir/bbb $ touch /tmp/mydir/aaa/c /tmp/mydir/aaa/d $ chmod 700 /tmp/mydir/ --recursive
ユーザー作成 そのままvagrantユーザーで行っても挙動は同じだと思いますが、新しく作ってまっさらなアカウントから検証します。
$ useradd test-user $ passwd test-user
sudo権限を付与する
/etc/sudoers.dを最近覚えた!
$ visudo -f /etc/sudoers.d/test-user
以下のように設定
test-user ALL=(ALL) NOPASSWD: ALL
正常に終了できました。
test-userで作業
$ su test-user
早速削除をやってみます。
$ sudo rm -rf /tmp/mydir/* $ sudo tree /tmp/mydir/ -pug /tmp/mydir/ ├── [drwx------ root root ] aaa │ ├── [-rwx------ root root ] c │ └── [-rwx------ root root ] d └── [drwx------ root root ] bbb 2 directories, 2 files
ガッツリ残っている。 やはり、一般ユーザーからは700のrootがownerのファイルは削除できないようです。
解決策
mydirのパーミッションを変更します。
$ sudo chmod 777 /tmp/mydir/ $ ls -l /tmp/ total 0 drwxrwxrwx 4 root root 26 Jan 18 04:17 mydir
mydirのパーミッションが変更されました。 mydir以下のパーミッションは変わっていません。
$ sudo tree /tmp/mydir/ -pug /tmp/mydir/ ├── [drwx------ root root ] aaa │ ├── [-rwx------ root root ] c │ └── [-rwx------ root root ] d └── [drwx------ root root ] bbb 2 directories, 2 files
と、これでrmを実行してみます。
$ sudo rm -rf /tmp/mydir/* $ sudo tree /tmp/mydir/ -pug /tmp/mydir/ 0 directories, 0 files
これでめでたく削除できました〜
あとはmydirのパーミッションを戻しておしまいですね
$ sudo chmod 700 /tmp/mydir
本当はソースとか読んで、「はいはい、そういう仕様ね」ってやりたいんですが、それはまたの機会にしておきます。