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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 13:35:26