PHP网页按钮控制screen停止程序并执行bash重启游戏服务器可行吗?
没问题,这个需求完全可以实现!不过得先解决几个权限和执行逻辑的关键点,我给你详细拆解下怎么做:
实现方案详解
首先得明确:直接在PHP里模拟Ctrl+D操作其实可以通过screen的命令行工具实现,不用真的模拟按键。另外核心问题是PHP运行用户(通常是www-data)和screen会话所属用户(比如你的fx2用户)的权限匹配,这是能不能成功的关键。
1. 先确认你的screen会话信息
先通过SSH登录服务器,执行screen -list查看你的游戏服务器所在的screen会话名称(比如输出可能是1234.fx2-server,这里的fx2-server就是会话名),后面的命令都要用到这个名称。
2. 停止screen中的程序
你说的Ctrl+D本质是给当前shell发送EOF信号,让shell退出从而终止程序。我们可以用screen的stuff命令模拟输入这个信号:
screen -S 你的会话名 -p 0 -X stuff "^D"
-S指定会话名-p 0指定第一个窗口(大部分情况游戏服务器都在第一个窗口)-X stuff表示往会话里输入内容,^D是Ctrl+D的转义写法
如果这个方法没生效,也可以直接关闭整个screen会话:
screen -S 你的会话名 -X quit
3. 启动新的游戏服务器
停止程序后,用screen在后台启动新的会话并运行你的脚本:
screen -dmS 你的会话名 bash /home/fx2/run.sh +exec server.cfg
-d表示后台启动会话-m强制创建新会话
4. PHP页面与脚本实现
前端按钮(比如index.php)
<!DOCTYPE html> <html> <body> <h3>游戏服务器控制</h3> <form method="post" action="control_server.php"> <button type="submit" name="restart_server">重启服务器</button> </form> </body> </html>
后端处理脚本(control_server.php)
<?php // 仅允许POST请求 if ($_SERVER['REQUEST_METHOD'] !== 'POST' || !isset($_POST['restart_server'])) { header("Location: index.php"); exit; } // 替换成你的screen会话名 $screenSession = 'fx2-server'; // 1. 停止当前程序 $stopCmd = "screen -S $screenSession -p 0 -X stuff \"^D\""; exec($stopCmd, $stopOutput, $stopStatus); // 等待几秒确保程序完全关闭(根据你的服务器关闭速度调整,比如3-5秒) sleep(3); // 2. 启动新的服务器会话 $startCmd = "screen -dmS $screenSession bash /home/fx2/run.sh +exec server.cfg"; exec($startCmd, $startOutput, $startStatus); // 给用户反馈 if ($stopStatus === 0 && $startStatus === 0) { echo "<p>✅ 服务器重启成功!</p>"; } else { echo "<p>❌ 重启失败:</p>"; echo "<ul>"; echo "<li>停止命令执行状态:$stopStatus</li>"; echo "<li>启动命令执行状态:$startStatus</li>"; echo "</ul>"; } ?>
5. 关键权限配置(必做!)
默认情况下,www-data用户(PHP运行用户)无法访问fx2用户创建的screen会话,所以需要配置sudo权限:
- 执行
sudo visudo编辑sudoers文件 - 添加以下内容(允许www-data以fx2用户身份无需密码执行screen命令):
www-data ALL=(fx2) NOPASSWD: /usr/bin/screen - 保存退出(visudo里按Ctrl+O保存,Ctrl+X退出)
然后修改PHP里的命令,加上sudo -u fx2,比如:
$stopCmd = "sudo -u fx2 screen -S $screenSession -p 0 -X stuff \"^D\""; $startCmd = "sudo -u fx2 screen -dmS $screenSession bash /home/fx2/run.sh +exec server.cfg";
另外还要确保:
run.sh有可执行权限:chmod +x /home/fx2/run.shfx2目录对其他用户有访问权限:chmod o+x /home/fx2
6. 安全提醒
- 限制访问:一定要给这个控制页面加登录验证,或者只允许特定IP访问,防止被恶意调用重启服务器。
- 避免命令注入:如果以后需要动态传入参数(比如会话名),一定要做严格的过滤,比如用
escapeshellarg()处理参数。 - 最小权限原则:sudo配置里只给必要的权限,不要让www-data能执行所有命令。
内容的提问来源于stack exchange,提问作者FAXES
相关产品推荐
相关产品推荐

