go获取windows的hostid

19 May 2016 go获取windows的hostid

在类unix系统中可以通过hostid命令获取到一个十六进制数,称为hostid,在大多数情况下可以作为该机器的唯一标识符。例如在我的ubuntu系统上执行如下:

root@leo:demo# hostid
a8c06701

实际上hostid命令是通过系统调用gethostid()得到hostid,但是gethostid()在获取hostid时先读取系统中的hostid文件获取hostid,如果hostid文件不存在,gethostid()会通过机器名获取ip地址,但是不使用回环地址127.0.0.1,然后将ip地址按一定的规则转换成hostid返回。所以当机器上没有hostid文件时,执行hostid命令结果会不一样,因为ip改变后hostid就随之改变。但是在windows系统中没有hostid的概念,所以如果需要获取windows系统的hostid时,必须通过ip地址转换。

本文将通过go获取到ip地址,然后将ip按下面的规则转换成相应的hostid(linux系统也是通过以下规则转换):

a8 c0 67 01
|  |  |  |___ 1
|  |  |_____ 103
|  |_______ 192
|_________ 168

如果机器有多个ip,就会存在多个hostid。具体代码如下:

package main

import (
    "fmt"
    "net"
    "runtime"
)

func main() {

    interfaceAddrs, err := net.InterfaceAddrs()
    if err != nil {
        fmt.Println(err)
    }
    for _, interfaceAddr := range interfaceAddrs {
        ipnet, ok := interfaceAddr.(*net.IPNet)
        if ok && !ipnet.IP.IsLoopback() {
            if ipnet.IP.To4() != nil {
                var hostid string
                if runtime.GOOS == "windows" {
                    hostid = fmt.Sprintf(
                        "%.2x%.2x%.2x%.2x",
                        ipnet.IP[1],
                        ipnet.IP[0],
                        ipnet.IP[3],
                        ipnet.IP[2])
                } else {
                    hostid = fmt.Sprintf(
                        "%.2x%.2x%.2x%.2x",
                        ipnet.IP[13],
                        ipnet.IP[12],
                        ipnet.IP[15],
                        ipnet.IP[14])
                }
                fmt.Printf("hostid:%v\n", hostid)
            }
        }
    }
}

输出如下(3个IP):

hostid:a8c06801
hostid:a8c06538
hostid:11ac012a

LEo at 23:44

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏知晓程序

开发 | 小程序跨页传值的的问题,这个 JS 库就能解决(内附项目地址)

最近微信小程序越来越火,不少公司都在开发微信小程序,将其他平台的代码转为小程序的代码。

982
来自专栏bboysoul

自己搭建ngrok服务把树莓派放到公网上去

为什么自己搭建ngrok服务呢?原因很简单,官方如果绑定域名要收费啊,自己有服务器,所以就自己搭建一个好了,要求的服务器配置又不高,说实在的树莓派IO真的惨不忍...

1351
来自专栏Java后端生活

Linux(六)vi和vim编辑器的使用

3145
来自专栏菩提树下的杨过

serv-U 7以上版本pasv端口的设置及中文乱码问题

利用serv-u架设ftp服务器已经是再常见不过了事情了,近日一朋友为图新鲜,弄了个7.4版本的新玩意儿,结果架设上去后,仅开了21端口,用LeapFtp在po...

2729
来自专栏游戏杂谈

Linux下使用rsync同步文件

遇到的问题是几台游戏服务器,有一台新的服务器之前已经copy(Linux的scp命令)过文件上去,但在测试的过程中发现还是图片无法正常不显示出来,然后用http...

4642
来自专栏飞雪无情的博客

Go语言实战笔记(二)| Go开发工具

在Go语言中,我们很多操作都是通过go命令进行的,比如我们要执行go文件的编译,就需要使用go build命令,除了build命令之外,还有很多常用的命令,这一...

1163
来自专栏Charlie's Road

Python文件读写保存操作

上面的代码其实没啥要介绍的,就是一个for循环然后逻辑和单个文件读操作一样,只是多了个写操作。

3771
来自专栏北京马哥教育

看了还想看—普通权限及umask

权限在操作系统是尤为重要的,无论是windows和linux中,都少不了权限这么一说,权限的大小决定了你能操作些什么,在linux中,权限对目录和文件的意义是不...

3817
来自专栏Go 语言编程

GLC - glog 日志清理类库

GLC (glog cleaner) 是 Go 语言编写的 glog 日志清理类库,glog 是由 Google 开发的一个应用级日志框架,提供了日志分级、文件...

43810
来自专栏飞雪无情的博客

Go语言实战笔记(十六)| Go 并发示例-Pool

这篇文章演示使用有缓冲的通道实现一个资源池,这个资源池可以管理在任意多个goroutine之间共享的资源,比如网络连接、数据库连接等,我们在数据库操作的时候,比...

1332

扫码关注云+社区

领取腾讯云代金券