删除web目录以外的文件的解决方案是什么?它不会删除文件。
将通过网络浏览器(仅限管理员)访问脚本。
例如:
PHP位于:/var/www/html/delete_xx_phones.php
-rwxr-xr-x 1 root root 592 Mar 13 17:18 delete_xx_phones.php
delete_xx_phones.php
代码看起来像这样:
foreach(glob("/path/004*-phone.cf") as $file) {
unlink($file);
}
/path
-rw-r--r-- 1 root root 346 Mar 13 17:15 004aaaa-phone.cf
-rw-r--r-- 1 root root 346 Mar 13 17:15 004bbaa-phone.cf
答案 0 :(得分:1)
PHP无法访问这些文件,因为它们属于root
用户。 PHP通常与Web服务器的用户ID一样运行,或者如果它在命令行上运行,则在调用php
的用户的上下文中运行。
理论上,您可以在PHP脚本中执行sudo
来强制删除这些文件,但这是非常糟糕的做法 - 您必须将root密码存储在PHP脚本中。
更好的方法是将文件的所有者更改为PHP运行的用户,或者chmod
,以便PHP可以删除它们(虽然这也不是很优雅,因为你可以使文件可访问机器上的每个用户。)
根据您的具体情况,每隔几分钟在cron
帐户下运行的root
脚本会更改这些文件的所有者,这可能是一个可行的解决方案:
chown apache:apache /path/004*-phone.cf
(用您的PHP用户和/或组替换apache:apache
)
当然,如果您可以影响这些文件的创建方式,那么将它们作为正确用户的属性将是理想的。
答案 1 :(得分:1)
PHP脚本通常以root用户身份运行,因为它们通常由httpd执行。由于您的文件设置为仅对root用户具有写入权限,因此无法解决问题。
如果您无法永久更改文件的所有权或写入权限,则可以考虑编写一个非常短的脚本并使用提升的权限(使用sudo
或suid位)执行它而不是调用{{1}在PHP上。
对于suid方法,在Perl中编写一个简单的脚本(可能需要安装perl-suidperl包),删除作为参数传递的文件名:
<强> delete-file.pl:强>
unlink()
确保该文件归root(#!/usr/bin/perl -wT
# This is VERY insecure, so if you use it, make sure you modify it
# to filter the filenames before putting the script on production
# machines
unlink $ARGV[ 0 ];
)所有,然后运行chown root delete-file.pl
以设置其SUID位。之后,文件将始终以root身份执行。
然后在PHP脚本中,您只需运行chmod 6711 delete-file.pl
(考虑exec( "/path/delete-file.pl $filename" )
以确保安全),您的文件应该开始删除。
(注意我在这里专门使用Perl,因为Bash传统上忽略了suid位。)
如果您对使用shellescapearg()
感觉更舒服,那么只需编写类似于上述内容的脚本(Bash也可以使用),然后将其添加到sudo
。然后,您可以执行以下操作:/etc/sudoers
以使用提升的权限运行脚本。