如何删除web目录外的文件?它不会删除文件。
脚本将通过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
PHP脚本通常以非root用户身份运行,因为它们通常由httpd执行。因为你的文件被设置为只有root用户才有写权限,所以这是行不通的。
如果您不能永久地更改文件的所有权或写入权限,您可以考虑编写一个非常短的脚本,并使用更高的权限(使用sudo
或suid位)执行它,而不是在PHP上调用unlink()
。
对于suid方法,用Perl编写一个简单的脚本(可能需要安装Perl -suidperl包),它删除作为参数传递的文件名:
delete-file.pl:
#!/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 ];
确保该文件为root (chown root delete-file.pl
)所有,然后运行chmod 6711 delete-file.pl
来设置其SUID位。在此之后,文件将始终以root身份执行。
然后在你的PHP脚本中,你只需要运行exec( "/path/delete-file.pl $filename" )
(考虑shellescapearg()
安全),你的文件应该开始删除。
(注意,这里我专门使用Perl,因为Bash通常会忽略suid位。)
如果您觉得使用sudo
更舒服,那么只需编写一个类似于上面描述的脚本(Bash也可以工作)并将其添加到/etc/sudoers
。然后,您可以执行以下操作:exec( "/usr/bin/sudo /path/to/delete-file-script $filename" );
以提升的权限运行脚本。
PHP无法访问这些文件,因为它们属于root
用户。PHP通常使用web服务器的用户ID运行,或者如果在命令行上运行,则在调用php
的用户的上下文中运行。
理论上,您可以在PHP脚本中执行sudo
来强制删除这些文件,但这是非常糟糕的做法-您必须将根密码存储在PHP脚本中。
更好的方法是将文件的所有者更改为PHP运行的用户,或者将它们设置为chmod
,以便PHP可以删除它们(尽管这也不是很优雅,因为您将使机器上的每个用户都可以访问该文件)。
根据您的情况,每隔几分钟在root
帐户下运行一个cron
脚本并更改这些文件的所有者可能是一个可行的解决方案:
chown apache:apache /path/004*-phone.cf
(将apache:apache
替换为您的PHP用户和/或组)
当然,如果您可以影响这些文件的创建方式,那么直接使它们成为正确用户的属性将是理想的。