Skip to main content
Glama
connect_server.sh.template17.9 kB
#!/bin/bash # 统一服务器连接脚本模板 - 智能快速连接 + 完整环境配置 # 使用说明:复制此文件并修改配置信息后使用 SESSION_NAME="dev-session-template" CONNECTION_TOOL="remote-tool" # 跳板机配置(可选,如果为空则直接连接目标服务器) JUMP_HOST="your_jump_host" # 跳板机地址,设为空字符串则跳过 JUMP_PASSWORD="your_password_here" # 跳板机密码(自动输入) # 目标服务器配置 SERVER_HOST="your_server_host" # 最终目标服务器 DOCKER_CONTAINER="your_container" # Docker容器名称 DOCKER_IMAGE="your_docker_image" # Docker镜像名称 # 环境配置选项 AUTO_SETUP_ENVIRONMENT=true # 是否自动配置环境(首次) QUICK_CONNECT_MODE=true # 快速连接模式(跳过已配置的环境设置) # BOS配置信息(仅首次环境配置时使用) BOS_ACCESS_KEY="your_bos_access_key" BOS_SECRET_KEY="your_bos_secret_key" BOS_BUCKET="your_bos_bucket_path" # 颜色定义 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' CYAN='\033[0;36m' NC='\033[0m' # 智能检查tmux输出函数 check_tmux_output() { local session_name=$1 local expected_pattern=$2 local timeout=${3:-10} local check_interval=1 local elapsed=0 while [ $elapsed -lt $timeout ]; do local output=$(tmux capture-pane -t $session_name -p | grep -v '^$' | tail -10) if [[ "$output" =~ $expected_pattern ]]; then return 0 fi sleep $check_interval elapsed=$((elapsed + check_interval)) done return 1 } # 智能容器检查和处理函数(修复版 - 解决分支执行bug) smart_container_setup() { local session_name=$1 local container_name=$2 local image_name=$3 echo -e "${BLUE}🔍 智能检查Docker环境...${NC}" # 步骤1:精确检查容器是否存在 echo -e "${BLUE}🔍 步骤1: 精确检查容器是否存在: $container_name${NC}" tmux send-keys -t $session_name "echo '=== CONTAINER_EXIST_CHECK_START ==='" Enter tmux send-keys -t $session_name "docker inspect $container_name >/dev/null 2>&1 && echo 'CONTAINER_EXISTS_YES' || echo 'CONTAINER_EXISTS_NO'" Enter sleep 3 # 改进的输出捕获 - 只获取最后一行结果 echo -e "${YELLOW}正在捕获检查结果...${NC}" tmux send-keys -t $session_name "echo '=== CAPTURE_POINT ==='" Enter sleep 1 # 更精确的输出捕获 - 获取两个标记之间的内容 local exist_output=$(tmux capture-pane -t $session_name -p | sed -n '/=== CONTAINER_EXIST_CHECK_START ===/,/=== CAPTURE_POINT ===/p' | grep -E "(CONTAINER_EXISTS_YES|CONTAINER_EXISTS_NO)" | tail -1) echo -e "${YELLOW}调试信息 - 容器存在性检查:${NC}" echo "检查结果: [$exist_output]" # 更严格的条件判断 if [[ "$exist_output" == *"CONTAINER_EXISTS_YES"* ]]; then echo -e "${GREEN}✅ 容器已存在,进入快速连接模式...${NC}" handle_existing_container $session_name $container_name return $? elif [[ "$exist_output" == *"CONTAINER_EXISTS_NO"* ]]; then echo -e "${BLUE}🚀 容器不存在,进入创建模式...${NC}" handle_new_container $session_name $container_name $image_name return $? else echo -e "${RED}❌ 容器存在性检查结果异常${NC}" echo -e "${YELLOW}调试信息 - 原始输出:${NC}" tmux capture-pane -t $session_name -p | tail -10 return 1 fi } # 处理已存在容器的逻辑 handle_existing_container() { local session_name=$1 local container_name=$2 echo -e "${BLUE}🔍 步骤2: 检查容器运行状态...${NC}" tmux send-keys -t $session_name "echo '=== CONTAINER_STATUS_CHECK_START ==='" Enter tmux send-keys -t $session_name "docker inspect --format='{{.State.Running}}' $container_name" Enter sleep 2 local status_output=$(tmux capture-pane -t $session_name -p | grep -A 3 "=== CONTAINER_STATUS_CHECK_START ===" | tail -2) echo -e "${YELLOW}调试信息 - 容器运行状态:${NC}" echo "$status_output" if echo "$status_output" | grep -q "true"; then echo -e "${GREEN}✅ 容器正在运行${NC}" else echo -e "${YELLOW}⚠️ 容器已停止,正在启动...${NC}" tmux send-keys -t $session_name "echo '=== CONTAINER_START_BEGIN ==='" Enter tmux send-keys -t $session_name "docker start $container_name" Enter sleep 5 # 验证启动是否成功 local start_result=$(tmux capture-pane -t $session_name -p | grep -A 3 "=== CONTAINER_START_BEGIN ===" | tail -2) if echo "$start_result" | grep -q "$container_name"; then echo -e "${GREEN}✅ 容器启动成功${NC}" else echo -e "${RED}❌ 容器启动失败${NC}" echo -e "${YELLOW}错误信息: $start_result${NC}" return 1 fi fi # 进入容器 echo -e "${GREEN}🚪 步骤3: 进入现有容器...${NC}" tmux send-keys -t $session_name "docker exec -it $container_name zsh" Enter sleep 2 # 检查是否成功进入zsh if ! check_tmux_output $session_name ".*@.*:.*#" 5; then echo -e "${YELLOW}⚠️ 尝试启动zsh...${NC}" tmux send-keys -t $session_name "zsh" Enter sleep 2 fi echo -e "${GREEN}✅ 快速连接完成!${NC}" return 0 } # 处理新容器创建的逻辑 handle_new_container() { local session_name=$1 local container_name=$2 local image_name=$3 echo -e "${BLUE}步骤1: 创建Docker容器 $container_name${NC}" tmux send-keys -t $session_name "echo '=== CONTAINER_CREATE_START ==='" Enter tmux send-keys -t $session_name "docker run --privileged --name=$container_name --ulimit core=-1 --security-opt seccomp=unconfined -dti --net=host --uts=host --ipc=host -v /home:/home -v /data1:/data1 -v /data2:/data2 -v /data3:/data3 -v /data4:/data4 --shm-size=256g --restart=always $image_name" Enter sleep 10 # 验证容器创建 echo -e "${BLUE}步骤2: 验证容器创建结果${NC}" tmux send-keys -t $session_name "echo '=== VERIFY_CREATE_START ==='" Enter tmux send-keys -t $session_name "docker inspect $container_name >/dev/null 2>&1 && echo 'CREATE_SUCCESS' || echo 'CREATE_FAILED'" Enter sleep 3 local verify_output=$(tmux capture-pane -t $session_name -p | grep -A 3 "=== VERIFY_CREATE_START ===" | tail -2) if echo "$verify_output" | grep -q "CREATE_SUCCESS"; then echo -e "${GREEN}✅ 容器创建成功${NC}" else echo -e "${RED}❌ 容器创建失败${NC}" echo -e "${YELLOW}调试信息: $verify_output${NC}" return 1 fi # 进入新创建的容器 echo -e "${GREEN}🚪 步骤3: 进入新创建的容器...${NC}" tmux send-keys -t $session_name "docker exec -it $container_name bash" Enter sleep 3 if ! check_tmux_output $session_name "root@.*#" 5; then echo -e "${RED}❌ 进入容器失败${NC}" return 1 fi # 如果启用自动环境配置,执行完整配置 if [ "$AUTO_SETUP_ENVIRONMENT" = "true" ]; then setup_full_environment $session_name else echo -e "${YELLOW}💡 容器已创建,如需配置环境请手动执行相关命令${NC}" fi return 0 } # 完整环境配置函数(改进版 - 直接检测实际使用结果) setup_full_environment() { local session_name=$1 echo -e "${BLUE}🛠️ 开始完整环境配置...${NC}" # 检查BOS工具 echo -e "${BLUE}步骤1: 检查BOS工具${NC}" tmux send-keys -t $session_name "which bcecmd" Enter sleep 2 if check_tmux_output $session_name "/.*bcecmd" 5; then echo -e "${GREEN}✅ BOS工具可用${NC}" # 配置BOS echo -e "${BLUE}步骤2: 配置BOS工具${NC}" echo "启动bcecmd配置..." tmux send-keys -t $session_name "bcecmd -c" Enter sleep 3 # 给bcecmd更多启动时间 echo "输入Access Key..." tmux send-keys -t $session_name "$BOS_ACCESS_KEY" Enter sleep 0.1 # 调整为0.1秒间隔 echo "输入Secret Key..." tmux send-keys -t $session_name "$BOS_SECRET_KEY" Enter sleep 0.1 # 调整为0.1秒间隔 echo "使用默认配置(连续回车)..." for i in {1..11}; do echo " 发送第${i}个回车..." tmux send-keys -t $session_name "" Enter sleep 0.1 # 调整为0.1秒间隔 done # 等待配置完成 echo "等待bcecmd配置完成..." sleep 5 # 改进:直接测试实际使用,不检测配置信息 echo -e "${BLUE}步骤3: 测试BOS连接并下载配置文件${NC}" # 尝试下载第一个配置文件 echo "测试下载.p10k.zsh配置..." tmux send-keys -t $session_name "echo '=== BOS_DOWNLOAD_START ==='" Enter tmux send-keys -t $session_name "bcecmd bos cp -y $BOS_BUCKET/.p10k.zsh /root" Enter sleep 5 # 检查下载是否成功 tmux send-keys -t $session_name "echo '=== BOS_DOWNLOAD_CHECK ==='" Enter tmux send-keys -t $session_name "if [ -f /root/.p10k.zsh ]; then echo 'BOS_DOWNLOAD_SUCCESS'; else echo 'BOS_DOWNLOAD_FAILED'; fi" Enter sleep 2 # 检查下载结果 local download_output=$(tmux capture-pane -t $session_name -p | tail -10) if echo "$download_output" | grep -q "BOS_DOWNLOAD_SUCCESS"; then echo -e "${GREEN}✅ BOS配置和连接成功!${NC}" # 继续下载其他配置文件 echo "下载.zshrc配置..." tmux send-keys -t $session_name "bcecmd bos cp -y $BOS_BUCKET/.zshrc /root" Enter sleep 5 echo "下载.zsh_history配置..." tmux send-keys -t $session_name "bcecmd bos cp -y $BOS_BUCKET/.zsh_history /root" Enter sleep 5 # 验证所有配置文件 echo -e "${BLUE}步骤4: 验证配置文件${NC}" tmux send-keys -t $session_name "ls -la /root/.zshrc /root/.p10k.zsh /root/.zsh_history" Enter sleep 2 # 检查配置文件是否下载成功 if check_tmux_output $session_name "\.zshrc.*\.p10k\.zsh.*\.zsh_history" 5; then echo -e "${GREEN}✅ 所有配置文件下载成功${NC}" else echo -e "${YELLOW}⚠️ 部分配置文件可能下载失败,但核心配置已成功${NC}" fi else echo -e "${RED}❌ BOS连接或下载失败!${NC}" echo -e "${YELLOW}🔍 BOS操作输出:${NC}" echo -e "${CYAN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}" echo "$download_output" echo -e "${CYAN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}" echo "" echo -e "${YELLOW}💡 可能的原因:${NC}" echo -e "${CYAN} 1. Access Key 或 Secret Key 不正确${NC}" echo -e "${CYAN} 2. 网络连接问题${NC}" echo -e "${CYAN} 3. BOS Bucket路径不存在:$BOS_BUCKET${NC}" echo -e "${CYAN} 4. 权限不足或文件不存在${NC}" echo "" echo -e "${RED}🛑 BOS下载失败,切换到本地配置${NC}" echo -e "${YELLOW}📋 调试建议(如需要):${NC}" echo -e "${CYAN} 1. 进入tmux session: tmux attach -t $session_name${NC}" echo -e "${CYAN} 2. 手动测试: bcecmd bos ls $BOS_BUCKET${NC}" echo -e "${CYAN} 3. 检查网络: ping bce.example.com${NC}" echo -e "${CYAN} 4. 验证密钥和bucket路径${NC}" echo "" echo -e "${BLUE}🔄 自动切换到本地备用配置...${NC}" setup_local_config $session_name fi else echo -e "${YELLOW}⚠️ BOS工具不可用,使用本地备用配置${NC}" setup_local_config $session_name fi # 创建工作目录 echo -e "${BLUE}步骤5: 创建工作目录${NC}" tmux send-keys -t $session_name "mkdir -p /home/xuyehua" Enter sleep 1 # 生成SSH密钥 echo -e "${BLUE}步骤6: 生成SSH密钥${NC}" echo "生成SSH密钥(使用默认设置)..." tmux send-keys -t $session_name "ssh-keygen -t rsa -f ~/.ssh/id_rsa -N ''" Enter sleep 3 # 启动zsh环境 echo -e "${BLUE}步骤7: 启动zsh环境${NC}" tmux send-keys -t $session_name "echo '=== 启动zsh ==='" Enter tmux send-keys -t $session_name "zsh" Enter sleep 3 # 显示SSH公钥 echo -e "${BLUE}步骤8: 显示SSH公钥${NC}" tmux send-keys -t $session_name "echo \"=== SSH_KEY_DISPLAY_START ===\"" Enter tmux send-keys -t $session_name "if [ -f /root/.ssh/id_rsa.pub ]; then cat /root/.ssh/id_rsa.pub; else echo \"SSH公钥文件不存在\"; fi" Enter sleep 2 # 捕获并显示公钥内容 local ssh_key_output=$(tmux capture-pane -t $session_name -p | grep -A 3 "=== SSH_KEY_DISPLAY_START ===" | tail -2 | grep -v "^$" | head -1) if [ -n "$ssh_key_output" ] && ! echo "$ssh_key_output" | grep -q "不存在"; then echo -e "${GREEN}✅ SSH公钥已生成,内容如下:${NC}" echo -e "${CYAN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}" echo -e "${YELLOW}$ssh_key_output${NC}" echo -e "${CYAN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}" echo -e "${GREEN}💡 请复制上述公钥内容到目标服务器的authorized_keys文件${NC}" else echo -e "${YELLOW}⚠️ SSH公钥获取失败,请手动执行: cat /root/.ssh/id_rsa.pub${NC}" fi echo -e "${GREEN}✅ 完整环境配置完成!${NC}" } echo -e "${CYAN}=== 统一服务器连接脚本 ===${NC}" echo "目标服务器: $SERVER_HOST" echo "Docker容器: $DOCKER_CONTAINER" echo "快速连接模式: $QUICK_CONNECT_MODE" echo "" # 检查session是否已存在 if tmux has-session -t $SESSION_NAME 2>/dev/null; then echo -e "${GREEN}✅ Session '$SESSION_NAME' 已存在${NC}" # 智能检查当前状态 echo -e "${BLUE}🔍 检查当前环境状态...${NC}" current_output=$(tmux capture-pane -t $SESSION_NAME -p | tail -3) if echo "$current_output" | grep -q "root@.*:.*#\|.*@.*-.*:.*\$"; then echo -e "${GREEN}✅ 当前已在Docker容器内${NC}" echo -e "${YELLOW}使用: tmux attach -t $SESSION_NAME${NC}" else echo -e "${YELLOW}⚠️ 当前不在Docker容器内${NC}" echo -e "${BLUE}🚀 尝试自动进入Docker容器...${NC}" smart_container_setup "$SESSION_NAME" "$DOCKER_CONTAINER" "$DOCKER_IMAGE" fi exit 0 fi echo -e "${BLUE}🚀 创建新的tmux session: $SESSION_NAME${NC}" tmux new-session -d -s $SESSION_NAME echo -e "${BLUE}📡 步骤1: 启动连接工具 ($CONNECTION_TOOL)${NC}" tmux send-keys -t $SESSION_NAME "$CONNECTION_TOOL" Enter echo -e "${YELLOW}✋ 请完成指纹认证...${NC}" sleep 2 # 连接流程 if [ -n "$JUMP_HOST" ] && [ "$JUMP_HOST" != "" ]; then echo -e "${BLUE}🔗 步骤2: 连接到跳板机 ($JUMP_HOST)${NC}" tmux send-keys -t $SESSION_NAME "ssh $JUMP_HOST" Enter echo -e "${BLUE}🔑 自动输入跳板机密码...${NC}" sleep 3 tmux send-keys -t $SESSION_NAME "$JUMP_PASSWORD" Enter echo -e "${BLUE}🎯 步骤3: 从跳板机连接到目标服务器 ($SERVER_HOST)${NC}" sleep 2 tmux send-keys -t $SESSION_NAME "ssh $SERVER_HOST" Enter else echo -e "${BLUE}🎯 步骤2: 直接连接到目标服务器 ($SERVER_HOST)${NC}" tmux send-keys -t $SESSION_NAME "ssh $SERVER_HOST" Enter fi echo -e "${YELLOW}等待服务器连接建立...${NC}" sleep 3 # 智能Docker环境设置 echo -e "${BLUE}🐳 步骤4: 智能Docker环境设置${NC}" smart_container_setup "$SESSION_NAME" "$DOCKER_CONTAINER" "$DOCKER_IMAGE" echo -e "${GREEN}✅ 连接流程完成${NC}" echo -e "${YELLOW}使用: tmux attach -t $SESSION_NAME${NC}" echo "" echo -e "${CYAN}💡 功能说明:${NC}" if [ -n "$JUMP_HOST" ] && [ "$JUMP_HOST" != "" ]; then echo -e "${CYAN} 🔗 连接流程: $CONNECTION_TOOL → $JUMP_HOST → $SERVER_HOST → Docker容器${NC}" else echo -e "${CYAN} 🎯 连接流程: $CONNECTION_TOOL → $SERVER_HOST → Docker容器${NC}" fi echo -e "${CYAN} 🚀 智能模式: 自动检测容器状态,快速进入或完整配置${NC}" echo -e "${CYAN} ⚡ 快速连接: 现有容器直接进入,无需重复配置${NC}" echo -e "${CYAN} 🛠️ 完整配置: 新容器自动配置BOS、SSH密钥、zsh环境${NC}" echo -e "${CYAN} 📱 使用方式: tmux attach -t $SESSION_NAME${NC}"

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/maricoxu/remote-terminal-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server