1 个不稳定版本
| 0.1.0 | 2023年12月4日 |
|---|
#1957 in 网络编程
12KB
122 行
get-host-ip
这是一款用rust编写的命令行工具。它被设计用来从C:\Windows\System32\ipconfig.exe的执行结果中提取指定【网卡】的属性值。例如,从电脑的【无线局域网适配器WLAN】中提取出【IPv4地址】字符串值。
使用场景
从Windows Subsystem for Linux(例如,Ubuntu 20.04)读取其宿主主机(例如,Windows 11)无线物理网卡的IP地址。然后,将其作为两项重要功能的配置项参数:
- 将
WSL2图形界面投影到Windows宿主桌面系统显示。- 无论是将整个
Gnome桌面投影作为Windows环境下的一个应用程序窗口,还是仅投影某个Linux GUI应用程序,X11 Server都需要通过$DISPLAY环境变量明确地知道XSTATA的准确IP位置。请不要自作聪明地认为127.0.0.1可能糊弄过去。127.0.0.1是指向WSL2子系统自身,而不是宿主主机。 - 关于
WSL2桌面投影的更多技术细节,可参见我之前的一篇文章为 Rust+QT 编程搭建【伪】win32 开发环境。还算详细吧!
- 无论是将整个
- 使
Windows宿主操作系统共享VPN客户端给WSL2子系统。- 从操作上,执行
export HTTP_PROXY=***命令要比在Linux系统里安装与配置另一个Clash实例要简单多了。 - 从后续维护上,对
VPN客户端的软件升级与配置更新仅需要做一遍操作更节省时间。 - 从经济上,更少的在线客户端数量也更便宜。
- 从操作上,执行
曾经的纠结
以前我也曾使用nodejs脚本程序实现了相同的功能。但是,node虚拟机首次启动时间确实有些长。虽然在交互式bash上下文中这个长延时并不明显(毕竟我们敲键盘也不快,还时不时地敲错字母),但当它被放在.bashrc文件中执行时,其造成的shell会话初始化阻滞就让人有些难以接受(毕竟,每次打开一个新的shell窗口都需要明显地黑屏一两秒钟,体验真的很差)。因此,我决定使用rust重构这个“热”指令。效果非常明显,几乎一闪即过就可以完成shell初始化。
命令行指令-用法
$ get-host-ip --help
获取 wsl 宿主机器的物理 IP 地址
Usage: get-host-ip [OPTIONS]
Options:
-s, --section <SECTION> ipconfig.exe 返回结果中的【主分类】标题 [default: "无线局域网适配器 WLAN"]
-e, --entry <ENTRY> ipconfig.exe 返回结果中的【主分类】下各个条目的标签名 [default: "IPv4 地址"]
-h, --help Print help
-V, --version Print version
更详细示例

返回结果
get-host-ip执行输出的就是没有结尾换行符的IP地址字符串。如果将该指令添加到$PATH中,那么在Shell求值表达式内就可以直接使用。
export HOST_IP=$(get-host-ip);
链接库依赖
由于Windows cmd指令输出文本内容的字符集是cp936,而不是UTF-8。因此,get-host-ip需要依赖操作系统预置的字符集转换动态链接库libiconv,来完成cp936 -> UTF-8的字符集转换。
Linux操作系统
大部分主流的Linux OS都包含有libiconv。如果你的Linux OS版本比较早或者compact版而缺失了libiconv也不必慌。按照以下方式补装即可:
wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.9.1.tar.gz
tar -xzvf libiconv-1.9.1.tar.gz
cd libiconv-1.9.1.tar.gz
./configure --prefix=/usr/local
sudo make -j8
sudo make install
sudo ln -s /usr/local/lib/libiconv.so /usr/lib/libiconv.so
sudo ln -s /usr/local/lib/libiconv.so.2 /usr/lib/libiconv.so.2
Windows操作系统
要么,从setup直接下载安装包,并本地安装之。缺点就是会“污染”你的PATH环境变量。
要么,从binary下载预编译包。在解压缩之后,将其下的bin目录添加到你的编译环境变量RUST_FLAGS内。例如,
set RUST_FLAGS=-L C:\libiconv-1.9.2-1-bin\bin
抱怨
同一款libiconv链接库怎么对Linux与Windows操作系统提供了不同名的导出函数呢?这个“缺德的”命名差异导致我在【编译期·动态链接】环节卡住了好几天。相对于Linux版的链接库导出函数名,Windows版的每个导出函数都有一个lib前缀 —— 故意的吧?真要命。
依赖
~3.5–5MB
~89K SLoC