WSL一键切换代理

在WSL中自动提取Windows IP并设置代理

在Windows和WSL(Windows Subsystem for Linux)之间工作时,特别是在需要通过代理访问网络时,自动获取Windows的IP地址并动态设置代理环境变量是一项常见的需求。本篇博客将介绍如何在WSL中自动提取Windows的IP地址并设置代理,同时分享如何解决在拼接字符串时可能遇到的隐藏字符问题。

背景

在WSL中运行Linux命令时,有时需要通过Windows的网络环境进行访问,这就需要动态获取Windows的IP地址,然后设置代理环境变量。我们将使用ipconfig.exe来获取Windows的IP地址,并通过awkiconv等工具进行处理。

步骤 1:提取Windows IP地址

首先,我们可以通过ipconfig.exe获取Windows的网络配置信息,然后使用awk从输出中提取与以太网适配器相关的IPv4地址。由于ipconfig.exe的输出为GBK编码,在WSL中处理时,需要将其转换为UTF-8编码。

以下命令可以提取出Windows的IPv4地址:

win11=$(ipconfig.exe | iconv -f GBK -t UTF-8 | awk '/以太网适配器 以太网/{flag=1} flag && /IPv4 地址/ {gsub(/\r/,""); print $NF; exit}')

解释:

  1. ipconfig.exe:调用Windows的命令行工具,输出网络配置信息。
  2. iconv -f GBK -t UTF-8:将GBK编码的输出转换为UTF-8,以便在WSL中正确处理中文字符。
  3. awk:从以太网适配器的部分提取IPv4地址。使用标志flag来标记匹配以太网适配器行,之后找到包含IPv4 地址的行并提取其最后一个字段(即IP地址)。
  4. gsub(/\r/, ""):移除Windows输出中的回车符(\r),避免影响后续的处理。

根据网络环境修改

在不同的网络环境下,ipconfig.exe 输出的适配器名称可能不同。如果你使用的是无线网络或其他网络接口,你可以修改awk命令中的适配器名称以匹配当前的网络环境:

  • 无线网络适配器:如果你连接的是WiFi,可以将以太网适配器 以太网替换为无线局域网适配器 WLAN
win11=$(ipconfig.exe | iconv -f GBK -t UTF-8 | awk '/无线局域网适配器 WLAN/{flag=1} flag && /IPv4 地址/ {gsub(/\r/,""); print $NF; exit}')
  • 其他网络接口:例如,你使用的是虚拟网络适配器,适配器名称可能为vEthernet,此时可以根据实际情况修改:
win11=$(ipconfig.exe | iconv -f GBK -t UTF-8 | awk '/vEthernet/{flag=1} flag && /IPv4 地址/ {gsub(/\r/,""); print $NF; exit}')

通过修改适配器名称,适配不同的网络环境。

步骤 2:处理隐藏字符问题

在提取IP地址时,可能会出现隐藏字符(如换行符或回车符),这会导致在拼接字符串时出现问题。例如,拼接代理地址时,IP地址前可能会带有不可见的换行符或其他字符。

为了解决这个问题,我们可以使用tr命令来清除隐藏字符:

win11=$(ipconfig.exe | iconv -f GBK -t UTF-8 | awk '/以太网适配器 以太网/{flag=1} flag && /IPv4 地址/ {gsub(/\r/,""); print $NF; exit}' | tr -d '\r\n')

解释:

  • tr -d '\r\n'tr命令用于删除隐藏字符,如回车符(\r)和换行符(\n),确保拼接字符串时不会出现格式错误。

步骤 3:设置代理

当我们成功提取到Windows的IP地址后,可以使用它来设置代理环境变量。以下是一个在.bashrc中设置全局代理的函数:

proxy () {
    # 设置全局代理服务器环境变量
    export ALL_PROXY="socks5://$win11:10808"
    export all_proxy="socks5://$win11:10808"

    # 给 apt-get 增加代理配置
    echo -e "Acquire::http::Proxy \"http://$win11:10808\";" | sudo tee -a /etc/apt/apt.conf > /dev/null
    echo -e "Acquire::https::Proxy \"https://$win11:10808\";" | sudo tee -a /etc/apt/apt.conf > /dev/null

    # 提示用户当前出口地址
    curl myip.ipip.net
}

解释:

  • ALL_PROXYall_proxy:设置全局代理环境变量,指定使用socks5代理协议,并将提取的Windows IP地址作为代理服务器的地址。
  • apt-get:通过修改/etc/apt/apt.conf文件为apt-get添加HTTP和HTTPS的代理配置。
  • curl myip.ipip.net:通过curl命令测试代理是否生效,并输出当前的外部IP地址。
  • 10808:代理软件的端口

步骤 4:清除代理

如果你想临时取消代理设置,可以使用以下函数来清除代理配置:

noproxy () {
    # 清除全局代理服务器环境变量
    unset ALL_PROXY
    unset all_proxy

    # 清除 apt-get 代理设置
    sudo sed -i -e '/Acquire::http::Proxy/d' /etc/apt/apt.conf
    sudo sed -i -e '/Acquire::https::Proxy/d' /etc/apt/apt.conf

    # 提示用户当前出口地址
    curl myip.ipip.net
}

解释:

  • unset:取消环境变量,使全局代理失效。
  • sed:从/etc/apt/apt.conf文件中删除与代理相关的配置。
  • curl myip.ipip.net:再次测试当前出口IP,确保代理已被清除。

总结

通过本文,我们实现了在WSL中自动提取Windows的IP地址,并将其用于动态设置代理。我们还解决了拼接字符串时可能遇到的隐藏字符问题,确保代理设置能够顺利进行。你可以将这些函数集成到你的.bashrc中,方便快速切换代理环境。

完整代码

win11=$(ipconfig.exe | iconv -f GBK -t UTF-8 | awk '/以太网适配器 以太网/{flag=1} flag && /IPv4 地址/ {gsub(/\r/,""); print $NF; exit}' | tr -d '\r\n')

proxy () {
    # 设置全局代理服务器环境变量
    export ALL_PROXY="socks5://$win11:10808"
    export all_proxy="socks5://$win11:10808"

    # 给 apt-get 增加代理配置
    echo -e "Acquire::http::Proxy \"http://$win11:10808\";" | sudo tee -a /etc/apt/apt.conf > /dev/null
    echo -e "Acquire::https::Proxy \"https://$win11:10808\";" | sudo tee -a /etc/apt/apt.conf > /dev/null

    # 提示用户当前出口地址
    curl myip.ipip.net
}

noproxy () {
    # 清除全局代理服务器环境变量
    unset ALL_PROXY
    unset all_proxy

    # 清除 apt-get 代理设置
    sudo sed -i -e '/Acquire::http::Proxy/d' /etc/apt/apt.conf
    sudo sed -i -e '/Acquire::https::Proxy/d' /etc/apt/apt.conf

    # 提示用户当前出口地址
    curl myip.ipip.net
}

你可以将这些内容添加到你的.bashrc文件中,以便在WSL中动态管理代理设置。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值