Mac OS X巧用AppleScript 制作网络位置切换自动化脚本(自动配置PAC 文件)

事情是这样的,自带的Macbook Air 在实习单位入的是办公网,办公网走自动代理(需要配置PAC 文件)。同时回来宿舍或家里需要民用的宽带网络。切换的时候出现了问题。

对于网络配置,Mac OS X 本身提供了“网络位置”这个功能供不同的网络模式需求配置。比如我在宿舍设置了个“Dorm”的网络位置,里面自定义了DNS;又设置了“Libary”这个网络位置在图书馆上China-net 热点。来到公司,接入办公网自然又有“Office” 这个位置,且要高级设置“自动代理配置”填入PAC 文件路径。

问题说明

按理说网络位置分别设置具体参数互不干扰,但因为我在宿舍/家里网络下需要开Shad**sock 客户端(你懂的),一打开SS 就会污染全局的自动代理配置的PAC 文件路径。如此每次重新接入办公网就得重新设置PAC 文件路径——再次走“打开网络偏好设置-高级-代理-自动代理配置填入PAC 文件路径”的流程,多次下来嫌麻烦了。

解决问题

今天下决心解决问题,想到了可以采用Shell 将切换网络位置、填写PAC路径、打开/关闭Shad**sock 客户端APP 的几个操作做成自动化脚本。不断变换英文关键词在Google 搜索,后来借助老外的代码,借助Shell + AppleScript 代码将脚本保存为APP,这样每次需要切换网络的时候打开该APP即可。

解决方案

打开Launchpad 的其它-脚本编辑器,编写AppleScript 代码,Shell 代码请自行用编辑器编写,然后保存的时候保存为“应用程序”:

1)切换网络位置为Dorm(宿舍网络),同时打开Shad**socks 客户端(为科学上网)。以下代码保存为一个“应用程序”。

tell application "System Events" tell network preferences do shell script "scselect 'Dorm'" do shell script "sudo networksetup -setairportpower AirPort on" user name "用户名" password "密码" with administrator privileges do shell script "open /Applications/Shad**socksX.app" user name “用户名" password "密码" with administrator privileges end tell end tell

上面的代码隐藏了部分内容,比如用户名密码这些需要自定义,网络位置也需要根据实际修改(网络位置需要为英文)。

2.1)切入办公网:关闭Sha***socks 客户端(因为办公网自带科学上网),切换网络位置为Office(办公网),配置自动代理配置PAC文件。以下代码保存为一个“应用程序”。

tell application “Shad**socksX" quit end tell tell application "System Events" tell network preferences do shell script "scselect 'Office'" do shell script "sudo networksetup -setairportpower AirPort on" user name “用户名" password "密码" with administrator privileges do shell script "/Users/name/documents/setpac.sh" user name “用户名" password "密码" with administrator privileges end tell end tell

2.2)setpac.sh 代码如下,需要放入相对应的位置,autoProxyURL 参数请设置为自己的:

#!/bin/sh #################################################################################################### # # More information: https://macmule.com/2014/12/07/how-to-change-the-automatic-proxy-configuration-url-in-system-preferences-via-a-script/ # # GitRepo: https://github.com/macmule/setAutomaticProxyConfigurationURL # # License: http://macmule.com/license/ # ####################################################################################################   # HARDCODED VALUES ARE SET HERE autoProxyURL=“PAC 文件路径"   # CHECK TO SEE IF A VALUE WAS PASSED FOR $4, AND IF SO, ASSIGN IT if [ "$4" != "" ] && [ "$autoProxyURL" == "" ]; then autoProxyURL=$4 fi # Detects all network hardware & creates services for all installed network hardware /usr/sbin/networksetup -detectnewhardware IFS=$'\n' #Loops through the list of network services for i in $(networksetup -listallnetworkservices | tail +2 ); do # Get a list of all services beginning 'Ether' 'Air' or 'VPN' or 'Wi-Fi' # If your service names are different to the below, you'll need to change the criteria if [[ "$i" =~ 'Ether' ]] || [[ "$i" =~ 'Air' ]] || [[ "$i" =~ 'VPN' ]] || [[ "$i" =~ 'Wi-Fi' ]] ; then autoProxyURLLocal=`/usr/sbin/networksetup -getautoproxyurl "$i" | head -1 | cut -c 6-` # Echo's the name of any matching services & the autoproxyURL's set echo "$i Proxy set to $autoProxyURLLocal" # If the value returned of $autoProxyURLLocal does not match the value of $autoProxyURL for the interface $i, change it. if [[ $autoProxyURLLocal != $autoProxyURL ]]; then /usr/sbin/networksetup -setautoproxyurl $i $autoProxyURL echo "Set auto proxy for $i to $autoProxyURL" fi fi # Enable auto proxy once set /usr/sbin/networksetup -setautoproxystate "$i" on echo "Turned on auto proxy for $i" done unset IFS echo "Auto proxy present, correct & enabled for all targeted interfaces"

