Что вызывает ошибки «Отказано в доступе» при удалении файлов?

0

Я пытаюсь удалить /var/www/main/user_resources/documents/NewFolder1/NewFolder1/noname3.php с помощью PHP. Как показано ниже, владелец файла и группа phped, это группа для записи, а Майкл принадлежит группе phped. Я использую Centos с Apache.

[Michael@devserver NewFolder1]$ pwd
/var/www/main/user_resources/documents/NewFolder1/NewFolder1
[Michael@devserver NewFolder1]$ ls -l
total 4
-rwxrwxr-x. 1 phped phped 15 Jan  5 07:02 noname3.php
[Michael@devserver NewFolder1]$ groups Michael
Michael : Michael www phped
[Michael@devserver NewFolder1]$

Мой PHP-скрипт:

echo 'Current script owner: ' . get_current_user().'<br>';
echo($dirname.'</br>');
unlink($dirname);

И результат следует:

Current script owner: Michael
/var/www/main/user_resources/documents/NewFolder1/NewFolder1/noname3.php

An error occurred in script '/var/www/main/application/classes/library.php' on line 477: unlink(/var/www/main/user_resources/documents/NewFolder1/NewFolder1/noname3.php): Permission denied (error no: 2)

Почему Майкл не может удалить файл?

  • 0
    Ну, PHP-скрипты выполняются с пользовательскими www-данными независимо от того, с какого пользователя вы запускаете процесс php, поэтому владелец файла "Michael" не поможет, потому что PHP работает не с правами, которые получил "Michael", а с www-данными. , Попробуйте exec ("chown Michael $ dirname");
  • 0
    @MichaelBerkowski Да, но в разрешающем режиме.
Показать ещё 1 комментарий
Теги:
permissions
file
permission-denied

2 ответа

0

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

0

Это не Майкл, который блокируется удалением этого файла, но Apache. Вы должны установить apache как владельца этого файла, и ваш скрипт будет работать:

chmod 755 -R NewFolder1/
chown -R apache:apache NewFolder1/

Теперь проблема в том, что у пользователя Майкла не будет никаких привилегий ftp над этой папкой. Если вам нужны привилегии ftp, попробуйте следующее:

chmod 775 -R /var/www/main/user_resources/documents/NewFolder1/NewFolder1/
chown -R Michael:apache /var/www/main/user_resources/documents/NewFolder1/NewFolder1/

-R означает "рекурсивный", что означает, что все файлы и подпапки NewFolder1 наследуют одни и те же разрешения. Однако это не рекомендуется -especially, если вы используете общий сервер хостинга.

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

ls -la /var/www/main/user_resources/documents/NewFolder1/NewFolder1/

Решение №2:

Сначала войдите в систему root! если вы вошли в систему как другой пользователь, введите:

su -

а затем укажите пароль root.

Затем перейдите в локальный каталог (например: /usr/local/sbin) и создайте скрипт под названием "delete-file" и поместите в него следующие строки:

#!/bin/sh

[ $# -ne 1 ] && {
        echo "usage: $0 <filename>"
        exit 1
}

file='echo $1'

rm -f $file

[ $? -eq 0 ] && echo "File has been deleted from system!" || echo "Failed to delete the file!"

Затем сделайте этот файл исполняемым:

chmod 755 /usr/local/sbin/delete-file

Затем отредактируйте /etc/sudoers, чтобы добавить apache:

...
# Disable "ssh hostname sudo <cmd>", because it will show the password in clear.
#         You have to run "ssh -t hostname sudo <cmd>".
#
Defaults    requiretty
Defaults:apache     !requiretty ###ADD THIS LINE!

#
# Refuse to run if unable to disable echo on the tty. This setting should also be
# changed in order to be able to use sudo without a tty. See requiretty above.
#
...

В КОНЕЦ ЖИВОГО ФАЙЛА:

...
## Allows members of the users group to shutdown this system
# %users  localhost=/sbin/shutdown -h now

## Read drop-in files from /etc/sudoers.d (the # here does not mean a comment)
#includedir /etc/sudoers.d

### ADD THIS NEXT LINE:
apache  ALL=(ALL) NOPASSWD: /usr/local/sbin/delete-file

Измените свой PHP-скрипт таким образом:

<?php
...
$filename = "/var/www/main/user_resources/documents/NewFolder1/NewFolder1/file-to-delete.php";
shell_exec('sudo -S /usr/local/sbin/delete-file '.$filename);
...
?>

Теперь это должно быть в состоянии удалять файлы независимо от того, кто их владелец!

  • 0
    Я не показывал это, однако, apache также принадлежит phped. И, как я показал, разве обработка выполняется Майклом, а не Apache? [Michael@devserver NewFolder1]$ groups apache apache : apache www phped
  • 0
    Дело здесь не в том, кто владеет (или запускает) скрипт: /var/www/main/application/classes/library.php, а кто владеет файлом, который вы хотите отсоединить (т. Е. / Var / www / main / user_resources / documents / NewFolder1 / NewFolder1 / noname3.php) Просто сделайте это: ls -la / var / www / main / user_resources / documents / NewFolder1 / NewFolder1 /, чтобы увидеть разрешения для файла, который вы хотите отменить, и, возможно, опубликовать результаты здесь. ..
Показать ещё 6 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню