文章目錄
- 一、創建test1-test10用戶(跳過已存在的test3)
- 二、檢查必要組件是否安裝
- 解決方法:用緊湊格式避免換行解析錯誤
- 核心修復說明:
- 使用方法:
以下是根據需求生成的命令、檢查腳本及啟動腳本,按步驟執行即可:
一、創建test1-test10用戶(跳過已存在的test3)
# 循環創建用戶,若用戶已存在則跳過
for U in test1 test2 test3 test4 test5 test6 test7 test8 test9 test10; doif ! id "$U" &>/dev/null; then# 用戶不存在時創建,家目錄自動生成,默認shell為bashuseradd -m -s /bin/bash "$U"# 為新用戶設置密碼(可根據需要修改密碼)echo "$U:StrongPassword123" | chpasswdecho "用戶 $U 創建完成"elseecho "用戶 $U 已存在,跳過創建"fi
done
二、檢查必要組件是否安裝
創建檢查腳本 check_dependencies.sh
,用于驗證 code-server
、jupyterlab
、jupyter-server-proxy
是否安裝:
#!/bin/bash# 檢查code-server是否安裝
if command -v code-server &>/dev/null; thenecho "? code-server 已安裝,版本:$(code-server --version | head -n1)"
elseecho "? code-server 未安裝,請先執行安裝命令:curl -fsSL https://code-server.dev/install.sh | sh"
fi# 檢查jupyterlab是否安裝
if command -v jupyter &>/dev/null && jupyter lab --version &>/dev/null; thenecho "? JupyterLab 已安裝,版本:$(jupyter lab --version)"
elseecho "? JupyterLab 未安裝,請先執行安裝命令:pip install jupyterlab"
fi# 檢查jupyter-server-proxy是否安裝
if pip show jupyter-server-proxy &>/dev/null; thenecho "? jupyter-server-proxy 已安裝,版本:$(pip show jupyter-server-proxy | grep Version | awk '{print $2}')"
elseecho "? jupyter-server-proxy 未安裝,請先執行安裝命令:pip install jupyter-server-proxy"
fi# 檢查jupyter-server-proxy擴展是否啟用
if jupyter server extension list 2>/dev/null | grep -q "jupyter_server_proxy.*enabled"; thenecho "? jupyter-server-proxy 擴展已啟用"
elseecho "? jupyter-server-proxy 擴展未啟用,請執行:jupyter server extension enable --sys-prefix jupyter_server_proxy"
fi
執行檢查腳本:
chmod +x check_dependencies.sh
./check_dependencies.sh
根據輸出提示,安裝缺失的組件(若有)。
錯誤原因:su -c
命令中換行符和引號的組合導致命令被拆分成多行執行,使得 --bind-addr
被誤認為獨立命令(而非 code-server
的參數)。核心是命令格式的語法問題。
解決方法:用緊湊格式避免換行解析錯誤
將 code-server
的啟動命令合并為單行(或嚴格控制換行位置),確保所有參數都屬于 code-server
命令。以下是修復后的腳本(直接復制粘貼生成):
cat << 'EOF' > start_multi_user_ide_v2.sh
#!/bin/bash
set -euo pipefail# 配置參數
USERS=(test1 test2 test3 test4 test5 test6 test7 test8 test9 test10)
BASE_PORT=8890
JUPYTER_PORT=8910
JUPYTER_CONFIG_DIR="/opt/conda/etc/jupyter/jupyter_server_config.d"
CHECK_DELAY=2# 步驟1:配置Jupyter代理
echo "🔧 配置Jupyter代理允許的端口(${BASE_PORT}-$((BASE_PORT+9)))..."
mkdir -p "$JUPYTER_CONFIG_DIR"
cat > "$JUPYTER_CONFIG_DIR/proxy-allowed-ports.json" << 'EOF_INNER'
{"ServerProxy": {"allowed_ports": [8890,8891,8892,8893,8894,8895,8896,8897,8898,8899]}
}
EOF_INNER
echo "? Jupyter代理配置已更新"# 步驟2:啟動各用戶Code-Server(修復命令格式)
echo -e "\n🚀 開始啟動各用戶Code-Server..."
for idx in "${!USERS[@]}"; doUSER="${USERS[$idx]}"PORT=$((BASE_PORT + idx))HOME_DIR="/home/${USER}"DATA_DIR="${HOME_DIR}/.local/share/code-server"EXT_DIR="${HOME_DIR}/.local/share/code-server/extensions"LOG_FILE="${HOME_DIR}/code-server.log"CONFIG_FILE="${HOME_DIR}/.config/code-server/config.yaml"# 檢查家目錄if [ ! -d "$HOME_DIR" ]; thenecho "? 跳過用戶${USER}:家目錄不存在"continuefi# 備份舊配置if [ -f "$CONFIG_FILE" ]; thenecho "?? 備份用戶${USER}舊配置文件..."mv "$CONFIG_FILE" "${CONFIG_FILE}.bak"fi# 創建目錄并授權echo "📂 準備用戶${USER}目錄..."mkdir -p "${DATA_DIR}" "${EXT_DIR}"chown -R "${USER}:${USER}" "${HOME_DIR}/.local" || {echo "? 用戶${USER}目錄授權失敗"continue}# 停止舊進程if ss -ltnp | grep -q ":${PORT} "; thenecho "🔌 關閉端口${PORT}舊進程..."pkill -9 -f "code-server.*:${PORT}" || echo "?? 無舊進程"sleep $CHECK_DELAYfi# 核心修復:用單行緊湊格式傳遞命令,避免換行解析錯誤echo "?? 啟動用戶${USER}(端口${PORT})..."su - "$USER" -c "nohup code-server --auth none --bind-addr 127.0.0.1:${PORT} --user-data-dir '${DATA_DIR}' --extensions-dir '${EXT_DIR}' --config /dev/null '${HOME_DIR}' > '${LOG_FILE}' 2>&1 & sleep 1" || {echo "? 用戶${USER}啟動命令執行失敗,日志:${LOG_FILE}"continue}# 檢查啟動狀態sleep $CHECK_DELAYif ss -ltnp | grep -q "127.0.0.1:${PORT}"; thenecho "? 用戶${USER}啟動成功"elseecho "? 用戶${USER}啟動失敗!日志:"tail -n 5 "$LOG_FILE"fi
done# 步驟3:啟動JupyterLab
echo -e "\n🌐 啟動JupyterLab(端口${JUPYTER_PORT})..."
if ss -ltnp | grep -q ":${JUPYTER_PORT} "; thenecho "🔌 關閉Jupyter舊進程..."pkill -9 -f "jupyter-lab.*:${JUPYTER_PORT}"sleep $CHECK_DELAY
finohup jupyter lab \--ip=0.0.0.0 \--port="${JUPYTER_PORT}" \--allow-root \
> /var/log/jupyterlab.log 2>&1 &sleep $((CHECK_DELAY * 2))
if ss -ltnp | grep -q ":${JUPYTER_PORT} "; thenecho "? JupyterLab啟動成功"
elseecho "? JupyterLab啟動失敗,日志:"tail -n 5 /var/log/jupyterlab.log
fi# 匯總結果
echo -e "\n📊 啟動結果匯總:"
echo "Code-Server監聽情況:"
ss -ltnp | grep -E ":889[0-9] " || echo "?? 未發現監聽端口"echo -e "\n🌐 訪問地址:"
echo "JupyterLab:http://36.151.192.85:23589/lab?token=$(grep -oP 'token=\K[^&]+' /var/log/jupyterlab.log | head -n1)"
echo "test1 Code-Server:http://36.151.192.85:23589/proxy/8890/"
EOF
核心修復說明:
將 su -c
中的 code-server
命令改為單行緊湊格式,避免因換行導致的參數拆分:
原多行命令容易被shell解析為多個獨立命令,而單行格式確保 --auth none
、--bind-addr
等參數都屬于 code-server
命令,解決“--bind-addr: command not found
”錯誤。
使用方法:
- 復制上面的命令粘貼到終端,自動生成腳本。
- 運行腳本:
chmod +x start_multi_user_ide_v2.sh ./start_multi_user_ide_v2.sh
此時 code-server
會正確接收所有參數,免密啟動并監聽對應端口。