ITPub博客

首页 > 数据库 > 数据库开发技术 > [大家的项目] 获取主机IP地址

[大家的项目] 获取主机IP地址

原创 数据库开发技术 作者:Rust语言中文社区 时间:2023-04-30 23:35:27 0 删除 编辑

get-host-ip

https://github.com/stuartZhang/get-host-ip/tree/main

这是一款用rust制作的命令行工具。其被设计用来从C:\Windows\System32\ipconfig.exe的执行结果内提取出指定【网卡】的属性值。比如,从电脑本的【无线局域网适配器WLAN】中提取出【IPv4地址】字符串值。

使用场景

从Windows Subsystem for Linux(比如,Ubuntu-20.04)读取其宿主主机(比如,Windows 11)无线物理网卡的IP地址。进而,将其作为两项重要功能的配置项入参:

  1. 投影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前缀 —— 故意的吧?真要命。



    原文作者:Rust语言中文社区;如有侵权,请联系管理员删除。

    请登录后发表评论 登录
    全部评论

    注册时间:2020-06-11

    • 博文量
      1769
    • 访问量
      718727