0

删除 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
4

2 回答 2

1

PHP 无法访问这些文件,因为它们属于root用户。PHP 通常以 Web 服务器的用户 ID 运行,或者如果它在命令行上运行,则在调用php.

从理论上讲,您可以sudo在 PHP 脚本中执行强制删除这些文件的操作,但这是非常糟糕的做法 - 为此您必须将 root 密码存储在 PHP 脚本中。

一个更好的方法是将文件的所有者更改为 PHP 运行的用户,或者chmoding 它们以便 PHP 可以删除它们(尽管这也不是很优雅,因为您可以让机器上的每个用户都可以访问该文件)。

根据您的情况,每隔几分钟cron在帐户下运行并更改这些文件所有者的脚本可能是一个可行的解决方案:root

chown apache:apache /path/004*-phone.cf 

(替换apache:apache为您的 PHP 用户和/或组)

当然,如果您可以影响这些文件的创建方式,那么让它们立即成为正确用户的财产将是理想的选择。

于 2013-03-13T17:51:14.727 回答
1

PHP 脚本通常以非 root 用户身份运行,因为它们通常由 httpd 执行。由于您的文件设置为仅对 root 用户具有写入权限,因此这是行不通的。

如果您无法永久更改文件的所有权或写入权限,您可以考虑编写一个非常短的脚本并使用提升sudo的权限(使用或 suid 位)执行它,而不是调用unlink()PHP。

对于 suid 方法,在 Perl 中编写一个简单的脚本(可能需要安装 perl-suidperl 包),删除作为参数传递的文件名:

删除文件.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使用/etc/sudoers. 然后,您可以执行以下操作:exec( "/usr/bin/sudo /path/to/delete-file-script $filename" );以提升的权限运行脚本。

于 2013-03-13T18:19:57.730 回答