简体中文 · English
通过 tmux 管理 Linux CS2 / CS:GO 专用服务器,支持中英文界面、配置编辑和 Tab 补全。CS2 还支持 SteamCMD 更新、实时日志与更新后检查。两个控制程序均可独立运行。
安装到 /usr/local/bin/,按提示选择中文或 English:
curl -fsSL https://raw.githubusercontent.com/RATING3PRO/csctl/main/install.sh | bash直接指定语言,跳过选择:
# 中文
curl -fsSL https://raw.githubusercontent.com/RATING3PRO/csctl/main/install.sh | bash -s -- --lang zh
# English
curl -fsSL https://raw.githubusercontent.com/RATING3PRO/csctl/main/install.sh | bash -s -- --lang en已有完整仓库时,在项目目录执行:
bash install.sh # 交互选择
bash install.sh --lang en # 直接安装英文版安装器优先使用本地文件,无需联网;独立脚本或管道安装从 GitHub main 下载。非 root 用户安装到默认位置时自动使用 sudo。在线安装使用 curl 或 wget。
运行依赖:Linux、Bash 4+、tmux、util-linux(flock)、GNU coreutils;切换用户需要 sudo,CS2 更新另需可用的 SteamCMD。安装器不创建游戏用户、不安装 SteamCMD。
# Debian / Ubuntu 基础运行依赖
sudo apt install bash tmux sudo util-linux coreutils bash-completion| 内容 | 默认路径 |
|---|---|
控制程序,权限 0755 |
/usr/local/bin/cs2ctl、/usr/local/bin/csgoctl |
| Bash 补全 | /usr/local/share/bash-completion/completions/cs2ctl、csgoctl |
| Zsh 补全 | /usr/local/share/zsh/site-functions/_csctl |
配置,首次 -e 创建 |
/etc/cs2ctl.conf、/etc/csgoctl.conf |
重新安装可升级程序或更换默认语言,保留已有配置和服务器运行状态。全部文件下载完成、Bash 脚本通过语法检查后才开始安装。自定义位置使用 PREFIX="$HOME/.local" bash install.sh --lang en;打包可设置 DESTDIR。
所选语言写入安装副本,用于帮助、提示、错误、新配置模板和 Zsh 补全说明。已有配置注释、自定义脚本及 SteamCMD / tmux / 系统工具的原始输出不会被翻译。
有终端时从 /dev/tty 读取选择,支持 curl | bash;无终端时默认中文,自动化安装建议显式使用 --lang zh / --lang en。安装器语言优先级:--lang > CSCTL_LANGUAGE > 交互选择 / 中文默认值。
运行时临时覆盖:
CSCTL_LANGUAGE=en cs2ctl --help
sudo CSCTL_LANGUAGE=en cs2ctl -e
sudo CSCTL_LANGUAGE=zh csgoctl statussudo cs2ctl -e # 配置运行用户、目录和启动命令
sudo cs2ctl start
sudo cs2ctl status
sudo cs2ctl attach # Ctrl-b,然后 d:分离并保持运行
sudo cs2ctl stopCS:GO 将 cs2ctl 替换为 csgoctl。
| 命令 | 行为 |
|---|---|
start |
启动,已运行时不重复创建会话 |
stop |
使用 tmux kill-session 停服,已停止时成功返回 |
restart |
停止后重新启动 |
attach |
进入 tmux 控制台 |
status |
显示会话名、窗口数、连接数;运行时退出码 0,未运行时 3 |
chown |
递归修改 CHOWN_DIR 的用户和组为 RUN_USER:RUN_USER |
update,仅 CS2 |
停服 → 更新 → 检查 → 保持停止;加 --validate 完整校验游戏文件 |
check,仅 CS2 |
单独执行更新后检查,实时输出并保存日志 |
-e / --edit |
编辑配置,校验后保存 |
status 检查会话是否存在,不代表游戏已完成启动。stop 直接关闭会话,不执行游戏内的优雅退出流程。
-e 类似 crontab -e:首次生成模板,使用 $VISUAL、$EDITOR 或 vi 编辑,语法校验通过后原子保存。失败时保留原配置并给出编辑副本路径。新配置权限为 0600,已有配置保留权限和所有者。
sudo EDITOR=nano cs2ctl -e
sudo EDITOR='vim -f' csgoctl -e
# 普通用户使用自己的配置,将 RUN_USER 设为自己
cs2ctl -c "$HOME/.config/csctl/cs2.conf" -e
cs2ctl -c "$HOME/.config/csctl/cs2.conf" start所有命令支持 -c FILE、--config FILE、--config=FILE。修改会话、修改目录所有权、更新、检查和编辑需要配置目录可写,以创建互斥锁;默认 /etc 配置请统一通过 sudo 管理。
| 配置项 | 用途 |
|---|---|
RUN_USER |
tmux、SteamCMD 和检查脚本的用户,默认 csgo |
SESSION |
精确会话名:字母、数字、下划线、短横线,不能以短横线开头 |
WORKDIR |
游戏及检查脚本的工作目录,使用绝对路径 |
CHOWN_DIR |
chown 递归修改所有权的目录,使用绝对路径 |
CMD |
交给 Bash 执行的完整启动命令 |
STEAMCMD,仅 CS2 |
可执行文件名或绝对路径,例如 /usr/games/steamcmd,不附参数 |
STEAM_INSTALL_DIR,仅 CS2 |
安装根目录;留空时省略 force_install_dir |
UPDATE_LOG_DIR,仅 CS2 |
日志绝对目录;留空使用配置同级的 cs2ctl-logs/ |
POST_UPDATE_SCRIPT,仅 CS2 |
更新成功后执行的多行 POSIX sh 脚本 |
配置是调用者加载的 Bash 代码,只交给可信管理员编辑。双引号在加载配置时展开变量,单引号保留变量到游戏启动时展开。CMD 中可用 $PWD 引用工作目录,conf 普通变量不会自动传入游戏环境。切换用户使用 sudo -H -u 和 Bash 登录环境;已是运行用户时沿用当前环境。
通过 -e 设置 CHOWN_DIR。新配置模板使用以下默认路径;已有配置需手动补上该项:
# /etc/cs2ctl.conf
CHOWN_DIR='/home/csgo/Steam/steamapps/common/Counter-Strike Global Offensive'
# /etc/csgoctl.conf
CHOWN_DIR='/home/csgo/Steam/steamapps/common/Counter-Strike Global Offensive Beta - Dedicated Server'执行:
sudo cs2ctl chown
sudo csgoctl chown以 root 权限执行 chown -R --preserve-root -- "$RUN_USER:$RUN_USER" "$CHOWN_DIR";调用者不是 root 时通过 sudo 提权。用户和组均使用 RUN_USER,系统中必须存在该用户及同名组。命令会解析目录实际路径,拒绝空路径、不存在的目录和文件系统根目录;执行失败保留 chown 的退出码。该命令无需 tmux 或 SteamCMD,也不会启停服务器。
sudo cs2ctl update # 正常更新,自动停服;完成后保持停止
sudo cs2ctl update --validate # 需要完整校验游戏文件时使用
sudo cs2ctl check # 单独检查,或修复文件后重新检查
sudo cs2ctl start # 确认结果后手动启动默认以 RUN_USER 执行 login anonymous → app_update 730 → quit,并设置遇错退出和禁止密码提示。只有显式添加 --validate 时才执行 app_update 730 validate,用于完整校验游戏文件。正常更新不主动要求全量校验,但 SteamCMD 仍可能执行更新所需的检查。
STEAM_INSTALL_DIR 非空时,在登录前添加 force_install_dir。它应指向安装根目录,不是 game/bin/linuxsteamrt64,并与 WORKDIR 对应同一安装。
stdout/stderr 实时显示并保存到日志,默认位于 /etc/cs2ctl-logs/。SteamCMD 返回 0 且报告 App 730 安装成功或已是最新版本后才运行检查;检查失败返回非零。程序始终保持停服,成功时提示手动启动。停服后,即使更新准备步骤或日志创建失败,也不会自动恢复服务器。
默认检查是空操作。在 -e 中编辑 POST_UPDATE_SCRIPT,例如检查标准目录布局中的 Metamod 配置:
POST_UPDATE_SCRIPT=$(cat <<'CSCTL_POST_UPDATE'
# 根据 WORKDIR 和实际需要检查的内容调整
file="$WORKDIR/../../csgo/gameinfo.gi"
test -f "$file" || { echo "文件不存在: $file" >&2; exit 1; }
grep -Fq 'Game csgo/addons/metamod' "$file" || {
echo '检查失败:缺少 Metamod 配置' >&2
exit 1
}
echo '检查通过'
# 或调用外部脚本:sh /home/csgo/check-after-update.sh
CSCTL_POST_UPDATE
)检查通过 sh -eu 在 WORKDIR 中运行,提供 WORKDIR、SESSION、RUN_USER、STEAM_INSTALL_DIR 环境变量。应显式检查关键命令退出码;sh -e 不检测管道中间命令的失败。
Bash 启用 bash-completion 后通常会自动加载,也可立即加载:
source /usr/local/share/bash-completion/completions/cs2ctlZsh 在 ~/.zshrc 中配置:
fpath=(/usr/local/share/zsh/site-functions $fpath)
autoload -Uz compinit && compinit支持命令、选项和配置路径补全。自定义 PREFIX 时调整路径;sudo cs2ctl … 还依赖 shell 自身的 sudo 补全。
公共实现位于 src/common.bash,src/*.conf 为中英文模板。根目录两个程序为独立分发产物,运行时不依赖 Python 或源码目录。
python3 tools/build.py
python3 tools/build.py --check
bash tests/test.sh
bash tests/test-install.sh
bash tests/test-tmux.sh前两组测试使用模拟命令和临时目录;最后一组用独立 socket 验证真实 tmux,缺少依赖时明确跳过。它们不启动真实游戏或下载 App 730。