Невозможно получить доступ к нет такого файла или каталога

Обновлено: 06.07.2024

Новые пользователи довольно часто сталкиваются с такой ошибкой, как ошибка отказано в доступе Linux. Если вы только что перешли с Windows, то можете еще не знать всех особенностей операционной системы Linux и почему возникает такая проблема.

В этой статье мы рассмотрим причины ошибки access denied linux, а также как ее обойти.

Ошибка отказано в доступе 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, а также почему она возникает. Надеюсь, эта информация была полезной для вас. Если остались вопросы, спрашивайте в комментариях!

Я принципиально не понимаю проблем, с которыми я сталкиваюсь, но буду обновлять этот пост, когда я это сделаю. Позвольте мне просто показать вам.

Контекст: я добавил диск на свою машину, и по какой-то причине я не могу получить доступ к каталогу (?) в теме.

ls -l

ls -a

CD

потрогать

Mkdir Загрузки

Кошка Загрузки

Загрузки файла

М.В. Загрузки вниз

Кроме того, следующие команды не удаляют файл (?) Как root или иным образом:

Еще одна часть информации, bash, автоматически завершает загрузку, так что bash, похоже, тоже думает, что она там есть.

4 ответа 4

ls: cannot access Downloads: No such file or directory total 56 d. ? ? ? ? ? Downloads drwxr-xr-x 26 user 12288 Aug 12 23:29 foo

Это типичный случай наличия только чтения perms на dir и никаких exec perms. А другие выходные данные команды показывают, что у вас нет разрешения на запись. Чтобы понять, почему это происходит, вам нужно знать об inode, dentries и процессе поиска пути в ядре.

D, вы не описали ситуацию вокруг проблемы, но здесь идет,

Каталог "существует", но без каких-либо видимых / установленных / назначенных разрешений и не принадлежит ни пользователю, ни группе. Фактически, на первый взгляд доступ для чтения полностью заблокирован. Опять же, опишите ситуацию вокруг этой проблемы, имея в виду, как вы пришли к этому моменту?

В качестве эксперимента загрузите живой дистрибутив и получите доступ к нему таким образом, получите список для загрузок и либо назначьте "стандартные" разрешения для каталога 755, либо удалите каталог. Время от времени у меня возникали "плохие записи" файлов с той же проблемой, и мне приходилось прыгать в живой дистрибутив, чтобы удалить их из моего ежедневного драйвера. Если вы МОЖЕТЕ получить доступ к каталогу загрузок из действующего дистрибутива, то перед удалением каталога восстановите содержащиеся в нем данные "вне мира". Лучше восстановить каталог правильно, как только вы вернетесь в нормальный режим работы.


Читать невозможно, либо пиши через userline, либо на пастебину залей.


В гноме есть утилитка, baobab называется.


Поправил текст, теперь читаемо.


чаще всего встречаются два варианта:

есть открытый файл, на который нет ссылки на ФС, соответственно du не может его посчитать, но и полностью удалить его нельзя т.к. какая-то программа держит его отрытым. проверять с помощью lsof | grep unlinked, или через /proc/<pid>/fd

запись о свободном месте хранится в суперблоке, он может быть поврежден. прогони fsck.

начни с первого варианта.

Можно просто перезагрузиться и посмотреть, что выйдет

Команда lsof | grep unlinked ниего не показала

А вот после перезагрузки все сошлось :) Спасибо.

Значит, val-amart попал в точку: какая-то зараза открыла здоровенный файл, но сразу сделала ему unlink. В результате du занятое место не находил, а df показывал под завязку забитый диск. Бывало у меня такое с переполняющимися логами, когда слишком жирный лог я удалил, а службу, его пишущую, не перезапустил. И получается: вроде как лога нет, а место он до сих пор занимает.


lsof | grep deleted


Эта команда сделает unlink старому логу и создаст новый. Так что ничего не изменится.


в том-то и дело что нет, можешь проверить.



с чего это? как раз и обнулится. просто тут етсь тонкость - если пишущая туда прога запомнила метсо куда писала и потом делает по нему seek каждый раз - то появится дырявый файл со всеми вытекающими отсюда сюрпризами :-)

В PHP скриптах, вызывая include() , require() , fopen() или их производные, такие как include_once , require_once или даже move_uploaded_file() , часто появляются ошибки или предупреждения:

Не удалось открыть поток: нет такого файла или каталога.

Как быстро найти первопричину проблемы?

Ответ 1

Есть много причин, по которым можно столкнуться с этой ошибкой, и поэтому я дам контрольный список того, что необходимо проверить в первую очередь для решения этой ситуации.

Предположим, у нас есть следующая строка:

require "/path/to/file"

Контрольный список

1. Проверьте путь к файлу на предмет опечаток

  • проверьте вручную (визуально проверив путь) ;

  • переместите все, что вызывается с помощью require* или include* в переменную, скопируйте ее и попробуйте получить к ней доступ с терминала:

