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
コマンドを叩くようにしましょう。
それか、気にならないなら無視してもまぁいいんじゃないかなと思います。
コメント