You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OpenBSD chroot环境下PHP exec执行静态链接二进制返回127问题求助

问题根因与解决方案

直接原因

你遇到的返回码127本质是命令执行依赖的shell不存在:PHP的exec()函数默认会调用/bin/sh解析执行传入的命令,而OpenBSD默认httpd的chroot根目录(路径为/var/www)下没有内置/bin/sh程序,shell本身找不到就会返回127错误,和你编译的静态程序本身无关。

其他影响因素

  • OpenBSD为官方打包的PHP默认配置了pledge沙箱规则,默认规则没有放开exec权限,即使补上shell,执行外部程序也会被拦截。
  • 部分静态编译的程序仍依赖chroot内的基础设备节点,比如/dev/null,如果chroot内缺失对应节点也会导致执行失败。

学习测试用临时修复步骤(禁止用于生产环境)

  1. 补全chroot内的shell和基础设备:
# 创建chroot内的bin目录
mkdir -p /var/www/bin
# 拷贝系统静态编译的sh到chroot目录
cp /bin/sh /var/www/bin/sh
chmod 555 /var/www/bin/sh
# 补全必要设备节点
mkdir -p /var/www/dev
cd /var/www/dev
./MAKEDEV std
  1. 放开PHP的pledge exec权限:
    编辑对应版本的php-fpm配置文件,比如PHP8.0路径为/etc/php-8.0-fpm.d/www.conf,找到php_admin_value[pledge]配置项,在现有参数后追加exec proc_exec,保存文件。
  2. 重启php-fpm服务生效:
rcctl restart php80_fpm

修改完成后再次执行你的PHP测试脚本,即可正常拿到foo程序的输出和返回码42。

内容的提问来源于stack exchange,提问作者user10008009

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 22:24:04