У меня есть коробка ReadyNAS с именем «хранилище», которая, как я считаю, основана на Debian. Я могу ssh в него как root. Я пытаюсь перенастроить веб-сервер, но у меня проблема с правами доступа к файлам, которую я просто не понимаю. Я ничего не могу сделать /etc/frontview/apache/apache.pem
даже с правами root! Похоже, он не имеет никаких специальных разрешений по сравнению с другими файлами в том же каталоге, и я могу работать с ними.
storage:~# whoami
root
storage:~# cd /etc/frontview/apache/
storage:/etc/frontview/apache# ls -lah apache.pem*
-rw------- 1 admin admin 4.0k Jul 10 2013 apache.pem
-rw------- 1 admin admin 4.0k Jun 9 05:57 apache.pem.2017-02-04
-rw------- 1 admin admin 1.5k Jun 9 05:57 apache.pem.orig
storage:/etc/frontview/apache# touch apache.pem
touch: creating `apache.pem': Permission denied
storage:/etc/frontview/apache# touch apache.pem.2017-02-04
storage:/etc/frontview/apache# rm -f apache.pem
rm: cannot unlink `apache.pem': Operation not permitted
Что такого особенного в этом файле, что к нему нельзя прикоснуться? Я не могу удалить это. Я не могу изменить разрешения на это. Я не могу изменить владельца этого.
Каталог, кажется, в порядке. У него осталось свободное место, он не смонтирован только для чтения. На самом деле я могу редактировать другие файлы в том же каталоге.
# ls -ld /etc/frontview/apache
drwxr-xr-x 8 admin admin 4096 Jun 9 05:44 /etc/frontview/apache
# df /etc/frontview/apache
Filesystem 1k-blocks Used Available Use% Mounted on
/dev/hdc1 2015824 504944 1510880 26% /
источник
ls -ld /etc/frontview/apache
иdf /etc/frontview/apache
. Может быть, папка на диске смонтированаro
?# mount
:/dev/hdc1 on / type ext3 (rw,noatime)
Ответы:
Я только что нашел проблему. Атрибут «неизменный» был установлен для этого файла.
ls
не показывает это. Вам нужна другая команда, чтобы увидеть это:После удаления неизменяемого бита я могу редактировать этот файл:
источник
ls
нет возможности перечислять атрибуты. Я забыл, но, возможно, даже системный вызов для их запроса не является переносимым, поэтому, вероятно, было проще реализовать их в отдельной утилите.)ls
бы этот бит показывался или если какая-либо из других команд, которые я использовал, содержала более полезные (и конкретные) сообщения об ошибках, объясняющие, почему в разрешениях было отказано.touch
знают, что системный вызов, с которым он предпринял попытку (open("apache.pem", O_WRONLY|O_CREAT|..., 0666)
), не удалсяEACCESS
. (Используйтеstrace -efile touch apache.pem
для просмотра системных вызовов, связанных с файлом). Как говорится в справочной странице для этого системного вызова , существует множество возможных причин EACCESS, и многие из них включают в себя родительские каталоги, а не сам файл. Написание кода, позволяющего точно определить, почему системный вызов вернул ошибку, которую он сделал, было бы чрезвычайно трудным, поскольку разные файловые системы и операционные системы различны ...errno
) и распечатываете ее. (Используяperror
функцию стандартной библиотеки C или эквивалентную). Это один из редких случаев, когда пользователю не всегда достаточно подсказки, чтобы быстро найти проблему, но в большинстве случаев она работает очень хорошо. (Особенно в сочетании сstrace
тем, когда есть какие-то сомнения относительно того, какая именно операция вызвала ошибку.) Она не идеальна, но может быть и намного хуже (ср. MS Windows, где в лучшем случае вы получаете код ошибки в Google.)chattr +i
, и заметил , чтоrm foo
(без-f
) подсказки:rm: remove write-protected regular file ‘foo’
. Потому чтоfaccessat(AT_FDCWD, "/var/tmp/foo", W_OK) = -1 EACCES (Permission denied)
. POSIX требуетrm
запроса по умолчанию перед удалением защищенных от записи файлов, и именно поэтому он проверяет в первую очередь. Таким образом, вы бы получили большую подсказку быстрее, если бы не использовалиrm -f
. : /access(3)
просит ядро проверить разрешения, как если бы оно действительно открывалось для записи, поэтому оно получает ACL и атрибуты.