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内缺失对应节点也会导致执行失败。
学习测试用临时修复步骤(禁止用于生产环境)
- 补全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
- 放开PHP的pledge exec权限:
编辑对应版本的php-fpm配置文件,比如PHP8.0路径为/etc/php-8.0-fpm.d/www.conf,找到php_admin_value[pledge]配置项,在现有参数后追加exec proc_exec,保存文件。 - 重启php-fpm服务生效:
rcctl restart php80_fpm
修改完成后再次执行你的PHP测试脚本,即可正常拿到foo程序的输出和返回码42。
内容的提问来源于stack exchange,提问作者user10008009
相关产品推荐
相关产品推荐

