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

简介

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

环境描述

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

实现

network_windows.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

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

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
}

测试用例

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

其他

参考

最近更新

  1. TCP协议是安全的吗?

    2024-04-29 08:44:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-29 08:44:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-29 08:44:03       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-29 08:44:03       20 阅读

热门阅读

  1. Doxygen

    2024-04-29 08:44:03       11 阅读
  2. vue使用axios解决跨域get和post请求

    2024-04-29 08:44:03       10 阅读
  3. Python:匿名函数lambda用法

    2024-04-29 08:44:03       14 阅读
  4. react 笔记

    2024-04-29 08:44:03       15 阅读
  5. Anaconda-用conda创建python虚拟环境常用命令

    2024-04-29 08:44:03       11 阅读
  6. mxnet.gluon.rnn及mxnet.symbol实现LSTM教程

    2024-04-29 08:44:03       13 阅读
  7. 阿里云RocketMQ消费MQTT消息

    2024-04-29 08:44:03       10 阅读
  8. LeetCode 第395场周赛个人题解

    2024-04-29 08:44:03       12 阅读
  9. iOS pod库包含MRC类

    2024-04-29 08:44:03       9 阅读
  10. K8s: 应用项目部署运维环境搭建

    2024-04-29 08:44:03       9 阅读
  11. Python常见的第三方库[详细解析]

    2024-04-29 08:44:03       8 阅读
  12. 带你深入了解空三加密

    2024-04-29 08:44:03       11 阅读
  13. SAP事务码列表 1、CODE_SCANNER: 代码搜索工具

    2024-04-29 08:44:03       10 阅读
  14. 不定期会议对团队开发的影响(项目管理篇)

    2024-04-29 08:44:03       12 阅读
  15. 在centos上通过yum安装指定版本的软件

    2024-04-29 08:44:03       9 阅读