90 lines
3.0 KiB
Bash
90 lines
3.0 KiB
Bash
#!/bin/bash
|
||
|
||
# 1. 检查是否以 root 权限运行
|
||
if [ "$EUID" -ne 0 ]; then
|
||
echo "❌ 错误: 请使用 root 权限 (sudo) 运行此脚本。"
|
||
exit 1
|
||
fi
|
||
|
||
# 2. 检查必备命令
|
||
if ! command -v vncpasswd &> /dev/null || ! command -v vncserver &> /dev/null; then
|
||
echo "❌ 错误: 系统中未找到 VNC 相关命令。请先安装 VNC Server。"
|
||
exit 1
|
||
fi
|
||
|
||
# ==========================================
|
||
# 3. 核心配置区 (请根据实际需求修改这里)
|
||
# ==========================================
|
||
TARGET_USER="workuser" # 目标用户名
|
||
TARGET_PASS="WorkPass2026" # 用户的 VNC 密码 (登录系统和VNC相同)
|
||
INSTANCE_COUNT=3 # 需要开启的 VNC 桌面数量
|
||
START_DISPLAY=1 # 起始显示编号 (1 对应 5901 端口)
|
||
# ==========================================
|
||
|
||
echo "🚀 开始为用户 $TARGET_USER 部署 $INSTANCE_COUNT 个 VNC 桌面..."
|
||
echo "========================================"
|
||
|
||
# 4. 步骤 A: 创建或校验系统用户
|
||
if id "$TARGET_USER" &>/dev/null; then
|
||
echo " -> ℹ️ 系统用户 $TARGET_USER 已存在,直接配置 VNC。"
|
||
else
|
||
useradd -m "$TARGET_USER" -s /bin/bash
|
||
echo "$TARGET_USER:$TARGET_PASS" | chpasswd
|
||
echo " -> ✅ 系统用户 $TARGET_USER 创建成功。"
|
||
fi
|
||
|
||
# 5. 步骤 B: 配置统一的 VNC 密码
|
||
VNC_DIR="/home/$TARGET_USER/.vnc"
|
||
mkdir -p "$VNC_DIR"
|
||
|
||
echo "$TARGET_PASS" | vncpasswd -f > "$VNC_DIR/passwd"
|
||
chmod 600 "$VNC_DIR/passwd"
|
||
chown -R "$TARGET_USER:$TARGET_USER" "$VNC_DIR"
|
||
echo " -> ✅ VNC 密码配置完成。"
|
||
echo "----------------------------------------"
|
||
|
||
# 6. 步骤 C: 循环生成并启动多个 systemd 服务
|
||
END_DISPLAY=$((START_DISPLAY + INSTANCE_COUNT - 1))
|
||
|
||
for (( i=START_DISPLAY; i<=END_DISPLAY; i++ )); do
|
||
CURRENT_PORT=$((5900 + i))
|
||
# 动态命名服务文件,例如: vnc-workuser-1.service
|
||
SERVICE_NAME="vnc-${TARGET_USER}-${i}.service"
|
||
SERVICE_FILE="/etc/systemd/system/$SERVICE_NAME"
|
||
|
||
echo " -> ⚙️ 正在配置 VNC 桌面 :$i (端口: $CURRENT_PORT)..."
|
||
|
||
# 写入专属的 systemd 服务配置
|
||
cat <<EOF > "$SERVICE_FILE"
|
||
[Unit]
|
||
Description=Remote desktop service (VNC)
|
||
After=syslog.target network.target
|
||
|
||
[Service]
|
||
Type=forking
|
||
|
||
# Clean any existing files in /tmp/.X11-unix environment
|
||
ExecStartPre=/bin/sh -c '/usr/bin/vncserver -kill %i > /dev/null 2>&1 || :'
|
||
ExecStart=/usr/sbin/runuser -l $TARGET_USER -c "/usr/bin/vncserver %i"
|
||
PIDFile=/home/$TARGET_USER/.vnc/%H%i.pid
|
||
ExecStop=/bin/sh -c '/usr/bin/vncserver -kill %i > /dev/null 2>&1 || :'
|
||
|
||
[Install]
|
||
WantedBy=multi-user.target
|
||
|
||
EOF
|
||
|
||
# 重新加载 systemd 守护进程
|
||
systemctl daemon-reload
|
||
|
||
# 设置开机自启并立即启动
|
||
if systemctl enable --now "$SERVICE_NAME" &>/dev/null; then
|
||
echo " -> 🎯 桌面 :$i 启动成功!请使用 <服务器IP>:$CURRENT_PORT 连接。"
|
||
else
|
||
echo " -> ❌ 服务启动失败,请检查 systemctl status $SERVICE_NAME"
|
||
fi
|
||
|
||
done
|
||
|
||
echo "========================================"
|
||
echo "🎉 为用户 $TARGET_USER 批量分配 $INSTANCE_COUNT 个 VNC 桌面的操作已全部完成!" |