Linux教程

Linux环境下无法使用非权威ping问题

本文主要是介绍Linux环境下无法使用非权威ping问题,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

Linux环境下无法使用非权威ping问题(github.com/go-ping/ping包)

 

问题:在Linux环境中手动使用ping命令是可以正常执行的,但是golang程序调用go-ping包则会返回socket: permission denied错误,导致程序失败

 

程序源码

//测试3个包, 不能ping通则返回false;
func pings(ip string) (bool, error) {

	pinger, err := ping.NewPinger(ip)
	if err != nil {
		return false, err
	}
	//测试3个包
	pinger.Count = 3
	pinger.Timeout = 3000000000 //3 秒超时
	err = pinger.Run()          // Blocks until finished.
	if err != nil {
		return false, err
	}
	stats := pinger.Statistics() // get send/receive/rtt stats
	fmt.Println("stats.PacketLoss is; ", stats.PacketLoss)

	//如果丢包100%
	if stats.PacketLoss == 100 {
		return false, nil
	}
	//不丢包返回true
	return true, nil

}

func main() {

	b, err := pings("x.x.x.x")
	fmt.Println("---", b)
	fmt.Println("err is: ", err)
}

 

具体原因

这是一个sysctl设置,用于限制允许在Alpine上ping的用户ID范围。让所有用户可以ping

临时解决:sudo sysctl -w net.ipv4.ping_group_range="0   2147483647"

永久化,echo "net.ipv4.ping_group_range = 0 2147483647" >> /etc/sysctl.conf

这篇关于Linux环境下无法使用非权威ping问题的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!