当前位置: 首页 > news >正文

macOS 终端智能代理检测

🧠 终端智能代理检测:自动判断是否需要设置代理访问 GitHub

在开发中,使用 GitHub 是非常常见的需求。但有时候我们会发现某些命令失败、插件无法更新,例如:

fatal: unable to access 'https://github.com/ohmyzsh/ohmyzsh.git/':
Failed to connect to github.com port 443

为了让终端具备自动检测 GitHub 可达性并在必要时自动设置代理,我编写了一个轻量级的 智能代理检测脚本,可以直接集成进 .zshrc 或单独保存为脚本文件使用。


✋ 如果不想自动设置,也可以手动配置代理

当你明确知道当前网络环境需要通过代理访问 GitHub,可以手动在终端中设置以下环境变量:

export https_proxy=http://127.0.0.1:7890
export http_proxy=http://127.0.0.1:7890
export all_proxy=socks5h://127.0.0.1:7891

其中,端口号请根据你所使用的代理软件实际情况进行调整,常见配置包括:

  • 7890:Clash 的 HTTP/HTTPS 代理端口
  • 7891:Clash 的 SOCKS5 代理端口
  • 1087:macOS 系统代理默认端口(如 Surge)

🕐 临时使用代理(推荐用于单条命令)

如果只是临时需要用代理执行一条命令,例如更新 Oh My Zsh,可以这样写:

export https_proxy=http://127.0.0.1:7890
omz update

执行完后关闭终端或 unset 即可恢复默认状态,无需修改 .zshrc


✅ 可选恢复命令:

如果你想清除已设置的代理变量,可以使用:

unset http_proxy https_proxy all_proxy

