【问题标题】:shell_exec not returning the same result as sudoed command lineshell_exec 没有返回与 sudoed 命令行相同的结果
【发布时间】:2014-08-04 12:59:30
【问题描述】:

我正在开发一个 PHP-FPM 驱动的模块,在该模块中上传视频,然后在后台使用 ffmpeg 将它们转码为几种 HTML5 格式。这个 PHP-FPM 脚本在特定的非 root UID 下运行,称为 tv25。

有一种变体,我通过流媒体服务器 (Wowza) 录制网络摄像头流,它在根 UID 下运行,并通过 Java 编写的模块启动转换。

为了了解进程的状态,我向运行以下函数的脚本发出 GET 请求:

function is_conversion_running($base_file_name) {
  $command = "sudo ps aux | grep {$base_file_name} | grep -v grep | wc -l";
  $lignes  = shell_exec($command);
  return (bool) $lignes;
}

当我通过 AJAX 调用此函数时,它适用于 PHP-FPM 变体(UID 相同,在转换运行时返回 true),但不适用于 Wowza 变体(每次都返回 false)。

奇怪的是,如果我在 shell 中使用非 root UID 运行命令,它就像一个魅力,因为这个 UID 允许运行 ps 命令。

问题似乎与shell_exec returns empty string 中的问题相似,但那里列出的解决方案对我不起作用。

我的 /etc/sudoers 行是这样的:

tv25  ALL = (root)  NOPASSWD: /bin/ps

实在想不通是怎么回事……

【问题讨论】:

    标签: php linux shell


    【解决方案1】:

    命令返回什么:0 还是 NULL?在第二种情况下,该命令可能完全失败。您可以通过exec function 检查是否获得非零退出代码。在这种情况下,请确保在您的命令前加上 /bin/sh -c

    PS:你真的需要 sudo 来运行 ps 吗?通常,即使没有 sudo,您也会获得所有进程。

    【讨论】:

    • 命令返回 1。我必须 sudo ps 因为如果没有,以 root 启动的进程将不会出现。
    【解决方案2】:

    好吧,我找到了另一种解决问题的方法:因为我想知道进程是否仍在运行,所以我在 shell 脚本中委托了命令:

    #!/bin/bash
    
    BASE_NAME=`basename $0`
    LIGNES=$(/usr/bin/sudo /bin/ps aux | grep "$1" | grep -v grep | grep -v $BASE_NAME | wc -l)
    
    [ $LIGNES -eq "0" ] && exit 1
    exit 0
    

    然后我用 passthru 调用它。然后将其返回值参数转换为布尔值,取反,并由函数返回。

    ~

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-02
      • 1970-01-01
      • 2015-01-13
      • 1970-01-01
      • 2021-04-22
      相关资源
      最近更新 更多