Golang实现一个批量自动化执行树莓派指令的软件(9)辅助模块-调用Ping指令判定在线

简介

基于 Golang实现一个批量自动化执行树莓派指令的软件(8)辅助模块-远程IP端口是否开放连接(TCP)Golang实现一个批量自动化执行树莓派指令的软件(7)辅助模块-本地活动网络, 这两篇, 再新增使用系统ping指令判定设备是否在线。

环境描述

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

实现

network_windows.go

go 复制代码
package utils

import (
	"os/exec"
)

func IsIPOnline(ip string) bool {
	// 使用ping命令检查IP地址,-c 1表示发送一个请求,-w 1表示等待1秒
	cmd := exec.Command("ping", "-n", "1", "-l", "1024", "-w", "1000", ip)

	// 执行命令并等待它完成
	//output, err := cmd.CombinedOutput()
	_, err := cmd.CombinedOutput()
	if err != nil {
		return false
		//if exitError, ok := err.(*exec.ExitError); ok {
		//	fmt.Printf("host is unreachable. Exit code: %d\n", exitError.ExitCode())
		//} else {
		//	// 处理其他类型的错误
		//	fmt.Println("Failed to execute ping command.")
		//}
	}

	return true
}

network.go

go 复制代码
func GetNetworkStat(ipv4 string, port uint, timeout time.Duration) NetworkStatus {
	var (
		status = NetworkStatus{
			IPAvailable:   false,
			PortAvailable: false,
		}
	)
	if ok := IsIPOnline(ipv4); !ok {
		return status
	}
	status.IPAvailable = true

	if IsRemoteNetworkAlive(ipv4, port, timeout) {
		status.PortAvailable = true
	}

	return status
}

network_linux.go

go 复制代码
package utils

import (
	"os/exec"
)

func IsIPOnline(ip string) bool {
	// 使用ping命令检查IP地址,-c 1表示发送一个请求,-w 1表示等待1秒
	cmd := exec.Command("ping", "-s", "1024", "-w", "1", ip)

	// 执行命令并等待它完成
	_, err := cmd.CombinedOutput()
	if err != nil {
		return false
	}

	return true
}

测试用例

go 复制代码
func TestIsIPOnline(t *testing.T) {
	var (
		ipv4PrefixStr   string
		ipv4Str         string
		idx             int
		interfaces, err = GetLocalActivityNetworkInterfaces()
		ipMin           = 0
		ipMax           = 255

		waiter sync.WaitGroup
	)

	if nil != err {
		fmt.Println("get lcoal activity network fail, ", err.Error())
		return
	}
	for _, intf := range interfaces {
		if 0 >= len(intf.IPv4) {
			continue
		}
		idx = strings.LastIndex(intf.IPv4, ".")
		ipv4PrefixStr = intf.IPv4[:idx+1]
		for ipIndex := ipMin; ipIndex < ipMax; ipIndex++ {
			ipv4Str = fmt.Sprintf("%s%d", ipv4PrefixStr, ipIndex+1)
			waiter.Add(1)
			go func(ip string) {
				if ok := IsIPOnline(ip); ok {
					fmt.Println(ip, "is Alive.")
				}
				waiter.Done()
			}(ipv4Str)
		}
	}
	waiter.Wait()
}

func TestGetNetworkStat(t *testing.T) {
	var (
		ipv4PrefixStr   string
		ipv4Str         string
		idx             int
		interfaces, err = GetLocalActivityNetworkInterfaces()
		ipMin           = 0
		ipMax           = 255
		port            = uint(22)

		waiter sync.WaitGroup
	)

	if nil != err {
		fmt.Println("get lcoal activity network fail, ", err.Error())
		return
	}
	for _, intf := range interfaces {
		if 0 >= len(intf.IPv4) {
			continue
		}
		idx = strings.LastIndex(intf.IPv4, ".")
		ipv4PrefixStr = intf.IPv4[:idx+1]
		for ipIndex := ipMin; ipIndex < ipMax; ipIndex++ {
			ipv4Str = fmt.Sprintf("%s%d", ipv4PrefixStr, ipIndex+1)
			waiter.Add(1)
			go func(ip string, port uint) {
				status := GetNetworkStat(ip, port, time.Second)
				if status.IPAvailable || status.PortAvailable {
					if status.IPAvailable {
						fmt.Printf("%s ip is online, ", ip)
					}

					if status.PortAvailable {
						fmt.Printf("port(%d) is opened.\n", port)
					} else {
						fmt.Printf("port(%d) is closed.\n", port)
					}
				}
				waiter.Done()
			}(ipv4Str, port)
		}
	}
	waiter.Wait()
}

代码源

https://gitee.com/grayhsu/ssh_remote_access

其他

参考

相关推荐
小屁孩大帅-杨一凡10 分钟前
一个简单点的js的h5页面实现地铁快跑的小游戏
开发语言·前端·javascript·css·html
顾子茵18 分钟前
c++从入门到精通(四)--动态内存,模板与泛型编程
java·开发语言·c++
电信2301杨臣35 分钟前
QT---信号与槽
开发语言·qt
明月看潮生41 分钟前
青少年编程与数学 02-019 Rust 编程基础 07课题、字符串
开发语言·青少年编程·rust·编程与数学
抽风的雨61042 分钟前
【python基础知识】Day26 函数
开发语言·python
编程有点难1 小时前
Python训练打卡Day22
开发语言·python·机器学习
咕噜咕噜啦啦2 小时前
Python爬虫入门
开发语言·爬虫·python
dubochao_xinxi2 小时前
✅ TensorRT Python 安装精简流程(适用于 Ubuntu 20.04+)
开发语言·python·ubuntu
感谢地心引力2 小时前
【Matlab】最新版2025a发布,深色模式、Copilot编程助手上线!
开发语言·windows·matlab·copilot
Java程序员-小白3 小时前
使用java -jar命令指定VM参数-D运行jar包报错问题
java·开发语言·jar