【问题标题】:PHP: echo shell_exec("cat ".$filename." | head -1"); causes cat: write error: Broken pipe errorPHP: echo shell_exec("cat ".$filename." | head -1");导致 cat: write error: Broken pipe 错误
【发布时间】:2016-11-22 14:11:02
【问题描述】:
$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"); 

【问题讨论】:

  • 只是一个旁注,但你真的应该在文件名上使用escapeshellarg()。不仅可以防止 shell 代码注入攻击,还可以确保正常的文件名不会对您的代码造成严重破坏。
  • 除了@ChristianF所说的,应该考虑直接用PHP来获取文件的第一行。请注意,与大多数其他工具一样,head 能够自行读取文件,因此无论哪种方式都不需要管道。
  • @TomFenech 更改代码,因此没有管道,只需使用 head 读取文件即可解决问题,谢谢。如果您想发布答案,我可以接受。
  • 我建议阅读文件第一行的方法是在 PHP 中使用fopen,然后是fgets,然后是fclose,尽管这并不是您问题的直接答案。我很高兴你让它正常工作。

标签: php shell command-line-interface


【解决方案1】:

我无法确定您为什么会收到损坏的管道错误。我在我的系统上测试了代码,它工作得很好。

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

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

echo $data[0];

如果文件太大而无法一次包含在内存中,那么您可以使用fopen()fread() 一次读取一行。只需记住在函数周围添加检查,以处理可能发生的错误情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-24
    • 2021-09-19
    • 2021-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-02
    • 1970-01-01
    相关资源
    最近更新 更多