12.5 读取网络接口的配置文件
网络配置有四个核心元素:接口的IP地址、接口的网络掩码、主机的DNS服务器配置以及主机的默认网关或默认路由配置。这里存在一个问题:目前没有原生并可移植Go代码来获取以上信息。这表明在UNIX系统的主机上,没有可移植的代码来查询DNS配置和默认网关信息。
因此在本节中,将介绍如何使用Go代码读取UNIX系统的网络接口配置。为此,我将介绍两个可移植的程序,用于查询有关网络接口的配置。
第一个程序netConfig.go的源代码由三部分组成。
以下Go代码是netConfig.go的第一部分:
package main import ( "fmt" "net" ) func main() { interfaces, err := net.Interfaces() if err != nil { fmt.Println(err) return }
函数net.Interfaces()的作用是将当前计算机的所有接口信息通过一个切片数据结构返回,切片的数据元素类型为net.Interface。此切片将用于获取接口的信息。
代码netConfig.go的第二个部分包含以下Go代码:
在上面的代码中,使用net.Interface类型来访问切片的每个元素,获取所需的信息。
在操作系统为macOS High Sierra的主机上,使用版本为1.10的Go运行环境执行netConfig.go会得到以下输出:
如上,因为现代计算机配置很多网络接口,同时程序支持IPv4和IPv6协议,netConfig.go返回了很多接口和IP地址信息。
在操作系统为Debian Linux的主机上,使用版本为1.7.4的Go运行环境执行netConfig.go会得到以下输出:
可以看到有的网络接口没有显示网络地址,可能的主要原因是接口是关闭的,或者该接口没有进行配置。
并非所有列出的网络接口都关联了真正的硬件网络设备。最典型的例子是
lo0接口,它是环回设备。环回设备是一种特殊的虚拟网络接口,主机可以通过该接口与自身通信。
下一个Go程序netCapabilities.go的代码也分为三部分。程序netCapabilities.go的目的是打印UNIX操作系统的主机上每个网络接口的功能。
程序netCapabilities.go使用结构net.Interface的字段,定义如下:
Go程序netCapabilities.go的第一部分如下:
在操作系统为macOS High Sierra的主机上运行netCapabilities.go生成以下输出:
在Debian Linux操作系统的主机上执行netCapabilities.go将输出类似的结果。
最后,如果对查找主机的默认网关感兴趣,可以在shell运行环境中执行netstat -nr命令查看,或在Go程序中使用exec.Command()执行该命令,并通过pipe或exec.CombinedOutput()以文本的形式获取其输出,并打印。然而,这种方式既不优雅也不完美。
Last updated
Was this helpful?