Golang实现一个批量自动化执行树莓派指令的软件(7)辅助模块-本地活动网络

简介

为了更方便的使用,我们将实现一个可以扫描本地连接网络中可用连接的扫描功能, 扫描本地连接网络中有哪些连接的设备主机。

环境描述

运行环境 : Windows, 基于Golang, 暂时没有使用什么不可跨平台接口, 理论上支持Linux/MacOS
目标终端:树莓派DebianOS(主要做用它测试)

实现

go 复制代码
package utils

import (
	"net"
)

type NetworkInterface struct {
	Name string // interface name
	IPv4 string
	IPv6 string
}

func GetLocalActivityNetworkInterfaces() ([]NetworkInterface, error) {
	var (
		networkInterfaces    = make([]NetworkInterface, 0)
		tempNetworkInterface NetworkInterface
		err                  error
		interfaces           []net.Interface
		tempAddrs            []net.Addr
	)
	interfaces, err = net.Interfaces()
	if err != nil {
		return nil, err
	}

	for _, iface := range interfaces {
		//fmt.Println("ifaceName: ", iface.Name, ", flags: ", iface.Flags)
		// 过滤掉蓝牙和未连接的网络接口
		if !isActivityNetwork(iface.Flags) {
			continue
		}
		tempNetworkInterface.Name = iface.Name

		tempAddrs, err = iface.Addrs()
		if err != nil {
			continue
		}

		for _, addr := range tempAddrs {
			// 只处理IP地址
			if ipnet, ok := addr.(*net.IPNet); ok && !ipnet.IP.IsLoopback() {
				if ipnet.IP.To4() != nil {
					tempNetworkInterface.IPv4 = ipnet.IP.String()
				} else if ipnet.IP.To16() != nil {
					tempNetworkInterface.IPv6 = ipnet.IP.String()
				}
			}
		}

		networkInterfaces = append(networkInterfaces, tempNetworkInterface)
	}

	return networkInterfaces, nil
}

func isActivityNetwork(flags net.Flags) bool {
	return !isActivityNetworkUnnecessary(flags) && isActivityNetworkNecessary(flags)
}

func isActivityNetworkNecessary(flags net.Flags) bool {
	var fliterFlags = []net.Flags{
		net.FlagUp, net.FlagRunning, net.FlagBroadcast, net.FlagMulticast,
	}

	for _, flg := range fliterFlags {
		if 0 == (flg & flags) {
			return false
		}
	}

	return true
}

func isActivityNetworkUnnecessary(flags net.Flags) bool {
	var fliterFlags = []net.Flags{
		net.FlagPointToPoint, net.FlagLoopback,
	}

	for _, flg := range fliterFlags {
		if 0 != (flg & flags) {
			return true
		}
	}

	return false
}

测试用例

go 复制代码
package utils

import (
	"fmt"
	"testing"
)

func TestGetLocalActivityNetworkInterfaces(t *testing.T) {
	var interfaces, err = GetLocalActivityNetworkInterfaces()
	if nil != err {
		fmt.Println("get lcoal activity network fail, ", err.Error())
		return
	}
	for _, intf := range interfaces {
		fmt.Printf("InterfaceName: %s, IPv4: %s, IPv6: %s.\n", intf.Name, intf.IPv4, intf.IPv6)
	}

}

代码源

https://gitee.com/grayhsu/ssh_remote_access

其他

参考

相关推荐
天远数科8 小时前
零信任架构实战:基于天远企业股权变更构建自动化商业银行对公授信存续期股权异动与资产抽逃预警网关
运维·人工智能·架构·自动化
车软学堂8 小时前
从测试转开发,到底要补什么
网络·人工智能·python·功能测试·单片机·车载系统·自动化
车软学堂9 小时前
CANoe自动化:跑起第一个测试用例
运维·车载系统·自动化·汽车·测试用例
明天也要努力学习9 小时前
IP 协议的相关特性
网络·网络协议·tcp/ip
说实话起个名字真难啊9 小时前
一次中风险漏洞处理复盘:从RSA密钥交换到全面启用TLSv1.3
网络
L02082410 小时前
Kubernetes Ingress|CNI 网络模型|Calico 网络策略|Pod 调度器完整实战教程
运维·网络·云原生·容器·kubernetes
启博网络10 小时前
下一代防火墙是什么意思?下一代防火墙可以抵御哪些网络攻击?
网络·防火墙
虎鲸不是鱼11 小时前
AI 自动化逆向(三十三)换一个「驱动器」,覆盖率跳了一个量级
人工智能·自动化·大模型·逆向·ai逆向