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

Я пытаюсь удалить /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

Решение

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

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

Теперь проблема в том, что пользователь Michael не будет иметь никаких прав 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 будут наследовать одинаковые разрешения. Однако это не очень рекомендуется, особенно если вы находитесь на сервере общего хостинга.

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

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

Другие решения

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

0

По вопросам рекламы [email protected]