PHP shell_exec 返回一个空字符串,而手动执行相同的命令不会

PHP shell_exec returning an empty string, while executing the same command manually does not

我目前有一些来自 shell_exec 的奇怪行为,我不太明白。

这是我的代码:

        $cmd = ('sshpass -p PASSWORD scp -o StrictHostKeyChecking=no ../../UpdateFiles/' . $FILENAME . ' root@' . $IP . '://media/sdcard');
        $output = shell_exec($cmd);
        if (empty($output)){
            $cmd = ('sshpass -p PASSWORD ssh -o StrictHostKeyChecking=no root@' . $IP . ' /sbin/start_sw_upgrade_process sdcard /media/sdcard ' . $FILENAME);
            $output = shell_exec($cmd);
            if (empty($output)){ $output = "No return from update command"; }
        }
        printf("%s",$output);

因此,第一个命令按预期工作,return仅在成功时才执行任何操作。通过文件现在位于 SD 卡中,可以很容易地验证这一点。

文件传输到其他设备后,应执行下一个命令。 此命令应启动应开始使用该文件的工具。因为我只是使用一个虚拟文件,它应该 return 和错误。

然而,当我执行这段代码时,一个空字符串被 returned,因为它只是打印“No return from update command”

但是,如果我在与 php 文件相同的目录中手动执行命令(手动填写变量 ofc),则会出现 returned 错误。

命令是否正在执行但没有return执行任何操作,或者命令根本没有执行,我不太确定。

但我在其他地方也使用类似的命令,例如:

        $cmd = ('sshpass -p PASSWORD ssh -o StrictHostKeyChecking=no root@' . $IP . ' df | grep sdcard');
        $output = shell_exec($cmd);

在这种情况下,它会按预期工作。所以我不太明白为什么在这种情况下没有。

这是明显的愚蠢错误吗?

我最近更改了它,而不是打印“no return from update command”,而是打印刚刚执行的命令。 当我复制该命令并在完全相同的情况下执行它时,我得到了一个输出。 为什么它只能手动工作?

好的,所以花了一段时间,但我弄清楚了实际问题是什么。

所以 shell_exec() 和 exec() 只从 sdtout 读取,它们不从 sdterr 读取。 虽然普通 shell 控制台会将错误转换为标准输出,但 php 中的函数不会。

因此函数的输出实际上是空的,因为唯一的输出是错误。 为了解决这个问题,我在命令末尾附加了参数“1>&2”。 这会将错误输出重定向到标准输出。现在当函数被调用时,我得到一个输出而不是一个空字符串。