在WSL中自动提取Windows IP并设置代理
在Windows和WSL(Windows Subsystem for Linux)之间工作时,特别是在需要通过代理访问网络时,自动获取Windows的IP地址并动态设置代理环境变量是一项常见的需求。本篇博客将介绍如何在WSL中自动提取Windows的IP地址并设置代理,同时分享如何解决在拼接字符串时可能遇到的隐藏字符问题。
背景
在WSL中运行Linux命令时,有时需要通过Windows的网络环境进行访问,这就需要动态获取Windows的IP地址,然后设置代理环境变量。我们将使用ipconfig.exe
来获取Windows的IP地址,并通过awk
和iconv
等工具进行处理。
步骤 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}')
解释:
ipconfig.exe
:调用Windows的命令行工具,输出网络配置信息。iconv -f GBK -t UTF-8
:将GBK编码的输出转换为UTF-8,以便在WSL中正确处理中文字符。awk
:从以太网适配器的部分提取IPv4地址。使用标志flag
来标记匹配以太网适配器行,之后找到包含IPv4 地址
的行并提取其最后一个字段(即IP地址)。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_PROXY
和all_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中动态管理代理设置。