2016-11-22 204 views
0
$php index2.php testphp 

$filename = $argv[1]; 

echo shell_exec("cat ".$filename." | head -1"); 

导致以下错误:

cat: write error: Broken pipe error 

我不知道为什么我收到这个错误。更改为以下仍然给我的错误:

echo shell_exec("cat testphp | head -1"); 
+2

只是一个侧面说明,但你_really_应该在文件名上使用'escapeshellarg()'。不仅要防止shell代码注入攻击,还要确保正常的文件名不会对代码造成严重破坏。 – ChristianF

+1

除了@ChristianF所说的,你应该考虑直接使用PHP来获取文件的第一行。请注意,像大多数其他工具一样,'head'能够自己读取文件,因此无论采用哪种方式都不需要使用管道。 –

+0

@TomFenech改变代码,所以没有管道,只是用头来读取文件修复了这个问题,谢谢。如果你想发布一个答案,我可以接受它。 – NeverPhased

回答

1

为什么你所得到的水管坏了错误我不能肯定地说。我测试了我的系统上的代码,它工作得很好。

但是,在这种情况下更好的解决方案可能只是使用PHP而不是通过第三方程序。获取文件的第一行是琐碎file()和一些简单的数组操作:

$data = file ($filename); 
if (is_array ($data)) { 
    echo "Error reading file!"; 
    return 1; 
} 

echo $data[0]; 

如果文件过大在内存中包含一次,那么你可以使用fopen()fread()在读取一行时间。请记住添加功能检查,以处理可能发生的错误情况。