| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337 |
- #!/bin/bash
- # GitHub Copilot 远程开发连接设置脚本
- # 作者: zhch158
- # 版本: 2.2
- # ==================== 配置参数 ====================
- LOCAL_PROXY_PORT=7890
- REMOTE_FORWARD_PORT=7281
- 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=7281
- 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 "127.0.0.1:$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 127.0.0.1:$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 "127.0.0.1:$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
|