Find возвращает «find: .: В разрешении отказано», но я не ищу в

#linux #bash #sudo

#linux #bash #sudo

Вопрос:

У меня есть огромный скрипт оболочки, который я устраняю. Я часто запускаю скрипт из своего домашнего каталога с помощью sudo . Всякий раз, когда выполняется find , я вижу эту ошибку:

find: .: Permission denied

Это правда, что root не имеет доступа к моему домашнему каталогу (который является текущим рабочим каталогом или . в приведенной выше ошибке), но я не прошу find что-либо делать в моем домашнем каталоге и предпочел бы оставить его в покое полностью.

Чтобы действительно довести дело до конца, я запустил это:

sudo find /dev -maxdepth 1 -type f

и все равно получаю ту же ошибку. Если -type -f удалено, ошибка добавляется в конец ожидаемых результатов. Конечно, если я cd /dev , ошибки нет .. вероятно, поскольку root имеет доступ к /dev . Хотя я не думаю, что это вызывает проблемы, из-за этого скрипт выглядит глючным. Как я могу предотвратить отображение скриптом этих ошибок?

Комментарии:

1. root должен быть доступ к вашему домашнему каталогу, если sudo find команда указывает это: вот что означает «root».

2. @pavium, Если только домашний каталог не смонтирован, например, поверх NFS с root_squash опцией (по умолчанию).

3. @Bolo правильный. Домашний каталог смонтирован извне. root у него нет разрешений на это.

Ответ №1:

Я запустил:

 strace find /dev -maxdepth 1
  

в GNU / Linux (Ubuntu) и оказывается, что это find использует fchdir системный вызов для обхода дерева каталогов и, наконец, выполняется fchdir , чтобы вернуться к исходному рабочему каталогу. Вот фрагмент:

 open(".", O_RDONLY|O_NOCTTY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY|O_NOFOLLOW) = 4
fchdir(4)                               = 0

... irrelevant ...

write(1, "/devn", 5)                   = 5
open("/dev", O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY|O_CLOEXEC) = 5
fcntl64(5, F_GETFD)                     = 0x1 (flags FD_CLOEXEC)
fchdir(5)                               = 0

... potentially more fchdirs ...

fchdir(4)                               = 0
close(4)                                = 0
  

Мой намек? cd /tmp (или в каком-либо другом полностью доступном каталоге) перед запуском find .

Комментарии:

1. Спасибо за помощь. Хотелось бы, чтобы был какой-то переключатель, чтобы отключить это поведение.

Ответ №2:

Добавьте cd / в начало скрипта. Если вы не source сделаете это, скрипт будет запущен во вложенной оболочке, поэтому ваш собственный $PWD не будет изменен. Если вы делаете исходный код, либо сохраните его $PWD в начале и cd -- "$PWD" в конце, либо просто, cd - если вы не выполняете никаких других cd действий в скрипте.

Ответ №3:

Попробуйте перенаправить stderr. Например, вы могли бы выбросить это:

 find /dev 2>/dev/null
  

Комментарии:

1. Спасибо за предложение. Я все еще хочу увидеть вывод stderr.

2. очень старый ответ, но это то, на что я наткнулся во время поиска. unix.stackexchange.com/a/42842 это ответ, который сохраняет остальную часть stderr. TL; DR find . 2>amp;1 | grep -v 'Permission denied'