proxy.sh 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262
  1. #!/bin/bash
  2. # WSL 代理管理脚本
  3. # 用于快速开启和关闭代理设置
  4. # 获取 Windows 主机 IP
  5. get_windows_ip() {
  6. local wsl_ip=$(ip addr show eth1 | grep 'inet ' | awk '{print $2}' | cut -d'/' -f1 2>/dev/null)
  7. if [ -z "$wsl_ip" ]; then
  8. wsl_ip=$(hostname -I | awk '{print $1}')
  9. fi
  10. # WSL2 共享 IP 的情况下,按优先级尝试不同地址
  11. local test_ips=("127.0.0.1" "$wsl_ip")
  12. for ip in "${test_ips[@]}"; do
  13. if timeout 3 bash -c "</dev/tcp/$ip/7897" 2>/dev/null; then
  14. echo "$ip"
  15. return
  16. fi
  17. done
  18. # 如果都失败了,返回 localhost
  19. echo "127.0.0.1"
  20. }
  21. # Clash 端口配置
  22. HTTP_PORT="7897"
  23. SOCKS_PORT="7897"
  24. # 代理配置函数
  25. set_proxy() {
  26. local windows_ip=$(get_windows_ip)
  27. echo "正在设置代理..."
  28. echo "Windows IP: $windows_ip"
  29. # 设置 HTTP/HTTPS 代理
  30. export http_proxy="http://${windows_ip}:${HTTP_PORT}"
  31. export https_proxy="http://${windows_ip}:${HTTP_PORT}"
  32. export HTTP_PROXY="http://${windows_ip}:${HTTP_PORT}"
  33. export HTTPS_PROXY="http://${windows_ip}:${HTTP_PORT}"
  34. # 设置 SOCKS 代理
  35. export all_proxy="socks5://${windows_ip}:${SOCKS_PORT}"
  36. export ALL_PROXY="socks5://${windows_ip}:${SOCKS_PORT}"
  37. # 设置不走代理的地址
  38. export no_proxy="localhost,127.0.0.1,::1,*.local"
  39. export NO_PROXY="localhost,127.0.0.1,::1,*.local"
  40. # 写入到当前 shell 配置文件
  41. echo "# Proxy settings - Auto generated" >> ~/.bashrc
  42. echo "export http_proxy=\"http://${windows_ip}:${HTTP_PORT}\"" >> ~/.bashrc
  43. echo "export https_proxy=\"http://${windows_ip}:${HTTP_PORT}\"" >> ~/.bashrc
  44. echo "export HTTP_PROXY=\"http://${windows_ip}:${HTTP_PORT}\"" >> ~/.bashrc
  45. echo "export HTTPS_PROXY=\"http://${windows_ip}:${HTTP_PORT}\"" >> ~/.bashrc
  46. echo "export all_proxy=\"socks5://${windows_ip}:${SOCKS_PORT}\"" >> ~/.bashrc
  47. echo "export ALL_PROXY=\"socks5://${windows_ip}:${SOCKS_PORT}\"" >> ~/.bashrc
  48. echo "export no_proxy=\"localhost,127.0.0.1,::1,*.local\"" >> ~/.bashrc
  49. echo "export NO_PROXY=\"localhost,127.0.0.1,::1,*.local\"" >> ~/.bashrc
  50. echo "✅ 代理已开启"
  51. echo "HTTP/HTTPS 代理: http://${windows_ip}:${HTTP_PORT}"
  52. echo "SOCKS 代理: socks5://${windows_ip}:${SOCKS_PORT}"
  53. }
  54. # 取消代理配置函数
  55. unset_proxy() {
  56. echo "正在关闭代理..."
  57. # 取消当前会话的代理环境变量
  58. unset http_proxy
  59. unset https_proxy
  60. unset HTTP_PROXY
  61. unset HTTPS_PROXY
  62. unset all_proxy
  63. unset ALL_PROXY
  64. unset no_proxy
  65. unset NO_PROXY
  66. # 从 .bashrc 中移除代理配置
  67. sed -i '/# Proxy settings - Auto generated/,+7d' ~/.bashrc
  68. echo "✅ 代理已关闭"
  69. }
  70. # 检查代理状态
  71. check_proxy() {
  72. echo "当前代理状态:"
  73. if [ -n "$http_proxy" ]; then
  74. echo "✅ HTTP 代理: $http_proxy"
  75. else
  76. echo "❌ HTTP 代理: 未设置"
  77. fi
  78. if [ -n "$all_proxy" ]; then
  79. echo "✅ SOCKS 代理: $all_proxy"
  80. else
  81. echo "❌ SOCKS 代理: 未设置"
  82. fi
  83. echo ""
  84. echo "测试连接..."
  85. if curl -s --connect-timeout 5 --max-time 10 http://www.google.com > /dev/null 2>&1; then
  86. echo "✅ 网络连接正常"
  87. else
  88. echo "❌ 网络连接失败"
  89. fi
  90. }
  91. # 测试代理连接
  92. test_proxy() {
  93. local windows_ip=$(get_windows_ip)
  94. echo "测试代理连接..."
  95. echo "使用地址: $windows_ip:${HTTP_PORT}"
  96. # 测试 HTTP 代理
  97. if curl -s --connect-timeout 5 --proxy "http://${windows_ip}:${HTTP_PORT}" http://www.google.com > /dev/null 2>&1; then
  98. echo "✅ HTTP 代理连接正常"
  99. else
  100. echo "❌ HTTP 代理连接失败"
  101. fi
  102. # 测试 SOCKS 代理
  103. if curl -s --connect-timeout 5 --socks5 "${windows_ip}:${SOCKS_PORT}" http://www.google.com > /dev/null 2>&1; then
  104. echo "✅ SOCKS 代理连接正常"
  105. else
  106. echo "❌ SOCKS 代理连接失败"
  107. fi
  108. }
  109. # Git 代理设置
  110. set_git_proxy() {
  111. local windows_ip=$(get_windows_ip)
  112. echo "设置 Git 代理..."
  113. git config --global http.proxy "http://${windows_ip}:${HTTP_PORT}"
  114. git config --global https.proxy "http://${windows_ip}:${HTTP_PORT}"
  115. echo "✅ Git 代理已设置为: http://${windows_ip}:${HTTP_PORT}"
  116. }
  117. # 取消 Git 代理
  118. unset_git_proxy() {
  119. echo "取消 Git 代理..."
  120. git config --global --unset http.proxy
  121. git config --global --unset https.proxy
  122. echo "✅ Git 代理已取消"
  123. }
  124. # 显示帮助信息
  125. show_help() {
  126. echo "WSL 代理管理脚本"
  127. echo ""
  128. echo "用法: $0 [选项]"
  129. echo ""
  130. echo "选项:"
  131. echo " on 开启代理"
  132. echo " off 关闭代理"
  133. echo " status 检查代理状态"
  134. echo " test 测试代理连接"
  135. echo " git-on 开启 Git 代理"
  136. echo " git-off 关闭 Git 代理"
  137. echo " help 显示此帮助信息"
  138. echo ""
  139. echo "注意: 请确保 Windows 上的 Clash 正在运行"
  140. echo "默认端口: HTTP=${HTTP_PORT}, SOCKS=${SOCKS_PORT}"
  141. }
  142. # 主菜单
  143. show_menu() {
  144. echo "=================================="
  145. echo " WSL 代理管理工具"
  146. echo "=================================="
  147. echo "1. 开启代理"
  148. echo "2. 关闭代理"
  149. echo "3. 检查代理状态"
  150. echo "4. 测试代理连接"
  151. echo "5. 开启 Git 代理"
  152. echo "6. 关闭 Git 代理"
  153. echo "7. 退出"
  154. echo "=================================="
  155. echo -n "请选择操作 (1-7): "
  156. }
  157. # 主程序逻辑
  158. main() {
  159. case "$1" in
  160. "on")
  161. set_proxy
  162. ;;
  163. "off")
  164. unset_proxy
  165. ;;
  166. "status")
  167. check_proxy
  168. ;;
  169. "test")
  170. test_proxy
  171. ;;
  172. "git-on")
  173. set_git_proxy
  174. ;;
  175. "git-off")
  176. unset_git_proxy
  177. ;;
  178. "help")
  179. show_help
  180. ;;
  181. "")
  182. # 交互式菜单
  183. while true; do
  184. show_menu
  185. read choice
  186. echo ""
  187. case $choice in
  188. 1)
  189. set_proxy
  190. ;;
  191. 2)
  192. unset_proxy
  193. ;;
  194. 3)
  195. check_proxy
  196. ;;
  197. 4)
  198. test_proxy
  199. ;;
  200. 5)
  201. set_git_proxy
  202. ;;
  203. 6)
  204. unset_git_proxy
  205. ;;
  206. 7)
  207. echo "再见!"
  208. break
  209. ;;
  210. *)
  211. echo "❌ 无效选择,请重新输入"
  212. ;;
  213. esac
  214. echo ""
  215. echo "按任意键继续..."
  216. read -n 1
  217. clear
  218. done
  219. ;;
  220. *)
  221. echo "❌ 无效参数: $1"
  222. show_help
  223. ;;
  224. esac
  225. }
  226. # 运行主程序
  227. main "$@"