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

问题描述

我目前从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);

因此,第一个命令按预期工作,仅在成功时不返回任何内容。现在可以通过将文件保存在sd卡中来轻松地对此进行验证。

将文件传输到另一台设备后,应执行下一条命令。 此命令应启动一个应开始使用该文件的工具。由于我只是在使用虚拟文件,因此它应该返回并出错。

但是,当我执行此代码时,将返回一个空字符串,因为它只显示“更新命令不返回”

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

命令是否正在执行但只是不返回任何东西,或者如果命令根本不执行,我不太确定。

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

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

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

这是一个愚蠢的明显错误吗?

我最近对其进行了更改,因此它不会打印“更新命令不返回”,而是打印刚刚执行的命令。 当我复制该命令并执行完全相同的情况时,得到输出。 为什么它只能手动工作?

解决方法

好,花了一段时间,但我弄清楚了实际的问题。

因此,shell_exec()和exec()仅从sdtout读取,而不会从sdterr读取。 普通的shell控制台会将错误转换为标准输出,而php中的函数则不会。

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

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...