Mac 重启后代理失效导致浏览器无法访问
相信有些朋友和我一样,使用 Mac 时直接关机导致代理没有关闭
重启之后,访问浏览器直接不通。可以参考如下, 二选其一使用
系统设置
ini
设置 > WIFI > 连接的 WIFI > 代理

程序设置

- 直接使用,不编译
shell
go run . down # 关闭
go run . up # 开启
- 编译后使用
shell
go build -o proxy-mac .
go
package main
import (
"flag"
"fmt"
"os"
"os/exec"
"strings"
)
const (
defaultProxyHost = "127.0.0.1"
defaultProxyPort = "7889"
defaultNetworkService = "Wi-Fi"
)
type ProxyManager interface {
EnableHTTPProxy(host, port string) error
DisableHTTPProxy() error
GetHTTPProxy() (string, error)
}
type MacProxyManager struct {
service string
}
func NewMacProxyManager(service string) *MacProxyManager {
return &MacProxyManager{service: service}
}
func (m *MacProxyManager) EnableHTTPProxy(host, port string) error {
if err := exec.Command("networksetup", "-setwebproxy", m.service, host, port).Run(); err != nil {
return fmt.Errorf("设置 HTTP 代理失败: %w", err)
}
if err := exec.Command("networksetup", "-setwebproxystate", m.service, "on").Run(); err != nil {
return fmt.Errorf("开启 HTTP 代理失败: %w", err)
}
return nil
}
func (m *MacProxyManager) DisableHTTPProxy() error {
if err := exec.Command("networksetup", "-setwebproxystate", m.service, "off").Run(); err != nil {
return fmt.Errorf("关闭 HTTP 代理失败: %w", err)
}
return nil
}
func (m *MacProxyManager) GetHTTPProxy() (string, error) {
out, err := exec.Command("networksetup", "-getwebproxy", m.service).CombinedOutput()
if err != nil {
return "", fmt.Errorf("读取 HTTP 代理失败: %w", err)
}
return string(out), nil
}
func main() {
upCmd := flag.NewFlagSet("up", flag.ExitOnError)
downCmd := flag.NewFlagSet("down", flag.ExitOnError)
checkCmd := flag.NewFlagSet("check", flag.ExitOnError)
setCmd := flag.NewFlagSet("set", flag.ExitOnError)
setProxy := setCmd.String("proxy", fmt.Sprintf("%s:%s", defaultProxyHost, defaultProxyPort), "代理地址,格式为 host:port")
proxy := NewMacProxyManager(defaultNetworkService)
if len(os.Args) < 2 {
echoHelp()
return
}
switch os.Args[1] {
case "up":
upCmd.Parse(os.Args[2:])
if err := proxy.EnableHTTPProxy(defaultProxyHost, defaultProxyPort); err != nil {
fmt.Println("❌", err)
return
}
printStatus(proxy)
case "down":
downCmd.Parse(os.Args[2:])
if err := proxy.DisableHTTPProxy(); err != nil {
fmt.Println("❌", err)
return
}
printStatus(proxy)
case "check":
checkCmd.Parse(os.Args[2:])
printStatus(proxy)
case "set":
setCmd.Parse(os.Args[2:])
parts := strings.Split(*setProxy, ":")
if len(parts) != 2 {
fmt.Println("❌ 代理地址格式错误,应为 host:port")
return
}
if err := proxy.EnableHTTPProxy(parts[0], parts[1]); err != nil {
fmt.Println("❌", err)
return
}
printStatus(proxy)
default:
echoHelp()
}
}
func printStatus(proxy ProxyManager) {
status, err := proxy.GetHTTPProxy()
if err != nil {
fmt.Println("❌", err)
return
}
fmt.Println("当前代理配置:\n", status)
}
func echoHelp() {
fmt.Println("Usage: go run . [up|down|check|set]")
fmt.Printf("\tup\t开启默认 HTTP 代理 (%s:%s)\n", defaultProxyHost, defaultProxyPort)
fmt.Println("\tdown\t关闭 HTTP 代理")
fmt.Println("\tcheck\t查询当前 HTTP 代理配置")
fmt.Println("\tset\t设置指定的 HTTP 代理,需配合 -proxy 参数使用")
}