#ip-address #networking #ip #extractor #unix-command #ifconfig

ip_extractor

一个简单的 crate,它封装了 ifconfig 命令来提取网络接口及其 IP 地址

2 个版本

0.1.1 2023 年 12 月 9 日
0.1.0 2023 年 12 月 9 日

#2070网络编程


用于 ishan

MIT 许可证

16KB
128

IP Extractor

这是一个简单的 crate,用于提取基于 Unix 系统的 IP 地址。它基本上是 ifconfig 命令的封装。

这是我第一个 crate,所以请多多包涵。

继续阅读以获取迷你文档,或者您可以前往 文档

使用方法

use ip_extractor::find_network;

fn main() {
    let networks = get_networks().unwrap();

    networks.iter().for_each(|network| {
        println!("{}", network);
    });
}

工作原理和注意事项

这个 crate 实际上是 ifconfig 命令的封装。它运行该命令然后解析输出以获取 IP 地址。

解析是通过简单的分割算法完成的,所以不要期望它完美。然而,它应该适用于大多数情况。

此外,这个 crate 只在具有 ifconfig 命令的系统中工作。因此,它在 Windows 上无法工作。我的意思是,您可能可以用 WSL 或 Git Bash 来使用它,但我还没有测试过。所以如果这样做了,请告诉我。

有一个内部函数实际上执行命令并解析输出。然而,它没有暴露给用户。如果找不到 ifconfig 命令,这个函数就会失败。

迷你文档

这是一个只有 5 个主要功能的简单 crate。所以如果您有 Rust 编程知识,查看 文档 会非常容易。但是,如果您想要快速概述,这里是一个迷你文档。

Network 结构

Network 结构是一个简单的结构,旨在表示网络接口。截至版本 0.1.0,它有 5 个字段。

pub struct Network {
    pub name: String,
    pub inet: String,
    pub mac: String,
    pub netmask: String,
    pub broadcast: String,
}

如果您想知道,网络接口的 IP 存储在 inet 字段中。

这个结构仅用于表示,因此它没有方法。顺便说一下,它实现了 Display 特性,因此您可以直接打印它。

get_networks 函数

这是crate的主要函数。它返回一个 Vec<Network>,这是一个包含系统上所有网络接口的向量。

请注意,它直接返回网络,所以你可以这样使用

签名: get_networks() -> Vec<Network>

get_networks().iter().for_each(|network| {
    println!("{}", network);
});

find_network 函数

这是一个模糊搜索网络接口的函数。它接受一个 &str 作为参数,并返回一个 Option<Network>

签名: find_network(&str) -> Option<Network>

use ip_extractor::{find_network, Network};
 
let network = find_network("wlan");
 
match network {
   Some(network) => println!("{:?}", network),
  None => println!("No network found."),
}

parse_network 函数

这是一个内部函数,用于解析 ifconfig 命令的输出。它接受一个 &str 作为参数,并返回一个 Network

解析是通过简单的分割算法完成的,所以不要期望它完美。然而,它应该适用于大多数情况。

签名: parse_network(&str) -> Network

use ip_extractor::parse_network;
 
let network = parse_network("wlp2s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
       inet
      inet6
     ether
    ");
 
println!("{:?}", network);

get_wlan 函数

这是一个获取系统上所有无线网络的方法。大多数基于Unix的系统使用wlan或wlp作为无线网络接口的前缀。

因此,这个方法基本上是对get_networks方法的迭代器过滤器,用于找到它们。你也可以传递一个可选的标识符来模糊匹配无线网络接口的名称。

签名: get_wlan(Optional<&str>) -> Vec<Network>

use ip_extractor::{get_wlan, Network};
 
let networks = get_wlan(None);
 
for network in networks {
   println!("{:?}", network);
}
 
let networks = get_wlan(Some("wlp"));
 
for network in networks {
  println!("{:?}", network);
}

get_ethernet 函数

这个函数与 get_wlan 函数类似,但它是用于以太网网络接口。以太网网络接口的前缀通常是eth或enp。

签名: get_ethernet(Optional<&str>) -> Vec<Network>

use ip_extractor::{get_ethernet, Network};
 
let networks = get_ethernet(None);
 
for network in networks {
  println!("{:?}", network);
}
 
let networks = get_ethernet(Some("enp"));
 
for network in networks {
 println!("{:?}", network);
}

注意:get_wlanget_ethernet 函数只是 get_networks 函数的迭代器。所以如果你想的话,可以直接使用 get_networks 函数。

贡献

如果你想为这个crate做出贡献,你可以通过打开一个issue或pull request来做到。我会非常感激。

许可证

这个crate是在MIT许可证下授权的。你可以在这里阅读许可证。所以,基本上,只要你所使用的东西是合法的,你就可以使用它(至少,我认为这就是它的意思)。

无运行时依赖