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

其他

参考

相关推荐
埃博拉酱8 天前
VS Code Remote SSH 连接 Windows 服务器卡在"下载 VS Code 服务器":prcdn DNS 解析失败的诊断与 BITS 断点续传
windows·ssh·visual studio code
花酒锄作田9 天前
Gin 框架中的规范响应格式设计与实现
golang·gin
郑州光合科技余经理9 天前
代码展示:PHP搭建海外版外卖系统源码解析
java·开发语言·前端·后端·系统架构·uni-app·php
feifeigo1239 天前
matlab画图工具
开发语言·matlab
dustcell.9 天前
haproxy七层代理
java·开发语言·前端
norlan_jame9 天前
C-PHY与D-PHY差异
c语言·开发语言
多恩Stone9 天前
【C++入门扫盲1】C++ 与 Python:类型、编译器/解释器与 CPU 的关系
开发语言·c++·人工智能·python·算法·3d·aigc
QQ4022054969 天前
Python+django+vue3预制菜半成品配菜平台
开发语言·python·django
遥遥江上月9 天前
Node.js + Stagehand + Python 部署
开发语言·python·node.js
zhangfeng11339 天前
趋动云 如何ssh登录 服务区 项目server
运维·人工智能·ssh