MacOS设置终端代理
前言
国内的开发者或多或少都会因为网络而烦恼,因为一些特殊原因有时候网络不好的时候需要使用代理才能完成对应的操作。原来我一直都是使用斐讯路由器然后刷了梅林的固件,直接在路由器层面设置转发代理,把一些国内网络不好的网站都走代理,这样的好处就是不用每台设备都设置ssr。
后来工作了,就没这么方便了,但是工作设备也比较固定嘛,开一下ssr也不费事。后来我发现一个怪事,同样是一个git地址,chrome访问正常可以zip下载,但是在终端里面一直503。后来查询资料才了解到,原来ssr的代理没有办法在终端生效,这样很多东西都非常麻烦,更新on myzsh看运气,在homebrew下载东西基本都挂,git克隆看天气,docer下载镜像等半天,使用国内各种为爱发电镜像源也是参差不齐,怎么用怎么不爽,非常影响开发。于是研究了一下,在这这记录下来。
查看是否生效
因为后面会用到,所以提前说一下,因为要确认是否代理成功,我们可以使用curl这个命令,然后去获取一些公益检测ip的网站,curl后网站会返回你访问它的这个公网ip,从而可以检测你是否代理成功。下面提供两个,因为有时候网站会挂掉(毕竟为爱发电网站)
curl cip.cc
curl ip.sb

没有代理成功(已打码)
为什么终端不会走代理
可以确定的是在mac下(其实win也是不会)使用ssr代理后不管是开全局还是按照规则在终端都不会生效,但是关于原因众说纷纭,大家都比较认可的理由是ssr代理类软件默认是代理socket5,而终端是http。真的是这样吗,我们来看看
我们设置规则代理,然后检查一下规则里面代理的协议,可以看到确实是socket5

可以看到确实代理的是socket5

此时自然是终端没代理成功
但是当我设置成全局代理,并且打开ssr的http代理设置以后,其实终端里面也不会成功,并没有什么*用


那到底是什么理由呢,其实我也不知道,但是我更同意stackExchange一位大佬给出的解释,他说mac的shell和系统设置是两套规则,shell是先于macOS诞生,在系统设置里面的设置代理在终端其实是不会生效的,系统也不会帮你去按照终端规则去设置一下。如果想要终端代理生效,需要单独对终端进行操作。

大佬的解释
我为什么会比较认同呢,是因为ssr本身其实就是开了一个本地的代理服务,你给它这个固定端口发过去的请求它才会进行代理转发然后返回,系统设置确实设置了网络的转发到这个端口,但是可能这个设置不会对终端生效,如果需要终端生效需要单独对终端设置,把终端里面的网络请求都转发到ssr启动的这个端口上。
设置终端走代理
终端设置完全真正的代理需要配合插件,比较麻烦,而且...主要是我自己设置代理都是一些临时性的需求,所以这里介绍一个简单的代理方法。
主流shell中都有好几个代理的系统变量,大多数的应用都遵循它,这里简单说三个,这里使用了export的命令,我在另外一篇文章里面说过,大家可以去翻一下,这个命令在当前的shell窗口中设置一个系统环境变量,这个变量只在当前shell窗口中生效,关闭再重新打开一个shell窗口以后这个系统环境将失效,如果想要一直代理可以把这个环境变量写入到启动文件中(例如~/.zshrc),启动文件介绍我也写过一篇文章,大家可以翻一下。
# 代理http
export http_proxy="socks5://127.0.0.1:1080"
# 代理https
export https_proxy="socks5://127.0.0.1:1080"
# 代理所有协议,其中包括ftp等
export ALL_PROXY="socks5://127.0.0.1:1080"
其中的原因大家可以浏览参考中的2和3,常见的软件命令都会使用这个系统环境变量,如果为空则直连如果有值则会转发到这个变量的代理上。其中git还提供应用变量设置,设置它可以单纯的让git每次都走你设置的代理,并且每次打开都会生效,因为这是git的软件全局设置
# 设置如下
git config --global http.proxy 'socks5://127.0.0.1:1080'
git config --global https.proxy 'socks5://127.0.0.1:1080'
# 取消如下
git unset http_proxy
git unset https_proxy
设置成功后,再进行检测,已经代理到线路上面的ip、

ladder就是上面那一堆命令的简化
结合alias做到灵活代理
如果你看过我原来写过的介绍linux快捷指令的文章,你可以结合其中的alias来完成更加灵活的代理,因为考虑到我们的使用场景,除了前面git可以单独配置应用的全局以后,我们好像在终端中不是那么需要始终的代理设置,确实代理的带宽和延迟上都没有直连好,但是有时候需要的工具或者框架服务器又在国外,不得不开代理。
虽然上面的命令可以解决这个问题,但是我很懒,然后每次执行上面一大堆命令,非常麻烦。使用alias设置一个快捷命令,然后每次输入就可以开启,用完关闭窗口下次再进来这个代理失效,只有需要的时候输入一下,不用输入一大串(往往这种命令,你都要打开记事本,然后复制粘贴)
alias ladder='export http_proxy=http://127.0.0.1:1087'

