php 中的 lsof shell 命令被拒绝

lsof shell command in php denied

我有以下代码:

        $cmd="lsof | awk '{print  \" \"  \" \"  \" \" }'";
        $info = shell_exec($cmd);        
        $processors = preg_split('/\s?\n\s?\n/', trim($info));
        $processors = explode("\n",$processors[0]);
        foreach($processors as $processor){
           echo $processor."\n";
        }

当我在命令行上 运行 它时,我得到了积极的结果。然而,当我 运行 它在 php 脚本上时,我得到:

systemd 1 root denied) 每个 $processor

如果您查看 lsof 的完整输出,您会看到大多数行如下所示:

COMMAND     PID   TID TASKCMD            USER   FD      TYPE             DEVICE  SIZE/OFF       NODE NAME
systemd       1                          root  cwd   unknown                                         /proc/1/cwd (readlink: Permission denied)

因为您是 运行 的用户无权查看不属于自己的进程。

尝试:sudo lsof

当我尝试发布您的代码时,我也遇到了同样的错误(能够重现错误)。

然后我尝试只用 lsof 代替完整的 lsof 命令和 awk 以查看完整的错误是什么,我得到了以下错误。

COMMAND PID    USER   FD      TYPE DEVICE SIZE/OFF       NODE NAME
sh        1    root  cwd   unknown                            /proc/1/cwd (readlink: Permission denied)
sh        1    root  rtd   unknown                            /proc/1/root (readlink: Permission denied)
sh        1    root  txt   unknown                            /proc/1/exe (readlink: Permission denied)
sh        1    root NOFD                                      /proc/1/fd (opendir: Permission denied)
time      9    root  cwd   unknown                            /proc/9/cwd (readlink: Permission denied)
time      9    root  rtd   unknown                            /proc/9/root (readlink: Permission denied)

之后我用谷歌搜索并找到了一个很棒的 link https://unix.stackexchange.com/a/109228(跨站点引用),它告诉我们 lsof 提供错误,因为我们无法访问那些 files/commands 显然我们不是 运行ning 命令与 root.

所以恕我直言,要克服这个问题,您可以:

  • 运行 lsof 命令作为 sudo 以消除错误,以防您的用户具有对 运行 此命令的 sudo 访问权限。
  • 如果您对根进程的详细信息不感兴趣,那么您可以将这些错误发送至 /dev/null