#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'