Я пытаюсь удалить /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)
Почему Майкл не может удалить файл?
Учитывая информацию, которую вы показываете, вы должны иметь возможность удалить файл. Если вы этого не сделаете, вы, вероятно, не зарегистрировали пользователя Linux, который использовался для PHP, а затем запустил его обратно.
Это не Майкл, который блокируется удалением этого файла, но 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);
...
?>
Теперь это должно быть в состоянии удалять файлы независимо от того, кто их владелец!
[Michael@devserver NewFolder1]$ groups apache apache : apache www phped