以上涉及到的代码备份一份到了Gist 那里,地址见此。代码就不解释了哈,有需要请自行研究。

这样,每次需要切换网络位置的时候就自动走流程,省却了自己一步步操作,真正“一键”完成!

参考资料:

https://macmule.com/2014/12/07/how-to-change-the-automatic-proxy-configuration-url-in-system-preferences-via-a-script/

http://www.cyberciti.biz/faq/mac-osx-applescript-run-shell-script/

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Kubernetes

Kubernetes ReplicationController源码分析

虽然在Kubernetes v1.2中,Kubernetes推出了Deployments特性,Deployment通过创建ReplicaSet来管理Pod,R...

7168
来自专栏游戏杂谈

xcode中嵌入framework(接入快用最新SDK遇到的问题)

但xcode设置中并没有找到Embed Frameworks这个选项,使用以下方式添加

1244
来自专栏杨建荣的学习笔记

一天内碰到的3个rac节点问题 (r6笔记第36天)

说到问题,真是层出不穷,自己也算搭建了也不少的rac环境的,但是在本地试验的时候总是会碰到一些问题,昨晚铲掉旧环境,搭建了两遍rac环境,终于在凌晨搭建好了环境...

3457
来自专栏乐沙弥的世界

Linux script 命令记录(数据库)操作步骤

    对DBA而言,经常碰到升级数据库或是apply patch,以及有些时候需要运行大量的脚本。对于这些操作我们希望现在在屏幕同时又输出的文件以备后续查询过...

1364
来自专栏黑泽君的专栏

day54_BOS项目_06

第一步:根据提供的 业务受理.pdm 文件生成建表文件 bos_qp.sql 第二步:由于业务受理.pdm 文件中有伪表,所以我们需要修改生成的建表文件,修改如...

942
来自专栏FreeBuf

远程RPC溢出EXP编写实战之MS06-040

0x01 前言 MS06-040算是个比较老的洞了,在当年影响十分之广,基本上Microsoft大部分操作系统都受到了影响,威力不亚于17年爆出的”永恒之蓝”漏...

28910
来自专栏GopherCoder

『阅读源代码的姿势:以 go-restful 为例』

5633
来自专栏ml

unbuntu系统( PC机 )中安装360wifi步骤

少说废话,每一步都经过验证:   1.  首先查看一下当前使用的linux版本: gxjun@gxjun:~$ uname -r 4.8.0-59-generi...

3483
来自专栏Kubernetes

深度剖析Kubernetes动态准入控制之Initializers

Author: xidianwangtao@gmail.com Admission Controll的最佳配置 配置过kube-apiserver的同学一...

48611
来自专栏coding...

iOS开发实战-NetworkExtension食用教程写在前面项目介绍项目准备我不是广告结语

由于未知原因苹果在mac OS 10.12中删除了这个文件,因此我们需要从10.11系统中提取或下载--百度网盘 安装完毕后,在新增build target中...

1.2K2

扫码关注云+社区

领取腾讯云代金券