やったもん勝ち

主にプログラミングのこと。生産性向上の某とかも。

sudo rm -rf で削除できないファイルのパーミッション設定

背景

想定するのは、次のようなケース

普通に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

本当はソースとか読んで、「はいはい、そういう仕様ね」ってやりたいんですが、それはまたの機会にしておきます。