diff --git a/vnc/multi_vnc_single_user.sh b/vnc/multi_vnc_single_user.sh new file mode 100644 index 0000000..b20cfbc --- /dev/null +++ b/vnc/multi_vnc_single_user.sh @@ -0,0 +1,89 @@ +#!/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 < "$SERVICE_FILE" +[Unit] +Description=VNC Server for $TARGET_USER on display $i +After=syslog.target network.target + +[Service] +Type=forking +User=$TARGET_USER +Group=$TARGET_USER +WorkingDirectory=/home/$TARGET_USER +ExecStartPre=-/usr/bin/vncserver -kill :$i > /dev/null 2>&1 +ExecStart=/usr/bin/vncserver :$i -geometry 1280x720 -depth 24 +ExecStop=/usr/bin/vncserver -kill :$i + +[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 桌面的操作已全部完成!" \ No newline at end of file