在有人标记此副本之前,请了解我搜索了此网站,Google搜索和PHP.net。
我想要的是超级简单。我想要一个带有日期戳(最后修改)的网站上所有文件的列表。我发现有几个声称可以执行此操作的脚本,但它们都没有工作。
到目前为止,我发现的最好的是这一个:
header("Pragma: public");
header("Cache-Control: private");
header("Content-Type: text/csv");
header("Content-Disposition: attachment; filename=age-of-files.csv");
$result = array();
$handle = opendir(".");
while ($datei = readdir($handle))
{
if (($datei != '.') && ($datei != '..'))
{
$file = "./".$datei;
if (!is_dir($file))
$result[] = $file;
}
}
closedir($handle);
foreach($result as $r)
if (file_exists($r))
echo substr($r,2).",".date ("m-d-Y", filemtime($r))."\r\n";
这适用于运行脚本的dircetory,但它不是递归的。我需要它继续为每个子目录。我的目标是有一个可排序的列表,以便我可以找到在某些日期或周围修改过的文件。
我是PHP的新手,所以请耐心等待。我在PHP.net做了一些研究(我一直看到人们提到SPL,我不确定它代表什么或它是什么,但也许它是一组标准的PHP类?),看起来我需要以某种方式使用RecursiveDirectoryIterator。
我发现这个脚本在纸上看起来很棒,但在我的网站上运行会给出一个空白的白色屏幕。
try
{
/*** freds home directory ***/
$rdi = new recursiveDirectoryIterator('/', FilesystemIterator::SKIP_DOTS | FilesystemIterator::UNIX_PATHS);
$it = new recursiveIteratorIterator( $rdi );
while( $it->valid())
{
if( !$it->isDir() )
{
echo $it->current().' '.date('Y m d H:i:s', $it->getATime() )."\n";
}
/*** move to the next element ***/
$it->next();
}
}
catch(Exception $e)
{
/*** echo the error message ***/
echo $e->getMessage();
}
我更喜欢使用第一个脚本,因为它创建了一个csv文件(易于排序),但我不确定如何协调这两个。有人可以告诉我如何将RDI纳入第一个脚本吗?
答案 0 :(得分:1)
这是我发现效果很好的一些代码
$rdi = new RecursiveDirectoryIterator("path/"); // The directory here
$rii = new RecursiveIteratorIterator($rdi);
foreach ($rii as $filename=>$cur) {
echo $cur.' '.date('Y m d H:i:s', $cur->getATime() )."<br/>";
}
答案 1 :(得分:1)
尝试类似这样的内容,类似于您提供的第二个示例:
<?php
$path = __DIR__;
if (!is_dir($path)) {
throw new RuntimeException(sprintf('Path %s does not exist!', $path));
}
if (!is_readable($path)) {
throw new RuntimeException(sprintf('Path %s is not readable!', $path));
}
$iterator = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($path)
);
$files = [];
foreach ($iterator as $fileInfo) {
if ($fileInfo->isFile()) {
$files[] = [
$fileInfo->getFilename(),
dirname($fileInfo->getPathname()),
date('c', $fileInfo->getMTime())
];
}
}
print_r($files);
给出一个示例文件结构:
这会产生:
Array
(
[0] => Array
(
[0] => .DS_Store
[1] => /private/tmp/rec
[2] => 2015-08-08T08:28:33+00:00
)
[1] => Array
(
[0] => .DS_Store
[1] => /private/tmp/rec/0
[2] => 2015-08-08T08:28:33+00:00
)
[2] => Array
(
[0] => 0.1.txt
[1] => /private/tmp/rec/0/0.1
[2] => 2015-08-08T08:27:58+00:00
)
[3] => Array
(
[0] => 0.txt
[1] => /private/tmp/rec/0
[2] => 2015-08-08T08:27:58+00:00
)
[4] => Array
(
[0] => .DS_Store
[1] => /private/tmp/rec/1
[2] => 2015-08-08T08:28:33+00:00
)
[5] => Array
(
[0] => .DS_Store
[1] => /private/tmp/rec/1/1.1
[2] => 2015-08-08T08:28:27+00:00
)
[6] => Array
(
[0] => 1.1.txt
[1] => /private/tmp/rec/1/1.1
[2] => 2015-08-08T08:27:58+00:00
)
[7] => Array
(
[0] => 1.txt
[1] => /private/tmp/rec/1
[2] => 2015-08-08T08:27:58+00:00
)
[8] => Array
(
[0] => rec.php
[1] => /private/tmp/rec
[2] => 2015-08-08T08:48:30+00:00
)
)
每个匹配都存储为包含以下内容的子数组元素:
它进行了一些额外的检查,以确保可以读取提供的$path
。
您现在在数组中有$files
的结果集,您应该能够重用第一个示例中的某些代码作为.csv文件输出。
希望这会有所帮助:)
答案 2 :(得分:1)
如果有人好奇,这就是我最终的结果。它将第一个答案的简单性和有效性与我问题中第一个例子的csv结合起来。当我在excel中打开csv文件时,我可以轻松地按日排序。
我需要这个的原因是为了帮助追踪我的某个网站上的一些恶意软件。通过列出所有文件,我可以按日期排序并查找在可疑日期添加的文件。或者相反,如果我在某一天发现了已知威胁,我可以很容易地看到当天/时间修改了哪些其他文件。它帮助我极大地消除了我的网站持续感染。它不断恢复生机,因为我无法删除所有文件。使用这个简单的脚本,我终于找到了已经安装的后门shell。呼!
非常感谢两位回答者! :)
<?php
header("Pragma: public");
header("Cache-Control: private");
header("Content-Type: text/csv");
header("Content-Disposition: attachment; filename=age-of-files.csv");
$rdi = new RecursiveDirectoryIterator("."); // The directory here
$rii = new RecursiveIteratorIterator($rdi);
foreach ($rii as $filename=>$cur) {
echo $cur.', '.date('m-d-Y', $cur->getATime() ).', '.date('H:i:s', $cur->getATime() )."\r\n";
}
?>