setup_remote_copilot_v2.sh 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337
  1. #!/bin/bash
  2. # GitHub Copilot 远程开发连接设置脚本
  3. # 作者: zhch158
  4. # 版本: 2.2
  5. # ==================== 配置参数 ====================
  6. LOCAL_PROXY_PORT=7890
  7. REMOTE_FORWARD_PORT=7281
  8. REMOTE_HOST="10.192.72.11"
  9. REMOTE_USER="ubuntu"
  10. VLLM_PORT=8101
  11. LOCAL_VLLM_PORT=8111
  12. # ==================== 颜色定义 ====================
  13. RED='\033[0;31m'
  14. GREEN='\033[0;32m'
  15. YELLOW='\033[1;33m'
  16. BLUE='\033[0;34m'
  17. PURPLE='\033[0;35m'
  18. CYAN='\033[0;36m'
  19. NC='\033[0m' # No Color
  20. # ==================== 工具函数 ====================
  21. log_info() {
  22. echo -e "${BLUE}ℹ${NC} $1"
  23. }
  24. log_success() {
  25. echo -e "${GREEN}✅${NC} $1"
  26. }
  27. log_warning() {
  28. echo -e "${YELLOW}⚠${NC} $1"
  29. }
  30. log_error() {
  31. echo -e "${RED}❌${NC} $1"
  32. }
  33. log_step() {
  34. echo -e "${PURPLE}🔧${NC} $1"
  35. }
  36. # ==================== 检查函数 ====================
  37. check_dependencies() {
  38. log_step "检查依赖工具..."
  39. local missing_tools=()
  40. # 检查必需工具
  41. for tool in ssh curl netstat; do
  42. if ! command -v $tool >/dev/null 2>&1; then
  43. missing_tools+=($tool)
  44. fi
  45. done
  46. if [ ${#missing_tools[@]} -ne 0 ]; then
  47. log_error "缺少必需工具: ${missing_tools[*]}"
  48. log_info "请安装缺少的工具后重试"
  49. exit 1
  50. fi
  51. log_success "所有依赖工具已安装"
  52. }
  53. check_local_proxy() {
  54. log_step "检查本地代理服务..."
  55. # 检查端口是否监听
  56. if netstat -tln 2>/dev/null | grep -q ":$LOCAL_PROXY_PORT "; then
  57. log_info "发现本地端口 $LOCAL_PROXY_PORT 正在监听"
  58. else
  59. log_warning "本地端口 $LOCAL_PROXY_PORT 未在监听"
  60. fi
  61. # 测试代理连接
  62. if curl -s --proxy http://localhost:$LOCAL_PROXY_PORT --connect-timeout 5 http://www.google.com > /dev/null 2>&1; then
  63. log_success "本地代理 (端口 $LOCAL_PROXY_PORT) 工作正常"
  64. return 0
  65. else
  66. log_warning "本地代理不可用,将使用直接连接"
  67. return 1
  68. fi
  69. }
  70. check_remote_connectivity() {
  71. log_step "检查远程主机连接..."
  72. if ssh -o ConnectTimeout=10 -o BatchMode=yes $REMOTE_USER@$REMOTE_HOST "echo 'SSH连接成功'" 2>/dev/null; then
  73. log_success "远程主机 $REMOTE_HOST 连接正常"
  74. return 0
  75. else
  76. log_error "无法连接到远程主机 $REMOTE_HOST"
  77. log_info "请检查网络连接和SSH配置"
  78. return 1
  79. fi
  80. }
  81. # ==================== 主要功能 ====================
  82. setup_ssh_tunnel() {
  83. local proxy_target
  84. if check_local_proxy; then
  85. proxy_target="localhost:$LOCAL_PROXY_PORT"
  86. else
  87. # 如果没有本地代理,使用一个无效的目标让连接失败
  88. log_warning "没有可用的本地代理,GitHub Copilot可能无法正常工作"
  89. proxy_target="127.0.0.1:1" # 故意使用一个无效端口
  90. fi
  91. log_step "建立SSH隧道连接..."
  92. echo -e "${CYAN}📡 端口转发配置:${NC}"
  93. echo " 本地 :$LOCAL_VLLM_PORT -> 远程 :$VLLM_PORT (vLLM 服务)"
  94. echo " 远程 :$REMOTE_FORWARD_PORT -> 本地 :$LOCAL_PROXY_PORT (代理服务)"
  95. echo ""
  96. # SSH 连接参数优化,减少警告
  97. ssh \
  98. -o "ExitOnForwardFailure=yes" \
  99. -o "ServerAliveInterval=60" \
  100. -o "ServerAliveCountMax=3" \
  101. -o "TCPKeepAlive=yes" \
  102. -o "Compression=yes" \
  103. -o "StrictHostKeyChecking=no" \
  104. -o "UserKnownHostsFile=/dev/null" \
  105. -o "LogLevel=ERROR" \
  106. -L $LOCAL_VLLM_PORT:localhost:$VLLM_PORT \
  107. -R $REMOTE_FORWARD_PORT:$proxy_target \
  108. $REMOTE_USER@$REMOTE_HOST \
  109. "$(cat << 'REMOTE_SCRIPT'
  110. #!/bin/bash
  111. # 远程执行脚本
  112. REMOTE_FORWARD_PORT=7281
  113. SHELL_DIR=$HOME/zhch/shell
  114. mkdir -p $SHELL_DIR
  115. # 颜色定义
  116. RED='\033[0;31m'
  117. GREEN='\033[0;32m'
  118. YELLOW='\033[1;33m'
  119. BLUE='\033[0;34m'
  120. PURPLE='\033[0;35m'
  121. CYAN='\033[0;36m'
  122. NC='\033[0m'
  123. log_info() { echo -e "${BLUE}ℹ${NC} $1"; }
  124. log_success() { echo -e "${GREEN}✅${NC} $1"; }
  125. log_warning() { echo -e "${YELLOW}⚠${NC} $1"; }
  126. log_error() { echo -e "${RED}❌${NC} $1"; }
  127. log_step() { echo -e "${PURPLE}🔧${NC} $1"; }
  128. echo -e "${CYAN}🚀 在远程主机上配置 GitHub Copilot 环境${NC}"
  129. echo "=================================================="
  130. # 备份原有代理设置
  131. log_step "备份原有代理设置..."
  132. env | grep -i proxy > $SHELL_DIR/copilot_proxy_backup 2>/dev/null || true
  133. # 显示当前环境
  134. log_info "当前代理环境:"
  135. env | grep -i proxy | sed 's/^/ /' || echo " (无代理设置)"
  136. # 清除现有代理设置
  137. log_step "清除现有代理设置..."
  138. unset http_proxy https_proxy HTTP_PROXY HTTPS_PROXY
  139. unset ftp_proxy FTP_PROXY no_proxy NO_PROXY
  140. # 设置新的代理环境变量
  141. log_step "设置隧道代理环境变量..."
  142. export http_proxy=http://localhost:$REMOTE_FORWARD_PORT
  143. export https_proxy=http://localhost:$REMOTE_FORWARD_PORT
  144. export HTTP_PROXY=http://localhost:$REMOTE_FORWARD_PORT
  145. export HTTPS_PROXY=http://localhost:$REMOTE_FORWARD_PORT
  146. export no_proxy=localhost,127.0.0.1,10.192.72.11,172.16.0.0/12
  147. export NO_PROXY=localhost,127.0.0.1,10.192.72.11,172.16.0.0/12
  148. log_success "代理环境变量已设置"
  149. echo " http_proxy=http://localhost:$REMOTE_FORWARD_PORT"
  150. echo " https_proxy=http://localhost:$REMOTE_FORWARD_PORT"
  151. # 检查端口监听状态
  152. log_step "检查端口转发状态..."
  153. sleep 2 # 等待端口转发建立
  154. 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
  155. log_success "端口 $REMOTE_FORWARD_PORT 正在监听"
  156. else
  157. log_warning "端口 $REMOTE_FORWARD_PORT 未检测到监听状态"
  158. fi
  159. # 测试网络连接
  160. log_step "测试网络连接..."
  161. echo "🧪 连接测试结果:"
  162. # 测试隧道代理
  163. if curl -s --proxy http://localhost:$REMOTE_FORWARD_PORT --connect-timeout 10 http://httpbin.org/ip > /dev/null 2>&1; then
  164. log_success "隧道代理连接正常"
  165. else
  166. log_warning "隧道代理连接失败"
  167. fi
  168. # 测试 GitHub API
  169. if curl -s --connect-timeout 10 https://api.github.com/user > /dev/null 2>&1; then
  170. log_success "GitHub API 可访问"
  171. else
  172. log_error "GitHub API 不可访问"
  173. fi
  174. # 测试 GitHub Copilot 服务
  175. if curl -s --connect-timeout 10 https://copilot-proxy.githubusercontent.com/ > /dev/null 2>&1; then
  176. log_success "GitHub Copilot 服务可访问"
  177. else
  178. log_warning "GitHub Copilot 服务访问可能有问题"
  179. fi
  180. # 显示环境信息
  181. echo ""
  182. echo -e "${CYAN}📊 环境信息摘要${NC}"
  183. echo "=================================================="
  184. echo "🔗 SSH 隧道: 已建立"
  185. echo "🌐 代理端口: localhost:$REMOTE_FORWARD_PORT"
  186. echo "📝 备份文件: $SHELL_DIR/copilot_proxy_backup"
  187. echo "💻 主机名: $(hostname)"
  188. echo "👤 用户: $(whoami)"
  189. echo "📅 时间: $(date)"
  190. # 创建快速测试脚本
  191. cat > $SHELL_DIR/test_copilot_connection.sh << 'TEST_EOF'
  192. #!/bin/bash
  193. echo "🧪 GitHub Copilot 连接测试"
  194. echo "=========================="
  195. # 测试代理连接
  196. if curl -s --connect-timeout 5 https://api.github.com > /dev/null; then
  197. echo "✅ GitHub API: 可访问"
  198. else
  199. echo "❌ GitHub API: 不可访问"
  200. fi
  201. if curl -s --connect-timeout 5 https://copilot-proxy.githubusercontent.com/ > /dev/null; then
  202. echo "✅ Copilot Service: 可访问"
  203. else
  204. echo "❌ Copilot Service: 不可访问"
  205. fi
  206. echo ""
  207. echo "📊 当前代理设置:"
  208. env | grep -i proxy | sort
  209. TEST_EOF
  210. chmod +x $SHELL_DIR/test_copilot_connection.sh
  211. # 创建代理恢复脚本
  212. cat > $SHELL_DIR/restore_proxy.sh << 'RESTORE_EOF'
  213. #!/bin/bash
  214. echo "🔄 恢复原有代理设置..."
  215. if [ -f $SHELL_DIR/copilot_proxy_backup ]; then
  216. source $SHELL_DIR/copilot_proxy_backup
  217. echo "✅ 代理设置已恢复"
  218. echo "📊 当前代理设置:"
  219. env | grep -i proxy | sort
  220. else
  221. echo "❌ 未找到备份文件"
  222. fi
  223. RESTORE_EOF
  224. chmod +x $SHELL_DIR/restore_proxy.sh
  225. echo ""
  226. echo -e "${GREEN}🎉 GitHub Copilot 环境配置完成!${NC}"
  227. echo "=================================================="
  228. echo "📝 使用说明:"
  229. echo " • 保持此 SSH 会话活跃以维持 Copilot 功能"
  230. echo " • 在 VS Code 中正常使用 GitHub Copilot"
  231. echo " • 运行 $SHELL_DIR/test_copilot_connection.sh 测试连接"
  232. echo " • 运行 $SHELL_DIR/restore_proxy.sh 恢复原有代理设置"
  233. echo ""
  234. echo "🔧 调试命令:"
  235. echo " netstat -tln | grep 127.0.0.1:$REMOTE_FORWARD_PORT # 检查端口"
  236. echo " curl -v https://api.github.com # 测试 GitHub API"
  237. echo " env | grep -i proxy # 查看代理设置"
  238. echo ""
  239. # 设置退出时恢复代理的陷阱
  240. trap 'echo "🔄 会话结束,恢复代理设置..."; source $SHELL_DIR/copilot_proxy_backup 2>/dev/null || true; echo "✅ 代理设置已恢复"' EXIT
  241. log_info "保持 SSH 会话活跃中... (按 Ctrl+C 退出)"
  242. # 保持会话活跃并定期显示状态
  243. while true; do
  244. sleep 60
  245. echo "📡 $(date '+%H:%M:%S'): SSH 隧道活跃,Copilot 代理运行中"
  246. # 检查代理连接状态
  247. if netstat -an 2>/dev/null | grep -q "127.0.0.1:$REMOTE_FORWARD_PORT.*ESTABLISHED"; then
  248. echo "🔥 检测到活跃的代理连接"
  249. fi
  250. done
  251. 'REMOTE_SCRIPT'
  252. )"
  253. }
  254. # ==================== 清理函数 ====================
  255. cleanup() {
  256. log_info "正在清理..."
  257. # 这里可以添加清理逻辑
  258. }
  259. # ==================== 主程序 ====================
  260. main() {
  261. echo -e "${CYAN}🚀 GitHub Copilot 远程开发连接设置${NC}"
  262. echo "=================================================="
  263. echo "📅 $(date)"
  264. echo "🖥️ 本机: $(hostname)"
  265. echo "🌐 远程: $REMOTE_HOST"
  266. echo ""
  267. # 设置退出陷阱
  268. trap cleanup EXIT
  269. # 执行检查
  270. check_dependencies
  271. check_remote_connectivity || exit 1
  272. # 设置隧道
  273. setup_ssh_tunnel
  274. }
  275. # ==================== 脚本入口 ====================
  276. if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
  277. main "$@"
  278. fi