権限があるはずなのにfindコマンドでPermission deniedが表示される場合の対処法

findコマンドを使ったときに、対象ディレクトリの権限があるはずなのにPermission deniedと表示されて原因究明に時間がかかったため原因と対応メモです。

現象

以下のように、findコマンドを叩くとfind: Failed to restore initial working directory: /home/user/hoge: Permission deniedといったエラーが表示されてしまいます。

$ sudo -u nobody find ../fuga
../fuga
../fuga/piyo
find: Failed to restore initial working directory: /home/user/hoge: Permission denied

一応ちゃんとファイル一覧が表示されはしたので、findコマンド自体は正しく動作してそうです。

../fugaの権限を確認してみても、ちゃんとread権限はありそうです。

$ ls -l ../ | grep fuga
drwxrwxrwx 1 user user       512 Jul 28 03:29 fuga

一応ファイル一覧自体は取得できているので問題ないといえばないのですが、気持ち悪いので原因の調査を行いました。

原因

原因としては、findコマンドの実行ユーザはカレントディレクトリの実行権限も持っている必要がある、ということのようです。

確かに、findコマンドを叩いたディレクトリの権限を見てみると、findコマンドの実行ユーザは実行権限を持っていませんでした。

$ ls -l ../ | grep hoge
drwx------ 1 user user       512 Jul 28 03:03 hoge

read権限を与えてみます。

# 実行ユーザ(nobodyユーザ)でもreadできるようにする
$ sudo chmod 701 ../hoge
$ ls -l ../ | grep hoge
drwx-----x 1 user user       512 Jul 28 03:03 hoge

# 再度nobodyユーザでfindを叩く
$ sudo -u nobody find ../fuga
../fuga
../fuga/piyo

エラーなく実行できるようになりました。

参考:

find コマンドはカレントディレクトリへのアクセス権限が必要
find コマンドの実行にはカレントディレクトリへのアクセス権限が必要なので sudo でスクリプトを実行するときには気をつけたほうが良いというメモ

対策

カレントディレクトリにfindコマンド実行ユーザに実行権限を与えるか、権限を持っているディレクトリでfindコマンドを叩くようにしましょう。

それか、気にならないなら無視してもまぁいいんじゃないかなと思います。

コメント