Find отказано в доступе linux
Пытаюсь сделать это:
sudo echo no > /etc/pure-ftpd/conf/someparam
На что мне отвечают:
Новые пользователи довольно часто сталкиваются с такой ошибкой, как ошибка отказано в доступе Linux. Если вы только что перешли с Windows, то можете еще не знать всех особенностей операционной системы Linux и почему возникает такая проблема.
В этой статье мы рассмотрим причины ошибки access denied linux, а также как ее обойти.
Ошибка отказано в доступе Linux
Наиболее часто такая ошибка встречается, в таких случаях:
- Вы пытаетесь выполнить команду в терминале;
- Вы пытаетесь примонтировать внешний носитель с помощью файлового менеджера;
- Вы пытаетесь запустить системный сервис и находите такую ошибку в логе.
Многие программы проверяют после запуска от какого пользователя они запущены и говорят, что их нужно запускать от имени суперпользователя, но так ведут себя не все. Например, команда ls вернет ошибку отказано в доступе linux если вы попытаетесь посмотреть содержимое каталога суперпользователя:
Но эта же команда нормально отработает нормально при использовании команды sudo:
Другой случай, это если вы обнаруживаете проблему в логах какого-либо системного сервиса, например, веб-сервера Apache. Казалось бы, должно было быть все верно, потому что запуск и так выполняется от имени суперпользователя.
Но нет, сервисы не только запускаются от имени суперпользователя, но потом, для увеличения безопасности они меняют пользователя на обычного, не привелигированного. Например, Apache работает от имени пользователя apache или www-data. Уже от имени этого пользователя программа пытается получить доступ к файловой системе.
Если нужная папка не доступна этому пользователю для чтения то вы получите ошибку access denied linux. Обычно, в логе программа сообщает какая папка или файл нужен когда происходит ошибка.
Вам просто нужно поменять на него права с помощью утилиты chmod или изменить владельца chown. Причем, нужно чтобы ко всем подкаталогам на пути к целевому каталогу был доступ у программы. Например, нельзя так чтобы права на чтение /home/ не было, а на /home/user/ было. Так не пройдет.
Права разрешающие чтение и запись владельцу и только чтение для группы и остальных вставляются командой:
sudo chmod 755 /путь/к/файлу
Или для смены прав для всех файлов в каталоге и самого каталога:
sudo chmod -R 755 /путь/к/каталогу
Или вы можете изменить владельца, обычно, это более безопасная и распространенная практика:
sudo chown пользователь /путь/к/файлу
$ sudo chown -R пользователь /путь/к/каталогу
Имя пользователя, от имени которого работает сервис вы можете посмотреть с помощью команды:
sudo ps aux | grep имя_сервиса
После того как вы установите правильные права, ошибка отказано в доступе linux больше не будет встречаться.
Выводы
В этой статье мы рассмотрели что делать если случается ошибка нет доступа linux, а также почему она возникает. Надеюсь, эта информация была полезной для вас. Если остались вопросы, спрашивайте в комментариях!
У меня была проблема с Wi-Fi, которая до сих пор не решена из-за проблемы, которая возникла, когда я пытался ее решить.
Я нашел это решение для Wi-Fi, поэтому попробовал его:
Вставьте в конфиг этот текст
Я заметил, что у меня не было разрешения на запись или выполнение файла, поэтому я попытался использовать chmod решить проблему. Это упорядоченный список всех операций, которые я сделал и которые привели к проблеме этого вопроса:
После третьей или четвертой команды (я не уверен, какая из них) я потерял свои права администратора; на самом деле, если я пытаюсь использовать команду sudo он выводит 3 строки, которые я переведу как можно лучше:
На терминале отображается
Теперь, когда я открываю терминал, он выводит мне строку bash /etc/profile: Permission denied, которую я никогда раньше не видел, и пропущенная часть имени необычна, потому что вместо нее следует писать zenoraiser.
Что вы предлагаете мне сделать?
2 ответа
Там нет необходимости выполнять chmod вообще при использовании sudo редактировать файл, хотя вы не должны использовать sudo gedit (скорее sudo -H gedit например)
Поскольку вы не меняли рекурсивные разрешения, вы можете решить проблему довольно легко.
В реальной среде определите (поврежденный) корневой раздел на диске, используя sudo fdisk -l
Как я могу скрыть ошибки в то же время?
если shell это bash или zsh , есть решение, которое является надежным, будучи достаточно простым, используя только POSIX-совместимый find особенности, а bash сам по себе не является частью POSIX, большинство современных платформ Unix поставляются с ним, что делает это решение широко переносимым:
Примечание: есть небольшой шанс, что некоторые grep 's выход может прибыть после find завершается, потому что общая команда не ждет команды внутри >(. ) до конца. В bash , вы можете предотвратить это путем добавления | cat к команда.
>(. ) это (редко используется) выход подмена процесса что позволяет перенаправлять вывод (в этом случае, stderr выход ( 2> ) к stdin команды внутри >(. ) .
В дополнение к bash и zsh , ksh поддерживает их также в принципе, но пытается объединить их с перенаправлением из stderr, как это сделано здесь ( 2> >(. ) ), представляется молча игнорируется (в ksh 93u+ ).
- grep -v 'Permission denied' фильтры из ( -v ) все строки (с find поток stderr команды), которые содержат фразу Permission denied и выводит оставшиеся строки в stderr ( >&2 ).
побочный эффект бесплатно: find код выхода сохраняется: невозможность доступа хотя бы к одному из обнаруженных элементов файловой системы приводит к коду выхода 1 (хотя это не скажет вам, есть ли ошибки другое чем разрешение-отказано в них произошло (слишком.))
POSIX-совместимые решения:
полностью совместимые с POSIX решения либо имеют ограничения, либо требуют дополнительной работы.
если find выход должен быть захвачен в в любом случае (или подавлено полностью), затем решение на основе трубопровода из ответ Джонатана Леффлера просто, робастно, и POSIX-уступчиво:
отметим, что порядок переадресаций имеет значение: 2>&1 должны прийти первый.
на единственным недостатком является то, что общий выход код будет grep команды, а не find 's, которое в данном случае означает: если есть нет ошибки вообще или только разрешение-отказано в ошибках, код выхода будет 1 (сигнализации провал), в противном случае (ошибки, отличные от запрещенных разрешений) 0 - что противоположно намерению.
что сказал: find код выхода редко используется в любом случае, поскольку он часто передает мало информации за пределами фундаментальной сбой, такой как прохождение несуществующего пути.
Однако, конкретный случай даже только некоторые входных путей недоступны из-за отсутствия разрешений is отражены в find код выхода (как в GNU, так и в BSD find ): если ошибка разрешения-отказано происходит для любой из обработанных файлов код выхода имеет значение 1 .
следующий вариант адресует это:
теперь код выхода указывает, есть ли какие-либо ошибки кроме Permission denied произошли: 1 если это так, 0 иначе.
Другими словами: код выхода теперь отражает истинное намерение команды: success ( 0 ) сообщается, если нет ошибок вообще или только разрешение-ошибки запрещены.
Это, возможно, даже лучше, чем просто прохождение find ' s код выхода через, как в решении в верхней части.
gniourf_gniourf в комментариях предлагает (все еще POSIX-совместимый)обобщение этого решения использование сложных перенаправлений, который работает даже с поведением по умолчанию печати путей к файлу стандартный вывод:
как и в первом решении, однако, сообщенный код выхода будет grep , а не find , но то же исправление, что и выше, может быть применено.
примечания к существующему ответы:
есть несколько моментов, чтобы отметить о ответ Майкла Брукса, find . ! -readable -prune -o -print :
требует GNU find ; примечательно, что он не будет работать на macOS. Конечно, если вам нужна только команда для работы с GNU find , это не будет для вас проблемой.
Примечание.: Следующий пункт является вопросом философии и / или конкретного случая использования, и вы можете решить, что это не имеет отношения к вам и что команда хорошо соответствует вашим потребностям, особенно если просто печати пути-это все, что вы делаете:
туманный ответ, sudo find . > files_and_folders , лаконично и прагматично, но неблагоразумно для чего-либо, кроме просто печати имена, по соображениям безопасности: потому что вы работаете как root пользователь", вы рискуете иметь свой вся система испорчена ошибкой в find или вредоносной версией, или неправильным вызовом, который пишет что-то неожиданно, что не может произойти, если вы запустили это с обычными привилегиями" (из комментария к ответу mist tripleee).
2-е решение в viraptor ответ, find . 2>&1 | grep -v 'Permission denied' > some_file рискует получить ложные срабатывания (из-за отправки смеси stdout и stderr через конвейер), и, возможно, вместо этого отчетности non-разрешение-отказано в ошибках через stderr, захватывает их вместе с выходными путями в выходном файле.
если вы действительно хотите сохранить другие возможные ошибки, такие как слишком много прыжков по символической ссылке, но не отказано в разрешении, то вам, вероятно, придется сделать летающее предположение, что у вас не так много файлов под названием "отказано в разрешении" и попробуйте:
если вы строго хотите фильтровать только стандартную ошибку, вы можете использовать более сложные строительство:
есть бесконечные вариации на эту тема, в зависимости от того, что вы хотите сделать. Это будет работать на любом варианте Unix с любой производной оболочки Bourne (Bash, Korn. ) и любой POSIX-совместимой версией find .
если вы хотите адаптироваться к конкретной версии find у вас есть в вашей системе, могут быть альтернативные варианты. GNU find в частности, имеет множество опций, недоступных в других версиях-см. принятый в настоящее время ответ для одного такого набора опций.
Все операционные системы семейства Linux имеют четко разграниченные права доступа. В своей домашней директории пользователь может делать все, что ему угодно, до тех пор, пока укладывается в отведенные рамки. Попытка выйти за них приводит к появлению ошибки «Permission Denied».
Изменение прав в терминале
Рассмотрим вариант, в котором необходимо прочесть текстовый документ, созданный другим пользователем. Файлы TXT в Linux можно просматривать непосредственно в терминале с помощью команды «cat».
-
Заходим в каталог с интересующим нас документом. Набираем команду «cat filename», подставляя вместо «filename» имя нужного файла. На скриншоте показана ошибка «Permission Denied», выглядящая в русской локализации как «Отказано в доступе».
Получаем ошибку «Permission Denied» при попытке просмотреть содержимое файла
Проверяем права доступа к документу используя команду «ls -l»
Используем команду «chmod» и административные права для получения доступа
Просматриваем содержимое текстового документа командой «cat»
Изменение прав в файловом менеджере
Разберемся, как выполнить рассмотренную выше операцию в графическом интерфейсе, используя файловый менеджер из дистрибутива.
-
Как видно на скриншоте, значок файла изначально имеет дополнительные символы, указывающие на то, что доступ у нему ограничен. При попытке посмотреть содержимое получаем графический вариант ошибки «Permission Denied».
При попытке открыть текстовый документ получаем ошибку «Permission Denied»
Открываем меню «Файл» и перезапускаем файловый менеджер от имени root
Набираем пароль root в окне аутентификации
Открываем параметры файла с помощью контекстного меню
На вкладке «Права» разрешаем доступ для группы root и остальных пользователей
Открываем ранее недоступный файл в режиме чтения и изучаем содержимое
В заключение
Как видим, избавиться от ошибки Permission Denied достаточно просто. Решив изменить правда доступа к системным файлам, лишний раз убедитесь, что полностью уверены в своих действиях и понимаете последствия вносимых изменений.
Нужно задать права 755 только для каталогов и отдельно права 644 только для файлов. Как это сделать с помощью chmod?
find -type d -exec chmod 755 <> \; find -type f -exec chmod 644 <> \;
Мне в последнее время больше нравится так:
find . |xargs chmod .
Да, xargs как-то изящнее, но менее гибко.
Не проще ли find -type d -exec chmod 755 \*
Не проще ли find -type d -exec chmod 755 \*
У меня такой вариант не работает, поэтому не понял.
Зато портабельнее - своими глазами видел find без exec-а! Честное слово видел! (Аж челюсть выпала - оно-ж даже на 386bsd было. )
man xargs
догадаешься почему — получишь печеньку
Когда мало файлов xargs быстрее, так как для каждого файла не вызывается chmod, это хотите сказать?
а ещё символ ' в имени файла
похоже, что без разницы - большой список или нет.
а ещё символ ' в имени файла
не распарсил что ты пытался сказать, чем меньше execve — тем быстрее; вот с xargs их намноого меньше
Ок. Полагал, что xargs выполняет команду, только прочитав весь поток целиком.
хм. ну тут кагбе не распараллелишь, ибо всё упрётся в seek-time винта
Я о другом - xargs же разбивает полученный список по группам и для каждой группы выполняет execve->chmod, а не ждёт SIGPIPE/что-то_там и выполняет chmod для всего полученного списка из 100500 файлов.
вы бы прочитали man find, а потом лезли со своими учениями
А, всё, у xargs есть соответствующие ключи -L -n, отвечающие за разбивку. Тогда xargs в любых ситуациях лучше получается.
а если пробел в имени файла, срыватель покровов?
chmod -R u=rwX,go=rX
а если пробел в имени файла, срыватель покровов?
да хоть \r - УМВР. Сам проверь.
А, всё, у xargs есть соответствующие ключи -L -n, отвечающие за разбивку. Тогда xargs в любых ситуациях лучше получается.
плюсик - это и есть xargs.
А ещё такой вариант. Допустим, на одну из директорий установлены права 0000 и find выдаст ошибку чтения каталога. Тогда и +, и | xargs варианты завершатся с ошибкой и нужно явно вызывать для каждого объекта chmod?
Век живи, век учись. Не знал об x и X
ну если я правильно распарсил документацию - да. Очевидно, что xargs -0 нужно если требуется обработать имена найденных файлов. ИМХО.
Допустим, на одну из директорий установлены права 0000 и find выдаст ошибку чтения каталога. Тогда и +, и | xargs варианты завершатся с ошибкой и нужно явно вызывать для каждого объекта chmod?
нет. Существует 3 порядка (order) обхода дерева:
1. прямой: корень, потом поддеревья/листья.
2. обратный: поддеревья, а потом корень.
3. центрированый. Применяется в бинарных деревьях - левое поддерево - корень - правое. Для ФС не применяется, приходится всё сортировать с нуля.
Так вот, по умолчанию применяется 1й обход. Возможен chmod <> (конечно, если он разрешает права). А с ключом -depth производится 2й обход, и возможно удаление (-delete, -exec rm), и chmod, который запрещает доступ (даже тому, кто обходит).
Век живи, век учись. Не знал об x и X
на практике они очень редко помогают.
Тогда и +, и | xargs варианты завершатся с ошибкой
забыл сказать - xargs НЕ меняет порядок аргументов. В отличие например от *, которая не просто выдаёт список, но его сортирует по алфавиту. По этому, в частности, xargs на больших каталогах намного быстрее, особенно в UTF-8, чем звёздочка.
на практике они очень редко помогают.
Не думаю, что случай ТС-а уникален. У самого часто такая потребность возникала после копирования с флешек c fat.
Не думаю, что случай ТС-а уникален. У самого часто такая потребность возникала после копирования с флешек c fat.
Mount options for fat
(Note: fat is not a separate filesystem, but a common part of the msdos, umsdos and vfat filesystems.)
<. >
dmask=value Set the umask applied to directories only. The default is the umask of the current process. The value is given in octal.
fmask=value Set the umask applied to regular files only. The default is the umask of the current process. The value is given in octal.
Спасибо за информацию! Полагаю, что понял всё верно.
Меня вот какой случай интересует. Независимо от порядка обхода дерева очередной элемент дерева может находится в директории, для которой установлены права 0000, но xargs/+ не выполнили для неё chmod 755.
Но без +, то есть когда в chmod передаются аргументы по одному, команда завершится без ошибок.
Итого, если не известно, есть ли права на чтение+выполнение для низлежащих директорий, я так понимаю, оптимальным вариантом будет.
Но без +, то есть когда в chmod передаются аргументы по одному, команда завершится без ошибок.
ну а что вы хотели, если получить список нельзя, по той причине, что доступ к внутренним каталогам закрыт. Очевидно, что приходится обходить каталоги, и сразу их открывать, ибо нельзя войти в закрытую дверь, а _потом_ её открыть.
Итого, если не известно, есть ли права на чтение+выполнение для низлежащих директорий, я так понимаю, оптимальным вариантом будет.
не знаю. Смотря что у вас за файлы/каталоги, и что вы с ними хотите сделать.
тогда для этого случая сферического chmod в вакууме идеологиечески правильней всего делать расово православный циклический рекурсивный find со скриптом.
По-моему, совершенно вероятна ситуация, когда пользователь снял права r или x для владельца. Кстати, зачем может быть нужна такая возможность?
Как правило число директорий много меньше числа файлов и замена '+' на '\;' не скажется на времени выполнения команды, зато гарантирует положительный результат.
x очень часто снимают чтобы содержимое папки не смотрели. например для хомяка. r бывает снято по ошибке или при копировании с FAT.
x очень часто снимают чтобы содержимое папки не смотрели
Читайте также: