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

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权限:

  1. 执行sudo visudo编辑sudoers文件
  2. 添加以下内容(允许www-data以fx2用户身份无需密码执行screen命令):
    www-data ALL=(fx2) NOPASSWD: /usr/bin/screen
    
  3. 保存退出(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.sh
  • fx2目录对其他用户有访问权限:chmod o+x /home/fx2

6. 安全提醒

  • 限制访问:一定要给这个控制页面加登录验证,或者只允许特定IP访问,防止被恶意调用重启服务器。
  • 避免命令注入:如果以后需要动态传入参数(比如会话名),一定要做严格的过滤,比如用escapeshellarg()处理参数。
  • 最小权限原则:sudo配置里只给必要的权限,不要让www-data能执行所有命令。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:49:35