我这样配置已经够用了
参考
MacOS设置终端代理的更多相关文章
- 如何为MacOS X终端设置代理
http://codelife.me/blog/2012/09/02/how-to-set-proxy-for-terminal/ 本文介绍如何在MacOS X终端里使用代理访问网络,虽然只在Moun ...
- MacOS代理设置(桌面应用代理设置&Terminal代理设置)
MacOS代理分为桌面应用代理设置&Terminal代理设置,使用代理软件默认只会开启桌面应用代理,Terminal代理需要单独配置 桌面应用代理设置 Terminal查看桌面应用代理设置 ...
- 主机设置ss代理,虚拟机共享代理
代理的原理: 关于代理的具体的书面定义你百度谷歌可以知道.这里,我想简单通过一个例子,说明代理的原理: 假如,你在北京,但你女朋友在广州,你有东西要给你的女朋友,但是正好你这几天公司有事,所以你不能去 ...
- mac终端代理
终端代理,需要首先有自己的梯子,以下方式需要配合shadowsocks 终端FQ有很多好处,对于一个程序员来说,墙外有很多优秀的代码,走终端可以方便下载和使用- (编程思想强调复用,软件开发避免重复造 ...
- Linux下实现自动设置SSH代理
SSH的巨大价值体现在能够配置为代理服务器上.不像在Windows下每次还需要手动登录设置,Linux有很好的工具链能够实现自动设置SSH代理,就是expect和ssh的联合使用,再加上proxych ...
- 中小研发团队架构实践之生产环境诊断工具WinDbg 三分钟学会.NET微服务之Polly 使用.Net Core+IView+Vue集成上传图片功能 Fiddler原理~知多少? ABP框架(asp.net core 2.X+Vue)模板项目学习之路(一) C#程序中设置全局代理(Global Proxy) WCF 4.0 使用说明 如何在IIS上发布,并能正常访问
中小研发团队架构实践之生产环境诊断工具WinDbg 生产环境偶尔会出现一些异常问题,WinDbg或GDB是解决此类问题的利器.调试工具WinDbg如同医生的听诊器,是系统生病时做问题诊断的逆向分析工具 ...
- ubuntu下终端代理方法
起因 正常使用shadowsocks后只能在浏览器中访问google,而终端中却无法使用. 解决方法 ProxyChains是一个终端代理方案,使用比较简单. 在源里有这个软件,直接安装 sudo ...
- linux和mac 终端代理
概述 今天发现本地服务不能翻墙,查找了下原因,是因为小飞机在 linux 系统上即使开了全局代理还是不能代理终端的,需要开启终端代理才行.方法我记录下来,供以后开发时参考,相信对其他人也有用. 注意: ...
- termios, tcgetattr, tcsetattr, tcsendbreak, tcdrain, tcflush, tcflow, cfmakeraw, cfgetospeed, cfgetispeed, cfsetispeed, cfsetospeed - 获取和设置终端属性,行控制,获取和设置波特率
SYNOPSIS 总览 #include <termios.h> #include <unistd.h> int tcgetattr(int fd, struct termio ...
随机推荐
- R语言与医学统计图形-【13】ggplot2几何对象之盒形图
ggplot2绘图系统--几何对象之盒形图 参数: geom_boxplot(mapping = , #lower,middle,upper,x,ymax,ymin必须(有默认) #alpha/col ...
- Xwiki——实现
基于CentOS6.9 yum install java wget http://download.forge.ow2.org/xwiki/xwiki-enterprise-installer-gen ...
- 【题解】洛谷P1001 A+B Problem
第一篇博客,献给2020年的残夏. 静听8月的热情与安宁,在竞赛中的时光如白驹过隙. 也不惧未知的风雨,努力向着既往的通途. 题目地址 https://www.luogu.com.cn/problem ...
- c#年份筛选
年份: <script type="text/javascript" src="http://www.shicishu.com/down/WdatePicker.j ...
- List 去重的 6 种方法,这个方法最完美!
在日常的业务开发中,偶尔会遇到需要将 List 集合中的重复数据去除掉的场景.这个时候可能有同学会问:为什么不直接使用 Set 或者 LinkedHashSet 呢?这样不就没有重复数据的问题了嘛? ...
- 巩固javaweb第八天
巩固内容: HTML 段落 HTML 可以将文档分割为若干段落. HTML 段落 段落是通过 <p> 标签定义的. 实例 <p>这是一个段落 </p> <p& ...
- day27 网络编程
1.OSI七层协议 1.七层划分为:应用层,表示层.会话层.传输层.网络层.数据链路层.物理层 2.五层划分:应用层.传输层.网络层.数据链路层.物理层 应用层: 表示层: 会话层: 传输层:四层交换 ...
- Scala(七)【异常处理】
目录 一.try-catch-finally 二.Try(表达式).getOrElse(异常出现返回的默认值) 三. 直接抛出异常 一.try-catch-finally 使用场景:在获取外部链接的时 ...
- 零基础学习java------day1------计算机基础以及java的一些简单了解
一. java的简单了解 Java是一门面向对象编程语言,不仅吸收了C++的各种优点,还摒弃了C++里难以理解的多继承.指针等概念,因此Java语言具有功能强大和简单易用两个特征.Java语言作为静态 ...
- Assertion failure in -[UISectionRowData refreshWithSection:tableView:tableViewRowData:], /Source
1. *** Assertion failure in -[UISectionRowData refreshWithSection:tableView:tableViewRowData:], /Sou ...