PHP调用exec执行tmux无法读取会话文件的求助
PHP调用tmux无法访问www-data用户会话的问题
我需要搭建一个PHP站点来管理www-data用户下的多个tmux会话,但通过PHP的exec()调用tmux时遇到问题:
我的PHP代码
$command = "tmux -S /tmp/tmux-33/default ls"; echo $command."<br>"; exec($command . " 2>&1", $output, $result_code); $output = JSON_Format($output); echo "$output<br>";
执行结果
tmux -S /tmp/tmux-33/default ls [ "no server running on \/tmp\/tmux-33\/default" ]
矛盾点
- 直接在终端执行
sudo tmux -S /tmp/tmux-33/default ls能正常返回会话列表:0: 1 windows (created Sat Mar 9 18:09:34 2024) 2: 1 windows (created Sat Mar 9 18:16:42 2024) (attached) - 切换到www-data的交互式shell执行
tmux list-s也能正常查看会话 - 尝试通过bash脚本调用tmux,结果同样报错
- 无法降级PHP(当前用PHP8.3.3-1,依赖PHP8新特性)
- 已排除Apache默认用/bin/dash的影响
解决方案
1. 使用tmux的完整路径
PHP的exec环境PATH可能不包含tmux的路径,先通过终端which tmux找到完整路径(比如/usr/bin/tmux),修改PHP命令:
$command = "/usr/bin/tmux -S /tmp/tmux-33/default ls";
2. 模拟终端环境执行
tmux在无tty的非交互式环境下可能无法正常工作,用script命令模拟终端上下文:
$command = "script -q -c '/usr/bin/tmux -S /tmp/tmux-33/default ls' /dev/null"; exec($command . " 2>&1", $output, $result_code);
-q参数用来静默输出,/dev/null用来丢弃script的日志输出。
3. 确认PHP进程的运行用户
确保PHP确实以www-data身份运行:
- 如果用php-fpm,检查pool配置(如
/etc/php/8.3/fpm/pool.d/www.conf)中的user和group是否为www-data - 在PHP中执行以下代码验证当前用户:
exec('whoami', $user); var_dump($user);
4. 检查tmux socket的权限与安全上下文
查看socket文件的权限:
ls -l /tmp/tmux-33/default
确保权限为srw-rw----,属主和属组均为www-data。
若开启了SELinux,可能需要调整socket的安全上下文:
chcon -t httpd_tmp_t /tmp/tmux-33/default
也可临时执行setenforce 0关闭SELinux测试,确认是否为SELinux导致的问题。
5. 显式设置必要的环境变量
PHP的exec不会加载交互式shell的环境变量,可在命令前指定HOME等必要变量:
$command = "export HOME=/var/www && /usr/bin/tmux -S /tmp/tmux-33/default ls";
内容的提问来源于stack exchange,提问作者Codrut
相关产品推荐
相关产品推荐

