Я пытаюсь удалить /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)
Почему Майкл не может удалить файл?
От удаления этого файла блокируется не Майкл, а 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);
...
?>
Теперь это должно иметь возможность удалять файлы независимо от того, кто их владелец!
Учитывая информацию, которую вы показываете, вы сможете удалить файл. Если вы не можете, вы, вероятно, (определенно) не авторизовали пользователя Linux, который используется для PHP, а затем снова вошли в систему.