2. Убедитесь, что путь к файлу правильный с точки зрения относительного и абсолютного пути

  • если он начинается с косой черты "/", то это относится не к корню папки вашего веб-сайта (корень документа), а к корню вашего сервер :

    • например, каталог вашего веб-сайта может быть /users/tony/htdocs ;

    • не относительно пути к корню вашего веб-сайта или файла ;

    • или всегда используйте абсолютные пути к файлам .

    1. используйте require __DIR__."/relative/path/from/current/file" , который возвращает каталог текущего файла ;

    2. определите SITE_ROOT константу самостоятельно:

      • в корне каталога вашего веб-сайта создайте файл, например , config.php

      • в config.php напишите :

    • в каждом файле, в котором вы хотите сослаться на корневую папку сайта, включите config.php и затем используйте SITE_ROOT константу везде, где хотите:

    3. Проверьте свои пути включения

    Другой способ включения файлов, ни относительный, ни абсолютный, - это полагаться на путь включения . Это часто бывает с библиотеками или фреймворками, такими как, например, Zend framework.

    Подобное включение будет выглядеть так:

    include "Zend/Mail/Protocol/Imap.php"

    В этом случае вы должны убедиться, что папка, в которой находится «Zend», является частью пути включения.

    Это можно проверить с помощью:

    echo get_include_path();

    Вы можете добавить в него папку с помощью:

    set_include_path(get_include_path().":"."/path/to/new/folder");

    4. Убедитесь, что у вашего сервера есть доступ к этому файлу

    Может случиться так, что у пользователя, запускающего серверный процесс (Apache или PHP), просто нет разрешения на чтение или запись в этот файл.

    Чтобы проверить, под каким пользователем запущен сервер, можно использовать posix_getpwuid :

    $user = posix_getpwuid(posix_geteuid());

    var_dump($user);

    Чтобы узнать права доступа к файлу, введите в терминале следующую команду:

    ls -l <path/to/file>

    5. Проверьте настройки PHP

      • Если установлено, PHP не сможет получить доступ к любому файлу за пределами указанного каталога (даже через символическую ссылку).

      • По умолчанию не устанавливается, и в этом случае ограничений нет.

      • Можно проверить, вызвав phpinfo() или используя ini_get("open_basedir") .

      • Вы можете изменить настройку, отредактировав файл php.ini или файл httpd.conf.

      • Е сли включено, могут быть ограничения. Однако данный режим был удален в PHP 5.4. Если вы все еще используете версию, которая поддерживает безопасный режим, обновитесь до версии PHP, которая это еще поддерживает .

      • О тносится только к включению или открытию файлов через сетевой процесс, такой как http://, но не работает для локальной файловой системы.

      • Э ти опции можно проверить, используя ini_get("allow_url_include") или установи в с помощью ini_set("allow_url_include", "1") .

    Другие случаи

    Если ничего из вышеперечисленного не помогло диагностировать проблему, могут возникнуть следующие особые ситуации:

    1. Включение библиотеки на основе пути включения

    Может случиться так, что вы подключаете библиотеку, например, платформу Zend, используя относительный или абсолютный путь. Например:

    require "/usr/share/php/libzend-framework-php/Zend/Mail/Protocol/Imap.php"

    Но по-прежнему получаете такую же ошибку.

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

    Например, упомянутый ранее файл фреймворка Zend может включать следующее:

    include "Zend/Mail/Protocol/Exception.php"

    что не является включением ни по относительному пути, ни по абсолютному пути. Предполагается, что каталог фреймворка Zend был добавлен в путь включения.

    В таком случае единственное практическое решение - добавить каталог в ваш путь включения.

    2. SELinux

    3. Symfony

    Если вы используете Symfony и получаете эту ошибку при загрузке на сервер, возможно, к э ш приложения не был сброшен, либо потому, что app/cache был загружен, либо этот к э ш не был очищен.

    Для этого надо выполнить следующую консольную команду:

    cache:clear

    4. Внутри Zip-файла символы, отличные от A SC II

    По-видимому, эта ошибка может произойти также при вызове zip->close(), когда некоторые файлы внутри zip имеют в своем имени не-ASCII символы, такие как, например, «é».

    Потенциальное решение - обернуть имя файла, используя utf8_decode(), перед созданием целевого файла.

    Ответ 2

    В дополнение к предыдущему ответу:

    Программное обеспечение для виртуального хостинга

    Права доступа к файлам

    1. Этот пользователь владеет файлом и, возможно, родительским каталогом (особенно родительским каталогом, если вы хотите записывать файлы). В большинстве сред общего хостинга это не будет проблемой, потому что ваш пользователь должен владеть всеми файлами под вашим корневым каталогом.

    2. В Linux хорошей практикой будет использова ние chmod 600 (только владелец может читать и писать) или chmod 644 (владелец может писать, но все могут читать) .

    Ответ 3

    Samba Shares

    Если у вас есть тестовый сервер Linux и вы работаете из клиента Windows, общий ресурс Samba мешает команде chmod . Даже если вы используете:

    chmod -R 777 myfolder

    со стороны Linux вполне возможно, что Unix Group\www-data все еще не будет иметь доступ на запись. Есть рабочее решение : если ваш общий ресурс настроен так, что администраторы Windows сопоставлены с корневым каталогом – в Windows откройте разрешения, отключите наследование для вашей папки с копией, а затем предоставьте полный доступ для www-данных.

    Мы будем очень благодарны

    если под понравившемся материалом Вы нажмёте одну из кнопок социальных сетей и поделитесь с друзьями.

    Читайте также: