我一直在使用go-ping库进行无特权的ping,并在golang中计算网络的各种统计信息。代码段为->
func (p *Ping) doPing() (latency, jitter, packetLoss float64, err error) { timeout := time.Second*1000 interval := time.Second count := 5 host := p.ipAddr pinger, cmdErr := ping.NewPinger(host) if cmdErr != nil { glog.Error("Failed to ping " + p.ipAddr) err = cmdErr return } pinger.Count = count pinger.Interval = interval pinger.Timeout = timeout pinger.SetPrivileged(false) pinger.Run() stats := pinger.Statistics() latency = float64(stats.AvgRtt) jitter = float64(stats.StdDevRtt) packetLoss = stats.PacketLoss return }
它工作正常,但是现在它开始抛出:-“侦听ICMP数据包时出错:套接字:权限被拒绝”错误。有人知道背后的原因吗?我正在使用的Go版本是go1.7.4。
确保您的设置没有任何改变。如果我事先根据Github的说明设置了net.ipv4.ping_group_range,则在32位Ubuntu Go 1.7.4(linux / 386)的Ubuntu 16.04上仍然可以使用包中的 ping 命令。
关于Linux支持的注意事项: 该库尝试通过UDP发送“非特权” ping。在Linux上,必须通过设置启用 sudo sysctl -w net.ipv4.ping_group_range="0 2147483647" 如果您不希望这样做,则可以设置pinger.SetPrivileged(true)并使用setcap以允许您的二进制文件使用go- ping绑定到原始套接字(或仅以超级用户身份运行): setcap cap_net_raw=+ep /bin/goping-binary 有关更多详细信息,请参见此博客 和Go icmp库。
该库尝试通过UDP发送“非特权” ping。在Linux上,必须通过设置启用
sudo sysctl -w net.ipv4.ping_group_range="0 2147483647"
如果您不希望这样做,则可以设置pinger.SetPrivileged(true)并使用setcap以允许您的二进制文件使用go- ping绑定到原始套接字(或仅以超级用户身份运行):
pinger.SetPrivileged(true)
setcap cap_net_raw=+ep /bin/goping-binary
有关更多详细信息,请参见此博客 和Go icmp库。