🎯 脚本功能

  • 自动检测是否能访问 https://github.com
  • 若不能访问,自动设置本地代理地址(例如:http://127.0.0.1:7897
  • 设置代理后再次验证是否连通
  • 命令行输出清晰、颜色友好

🚀 两种使用方式

✅ 方式一:将脚本嵌入 .zshrc 开头(推荐个人使用)

打开 .zshrc 文件:

nano ~/.zshrc

将以下代码粘贴到最上方(优先执行):

# 智能代理配置函数(使用 ANSI 颜色控制)
function setup_proxy_smart() {local test_url="https://github.com"local proxy_addr="http://127.0.0.1:7897"local timeout=3echo "🔍 Checking internet access for $test_url..."if [[ "$(curl --max-time $timeout -s -o /dev/null -w "%{http_code}" "$test_url")" == "200" ]]; thenecho "\033[32m✅ Direct connection available. Proxy not needed.\033[0m"unset http_proxy https_proxy all_proxyelseecho "\033[33m🌐 No direct connection. Setting proxy to \033[36m$proxy_addr\033[0m"export http_proxy=$proxy_addrexport https_proxy=$proxy_addrexport all_proxy=$proxy_addrecho "🔁 Retesting access via proxy..."if [[ "$(curl --max-time $timeout -s -o /dev/null -w "%{http_code}" "$test_url")" == "200" ]]; thenecho "\033[32m✅ Proxy connection successful.\033[0m"elseecho "\033[31m❌ Proxy connection failed. Please check your proxy client.\033[0m"fifi
}# 每次终端启动时自动执行
setup_proxy_smart

保存后执行:

source ~/.zshrc

🛠️ 方式二:单独存为 proxy_check.sh 脚本文件(适合复用)

① 新建文件:
mkdir -p ~/scripts
nano ~/scripts/proxy_check.sh
② 粘贴同样的脚本代码(见上方)
③ 添加执行权限:
chmod +x ~/scripts/proxy_check.sh
④ 在 .zshrc 中引用:
source ~/scripts/proxy_check.sh

🧠 为什么 all_proxy 两种写法不同?

场景类型设置方式原因/说明
脚本里HTTP 代理export all_proxy=$proxy_addrproxy_addrhttp://127.0.0.1:7897 类型
手动设置 SOCKS5SOCKS5 代理export all_proxy=socks5h://...明确使用 socks5 协议(通常端口 7891)

✅ 最佳实践建议:

  • 如果你确定使用的是 HTTP 代理端口(如 Clash 面板显示 7890、7897),就用:

    export http_proxy=http://127.0.0.1:7890
    export https_proxy=http://127.0.0.1:7890
    export all_proxy=http://127.0.0.1:7890
    
  • 如果你想走 SOCKS5 且保证远程解析 DNS,建议用:

    export all_proxy=socks5h://127.0.0.1:7891
    

🧪 实用测试技巧:

你可以切换这两种配置后,用 curl 分别测试:

curl https://ipinfo.io/ip
  • 使用 HTTP 代理时:应走 7890
  • 使用 SOCKS5 时:应走 7891(并远程解析)

🧩 实际踩坑记录与解决

在配置的过程中,我也遇到了一些问题,以下是过程记录与解决方法,希望对你有帮助。


❗ 问题一:颜色输出不生效

在这里插入图片描述

初期使用 %F{color} 的语法输出颜色,但发现终端中无效果,颜色代码直接打印出来了。

✅ 解决办法:

使用更通用的 ANSI 转义序列 来实现颜色:

echo "\033[33mThis is yellow\033[0m"

例如:

  • \033[32m → 绿色
  • \033[33m → 黄色
  • \033[36m → 青色
  • \033[31m → 红色
  • \033[0m → 重置颜色

❗ 问题二:curl 访问明明成功却判断为失败

在这里插入图片描述

初始版本使用:

curl --silent --head ...

在某些代理工具(如 Clash)下,HEAD 请求可能被阻断或返回不规范,导致误判失败。

✅ 解决办法:

使用 -o /dev/null -w "%{http_code}" 明确获取状态码:

curl -s -o /dev/null -w "%{http_code}" https://github.com

确保判断依据准确。


❗ 问题三:脚本执行太晚,代理未及时生效

最初放在 .zshrc 末尾调用 source ~/scripts/proxy_check.sh,但有些工具加载在前,造成代理未及时生效。

✅ 解决办法:

将脚本调用(或嵌入)放在 .zshrc 最顶端,确保代理设置先执行。


✅ 输出示例

✔️ 可直连时:

🔍 Checking internet access for https://github.com...
✅ Direct connection available. Proxy not needed.

🌐 需设置代理时:

🔍 Checking internet access for https://github.com...
🌐 No direct connection. Setting proxy to http://127.0.0.1:7897
🔁 Retesting access via proxy...
✅ Proxy connection successful.

❌ 代理设置后仍失败:

🔍 Checking internet access for https://github.com...
🌐 No direct connection. Setting proxy to http://127.0.0.1:7897
🔁 Retesting access via proxy...
❌ Proxy connection failed. Please check your proxy client.

在这里插入图片描述


📌 总结

通过这一简单的脚本,你可以实现:

  • 在终端环境下自动判断是否需要设置代理
  • 避免每次手动设置代理的繁琐步骤
  • 保持 GitHub 访问畅通,提升命令行体验

这一方法适用于 Zsh 用户,也可以轻松迁移到 Bash 或其他 shell 中使用。如需支持多端口轮询、日志记录等高级功能,也可以在此基础上进一步扩展。

http://www.xdnf.cn/news/954739.html

相关文章:

  • Uncaught ReferenceError: process is not defined
  • EU 2023/1669与EU 2023/1670 的区别
  • 前端antd,后端fastapi,实现运行系统指令,并打印运行日志
  • 如何使用CodeRider插件在IDEA中生成代码
  • 6.9-字典序的第K小数字
  • 【记录坑点问题】IDEA运行:maven-resources-production:XX: OOM: Java heap space
  • 【标准解析】商用车CAN网络通信标准(J1939)
  • 【案例篇】为什么设置了 ulimit 但 nofile 限制仍不生效?
  • Cursor 使用分享
  • Java网络编程协议全面解析
  • SQL进阶之旅 Day 22:批处理与游标优化
  • OSPF域内路由
  • 检查项目中的依赖是否有更新——npm outdated
  • Linux基础开发工具——vim工具
  • 2021-03-15 iview一些问题
  • Map相关知识
  • 中小企业碳账本管理指南
  • SpringAI实战:ChatModel智能对话全解
  • 对比一下blender快捷键:p和alt+p
  • 基于Flask前后端分离智慧安防小区系统
  • 定位触发DMA2_Stream1_IRQHandler中断的具体原因简述
  • Spring类型转换融入IOC生命周期
  • 字符串哈希+KMP
  • 五.建造者模式
  • SQLAlchemy的子查询subquery()
  • 日本本社企业直招|Java /cobol/C#/PM/PL/Salesforce/AWS/SAP 等,正社员/個人事業主,高度人才+20 分
  • Spring状态机
  • 苍穹外卖-day02
  • 机器人模仿学习调研(二)
  • MySQL 8.0 OCP 英文题库解析(十三)