|
|
@@ -0,0 +1,337 @@
|
|
|
+#!/bin/bash
|
|
|
+
|
|
|
+# GitHub Copilot 远程开发连接设置脚本
|
|
|
+# 作者: zhch158
|
|
|
+# 版本: 2.2
|
|
|
+
|
|
|
+# ==================== 配置参数 ====================
|
|
|
+LOCAL_PROXY_PORT=7890
|
|
|
+REMOTE_FORWARD_PORT=7280
|
|
|
+REMOTE_HOST="10.192.72.11"
|
|
|
+REMOTE_USER="ubuntu"
|
|
|
+VLLM_PORT=8101
|
|
|
+LOCAL_VLLM_PORT=8111
|
|
|
+
|
|
|
+# ==================== 颜色定义 ====================
|
|
|
+RED='\033[0;31m'
|
|
|
+GREEN='\033[0;32m'
|
|
|
+YELLOW='\033[1;33m'
|
|
|
+BLUE='\033[0;34m'
|
|
|
+PURPLE='\033[0;35m'
|
|
|
+CYAN='\033[0;36m'
|
|
|
+NC='\033[0m' # No Color
|
|
|
+
|
|
|
+# ==================== 工具函数 ====================
|
|
|
+log_info() {
|
|
|
+ echo -e "${BLUE}ℹ${NC} $1"
|
|
|
+}
|
|
|
+
|
|
|
+log_success() {
|
|
|
+ echo -e "${GREEN}✅${NC} $1"
|
|
|
+}
|
|
|
+
|
|
|
+log_warning() {
|
|
|
+ echo -e "${YELLOW}⚠${NC} $1"
|
|
|
+}
|
|
|
+
|
|
|
+log_error() {
|
|
|
+ echo -e "${RED}❌${NC} $1"
|
|
|
+}
|
|
|
+
|
|
|
+log_step() {
|
|
|
+ echo -e "${PURPLE}🔧${NC} $1"
|
|
|
+}
|
|
|
+
|
|
|
+# ==================== 检查函数 ====================
|
|
|
+check_dependencies() {
|
|
|
+ log_step "检查依赖工具..."
|
|
|
+
|
|
|
+ local missing_tools=()
|
|
|
+
|
|
|
+ # 检查必需工具
|
|
|
+ for tool in ssh curl netstat; do
|
|
|
+ if ! command -v $tool >/dev/null 2>&1; then
|
|
|
+ missing_tools+=($tool)
|
|
|
+ fi
|
|
|
+ done
|
|
|
+
|
|
|
+ if [ ${#missing_tools[@]} -ne 0 ]; then
|
|
|
+ log_error "缺少必需工具: ${missing_tools[*]}"
|
|
|
+ log_info "请安装缺少的工具后重试"
|
|
|
+ exit 1
|
|
|
+ fi
|
|
|
+
|
|
|
+ log_success "所有依赖工具已安装"
|
|
|
+}
|
|
|
+
|
|
|
+check_local_proxy() {
|
|
|
+ log_step "检查本地代理服务..."
|
|
|
+
|
|
|
+ # 检查端口是否监听
|
|
|
+ if netstat -tln 2>/dev/null | grep -q ":$LOCAL_PROXY_PORT "; then
|
|
|
+ log_info "发现本地端口 $LOCAL_PROXY_PORT 正在监听"
|
|
|
+ else
|
|
|
+ log_warning "本地端口 $LOCAL_PROXY_PORT 未在监听"
|
|
|
+ fi
|
|
|
+
|
|
|
+ # 测试代理连接
|
|
|
+ if curl -s --proxy http://localhost:$LOCAL_PROXY_PORT --connect-timeout 5 http://www.google.com > /dev/null 2>&1; then
|
|
|
+ log_success "本地代理 (端口 $LOCAL_PROXY_PORT) 工作正常"
|
|
|
+ return 0
|
|
|
+ else
|
|
|
+ log_warning "本地代理不可用,将使用直接连接"
|
|
|
+ return 1
|
|
|
+ fi
|
|
|
+}
|
|
|
+
|
|
|
+check_remote_connectivity() {
|
|
|
+ log_step "检查远程主机连接..."
|
|
|
+
|
|
|
+ if ssh -o ConnectTimeout=10 -o BatchMode=yes $REMOTE_USER@$REMOTE_HOST "echo 'SSH连接成功'" 2>/dev/null; then
|
|
|
+ log_success "远程主机 $REMOTE_HOST 连接正常"
|
|
|
+ return 0
|
|
|
+ else
|
|
|
+ log_error "无法连接到远程主机 $REMOTE_HOST"
|
|
|
+ log_info "请检查网络连接和SSH配置"
|
|
|
+ return 1
|
|
|
+ fi
|
|
|
+}
|
|
|
+
|
|
|
+# ==================== 主要功能 ====================
|
|
|
+setup_ssh_tunnel() {
|
|
|
+ local proxy_target
|
|
|
+
|
|
|
+ if check_local_proxy; then
|
|
|
+ proxy_target="localhost:$LOCAL_PROXY_PORT"
|
|
|
+ else
|
|
|
+ # 如果没有本地代理,使用一个无效的目标让连接失败
|
|
|
+ log_warning "没有可用的本地代理,GitHub Copilot可能无法正常工作"
|
|
|
+ proxy_target="127.0.0.1:1" # 故意使用一个无效端口
|
|
|
+ fi
|
|
|
+
|
|
|
+ log_step "建立SSH隧道连接..."
|
|
|
+ echo -e "${CYAN}📡 端口转发配置:${NC}"
|
|
|
+ echo " 本地 :$LOCAL_VLLM_PORT -> 远程 :$VLLM_PORT (vLLM 服务)"
|
|
|
+ echo " 远程 :$REMOTE_FORWARD_PORT -> 本地 :$LOCAL_PROXY_PORT (代理服务)"
|
|
|
+ echo ""
|
|
|
+
|
|
|
+ # SSH 连接参数优化,减少警告
|
|
|
+ ssh \
|
|
|
+ -o "ExitOnForwardFailure=yes" \
|
|
|
+ -o "ServerAliveInterval=60" \
|
|
|
+ -o "ServerAliveCountMax=3" \
|
|
|
+ -o "TCPKeepAlive=yes" \
|
|
|
+ -o "Compression=yes" \
|
|
|
+ -o "StrictHostKeyChecking=no" \
|
|
|
+ -o "UserKnownHostsFile=/dev/null" \
|
|
|
+ -o "LogLevel=ERROR" \
|
|
|
+ -L $LOCAL_VLLM_PORT:localhost:$VLLM_PORT \
|
|
|
+ -R $REMOTE_FORWARD_PORT:$proxy_target \
|
|
|
+ $REMOTE_USER@$REMOTE_HOST \
|
|
|
+ "$(cat << 'REMOTE_SCRIPT'
|
|
|
+#!/bin/bash
|
|
|
+
|
|
|
+# 远程执行脚本
|
|
|
+REMOTE_FORWARD_PORT=7280
|
|
|
+SHELL_DIR=$HOME/zhch/shell
|
|
|
+mkdir -p $SHELL_DIR
|
|
|
+
|
|
|
+# 颜色定义
|
|
|
+RED='\033[0;31m'
|
|
|
+GREEN='\033[0;32m'
|
|
|
+YELLOW='\033[1;33m'
|
|
|
+BLUE='\033[0;34m'
|
|
|
+PURPLE='\033[0;35m'
|
|
|
+CYAN='\033[0;36m'
|
|
|
+NC='\033[0m'
|
|
|
+
|
|
|
+log_info() { echo -e "${BLUE}ℹ${NC} $1"; }
|
|
|
+log_success() { echo -e "${GREEN}✅${NC} $1"; }
|
|
|
+log_warning() { echo -e "${YELLOW}⚠${NC} $1"; }
|
|
|
+log_error() { echo -e "${RED}❌${NC} $1"; }
|
|
|
+log_step() { echo -e "${PURPLE}🔧${NC} $1"; }
|
|
|
+
|
|
|
+echo -e "${CYAN}🚀 在远程主机上配置 GitHub Copilot 环境${NC}"
|
|
|
+echo "=================================================="
|
|
|
+
|
|
|
+# 备份原有代理设置
|
|
|
+log_step "备份原有代理设置..."
|
|
|
+env | grep -i proxy > $SHELL_DIR/copilot_proxy_backup 2>/dev/null || true
|
|
|
+
|
|
|
+# 显示当前环境
|
|
|
+log_info "当前代理环境:"
|
|
|
+env | grep -i proxy | sed 's/^/ /' || echo " (无代理设置)"
|
|
|
+
|
|
|
+# 清除现有代理设置
|
|
|
+log_step "清除现有代理设置..."
|
|
|
+unset http_proxy https_proxy HTTP_PROXY HTTPS_PROXY
|
|
|
+unset ftp_proxy FTP_PROXY no_proxy NO_PROXY
|
|
|
+
|
|
|
+# 设置新的代理环境变量
|
|
|
+log_step "设置隧道代理环境变量..."
|
|
|
+export http_proxy=http://localhost:$REMOTE_FORWARD_PORT
|
|
|
+export https_proxy=http://localhost:$REMOTE_FORWARD_PORT
|
|
|
+export HTTP_PROXY=http://localhost:$REMOTE_FORWARD_PORT
|
|
|
+export HTTPS_PROXY=http://localhost:$REMOTE_FORWARD_PORT
|
|
|
+export no_proxy=localhost,127.0.0.1,10.192.72.11,172.16.0.0/12
|
|
|
+export NO_PROXY=localhost,127.0.0.1,10.192.72.11,172.16.0.0/12
|
|
|
+
|
|
|
+log_success "代理环境变量已设置"
|
|
|
+echo " http_proxy=http://localhost:$REMOTE_FORWARD_PORT"
|
|
|
+echo " https_proxy=http://localhost:$REMOTE_FORWARD_PORT"
|
|
|
+
|
|
|
+# 检查端口监听状态
|
|
|
+log_step "检查端口转发状态..."
|
|
|
+sleep 2 # 等待端口转发建立
|
|
|
+
|
|
|
+if netstat -tln 2>/dev/null | grep -q ":$REMOTE_FORWARD_PORT " || ss -tln 2>/dev/null | grep -q ":$REMOTE_FORWARD_PORT "; then
|
|
|
+ log_success "端口 $REMOTE_FORWARD_PORT 正在监听"
|
|
|
+else
|
|
|
+ log_warning "端口 $REMOTE_FORWARD_PORT 未检测到监听状态"
|
|
|
+fi
|
|
|
+
|
|
|
+# 测试网络连接
|
|
|
+log_step "测试网络连接..."
|
|
|
+
|
|
|
+echo "🧪 连接测试结果:"
|
|
|
+
|
|
|
+# 测试隧道代理
|
|
|
+if curl -s --proxy http://localhost:$REMOTE_FORWARD_PORT --connect-timeout 10 http://httpbin.org/ip > /dev/null 2>&1; then
|
|
|
+ log_success "隧道代理连接正常"
|
|
|
+else
|
|
|
+ log_warning "隧道代理连接失败"
|
|
|
+fi
|
|
|
+
|
|
|
+# 测试 GitHub API
|
|
|
+if curl -s --connect-timeout 10 https://api.github.com/user > /dev/null 2>&1; then
|
|
|
+ log_success "GitHub API 可访问"
|
|
|
+else
|
|
|
+ log_error "GitHub API 不可访问"
|
|
|
+fi
|
|
|
+
|
|
|
+# 测试 GitHub Copilot 服务
|
|
|
+if curl -s --connect-timeout 10 https://copilot-proxy.githubusercontent.com/ > /dev/null 2>&1; then
|
|
|
+ log_success "GitHub Copilot 服务可访问"
|
|
|
+else
|
|
|
+ log_warning "GitHub Copilot 服务访问可能有问题"
|
|
|
+fi
|
|
|
+
|
|
|
+# 显示环境信息
|
|
|
+echo ""
|
|
|
+echo -e "${CYAN}📊 环境信息摘要${NC}"
|
|
|
+echo "=================================================="
|
|
|
+echo "🔗 SSH 隧道: 已建立"
|
|
|
+echo "🌐 代理端口: localhost:$REMOTE_FORWARD_PORT"
|
|
|
+echo "📝 备份文件: $SHELL_DIR/copilot_proxy_backup"
|
|
|
+echo "💻 主机名: $(hostname)"
|
|
|
+echo "👤 用户: $(whoami)"
|
|
|
+echo "📅 时间: $(date)"
|
|
|
+
|
|
|
+# 创建快速测试脚本
|
|
|
+cat > $SHELL_DIR/test_copilot_connection.sh << 'TEST_EOF'
|
|
|
+#!/bin/bash
|
|
|
+echo "🧪 GitHub Copilot 连接测试"
|
|
|
+echo "=========================="
|
|
|
+
|
|
|
+# 测试代理连接
|
|
|
+if curl -s --connect-timeout 5 https://api.github.com > /dev/null; then
|
|
|
+ echo "✅ GitHub API: 可访问"
|
|
|
+else
|
|
|
+ echo "❌ GitHub API: 不可访问"
|
|
|
+fi
|
|
|
+
|
|
|
+if curl -s --connect-timeout 5 https://copilot-proxy.githubusercontent.com/ > /dev/null; then
|
|
|
+ echo "✅ Copilot Service: 可访问"
|
|
|
+else
|
|
|
+ echo "❌ Copilot Service: 不可访问"
|
|
|
+fi
|
|
|
+
|
|
|
+echo ""
|
|
|
+echo "📊 当前代理设置:"
|
|
|
+env | grep -i proxy | sort
|
|
|
+TEST_EOF
|
|
|
+
|
|
|
+chmod +x $SHELL_DIR/test_copilot_connection.sh
|
|
|
+
|
|
|
+# 创建代理恢复脚本
|
|
|
+cat > $SHELL_DIR/restore_proxy.sh << 'RESTORE_EOF'
|
|
|
+#!/bin/bash
|
|
|
+echo "🔄 恢复原有代理设置..."
|
|
|
+
|
|
|
+if [ -f $SHELL_DIR/copilot_proxy_backup ]; then
|
|
|
+ source $SHELL_DIR/copilot_proxy_backup
|
|
|
+ echo "✅ 代理设置已恢复"
|
|
|
+ echo "📊 当前代理设置:"
|
|
|
+ env | grep -i proxy | sort
|
|
|
+else
|
|
|
+ echo "❌ 未找到备份文件"
|
|
|
+fi
|
|
|
+RESTORE_EOF
|
|
|
+
|
|
|
+chmod +x $SHELL_DIR/restore_proxy.sh
|
|
|
+
|
|
|
+echo ""
|
|
|
+echo -e "${GREEN}🎉 GitHub Copilot 环境配置完成!${NC}"
|
|
|
+echo "=================================================="
|
|
|
+echo "📝 使用说明:"
|
|
|
+echo " • 保持此 SSH 会话活跃以维持 Copilot 功能"
|
|
|
+echo " • 在 VS Code 中正常使用 GitHub Copilot"
|
|
|
+echo " • 运行 $SHELL_DIR/test_copilot_connection.sh 测试连接"
|
|
|
+echo " • 运行 $SHELL_DIR/restore_proxy.sh 恢复原有代理设置"
|
|
|
+echo ""
|
|
|
+echo "🔧 调试命令:"
|
|
|
+echo " netstat -tln | grep :$REMOTE_FORWARD_PORT # 检查端口"
|
|
|
+echo " curl -v https://api.github.com # 测试 GitHub API"
|
|
|
+echo " env | grep -i proxy # 查看代理设置"
|
|
|
+echo ""
|
|
|
+
|
|
|
+# 设置退出时恢复代理的陷阱
|
|
|
+trap 'echo "🔄 会话结束,恢复代理设置..."; source $SHELL_DIR/copilot_proxy_backup 2>/dev/null || true; echo "✅ 代理设置已恢复"' EXIT
|
|
|
+
|
|
|
+log_info "保持 SSH 会话活跃中... (按 Ctrl+C 退出)"
|
|
|
+
|
|
|
+# 保持会话活跃并定期显示状态
|
|
|
+while true; do
|
|
|
+ sleep 60
|
|
|
+ echo "📡 $(date '+%H:%M:%S'): SSH 隧道活跃,Copilot 代理运行中"
|
|
|
+
|
|
|
+ # 检查代理连接状态
|
|
|
+ if netstat -an 2>/dev/null | grep -q ":$REMOTE_FORWARD_PORT.*ESTABLISHED"; then
|
|
|
+ echo "🔥 检测到活跃的代理连接"
|
|
|
+ fi
|
|
|
+done
|
|
|
+
|
|
|
+'REMOTE_SCRIPT'
|
|
|
+)"
|
|
|
+}
|
|
|
+
|
|
|
+# ==================== 清理函数 ====================
|
|
|
+cleanup() {
|
|
|
+ log_info "正在清理..."
|
|
|
+ # 这里可以添加清理逻辑
|
|
|
+}
|
|
|
+
|
|
|
+# ==================== 主程序 ====================
|
|
|
+main() {
|
|
|
+ echo -e "${CYAN}🚀 GitHub Copilot 远程开发连接设置${NC}"
|
|
|
+ echo "=================================================="
|
|
|
+ echo "📅 $(date)"
|
|
|
+ echo "🖥️ 本机: $(hostname)"
|
|
|
+ echo "🌐 远程: $REMOTE_HOST"
|
|
|
+ echo ""
|
|
|
+
|
|
|
+ # 设置退出陷阱
|
|
|
+ trap cleanup EXIT
|
|
|
+
|
|
|
+ # 执行检查
|
|
|
+ check_dependencies
|
|
|
+ check_remote_connectivity || exit 1
|
|
|
+
|
|
|
+ # 设置隧道
|
|
|
+ setup_ssh_tunnel
|
|
|
+}
|
|
|
+
|
|
|
+# ==================== 脚本入口 ====================
|
|
|
+if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
|
|
|
+ main "$@"
|
|
|
+fi
|