Files
script-tool/vnc/multi_vnc_single_user.sh

90 lines
3.0 KiB
Bash
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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 桌面的操作已全部完成!"