php - 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 卡中轻松验证。
将文件传输到其他设备后,应执行下一个命令。此命令应该启动一个应该开始使用该文件的工具。因为我只是使用一个虚拟文件,它应该返回并出错。
但是,当我执行此代码时,会返回一个空字符串,因为它只打印“No return from update command”
但是,如果我在与 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”。这会将错误输出重定向到标准输出。现在,当调用该函数时,我得到一个输出而不是一个空字符串。
推荐阅读
- angular - 防止拖动子元素
- android - 无法从 firebase 实时数据库中获取任何值
- spring-data - 配置 Spring Data Redis 以通过 Elasticache 配置端点执行所有操作?
- javascript - 如何在 React 中使用 onClick 运行函数
- search - 带安全修剪的跨场搜索不起作用
- python - 我想描述一条战舰用pygame发射子弹时的抛物线
- python - 如何最好地将 pandas str.find 应用于另一列
- angular - 当父组件是mat组件(Angular Material)时如何在组件之间传递数据?
- javascript - 如何使用 expo-image-picker 将文件从 iOS 上传到 Cloudinary?
- python - 如何访问 conda environment.yml 中的预定义环境变量?