linux – 生成一致的机器唯一ID

我们是否可以为每台PC生成一个唯一的ID,例如uuuidgen,但除非有硬件更改,否则它永远不会改变?我正在考虑合并CPUID和MACADDR并将它们哈希以生成一致的ID,但我不知道如何使用bash脚本解析它们,我知道如何从中获取CPUID

dmidecode -t 4 | grep ID

ifconfig | grep ether

然后我需要组合这些十六进制字符串并使用sha1或md5散列它们以创建固定长度的十六进制字符串.
我该如何解析输出?

解决方法:

这两个怎么样:

$sudo dmidecode -t 4 | grep ID | sed 's/.*ID://;s/ //g'
52060201FBFBEBBF
$ifconfig | grep eth1 | awk '{print $NF}' | sed 's/://g'
0126c9da2c38

然后,您可以将它们组合并哈希:

$echo $(sudo dmidecode -t 4 | grep ID | sed 's/.*ID://;s/ //g') \
       $(ifconfig | grep eth1 | awk '{print $NF}' | sed 's/://g') | sha256sum 
59603d5e9957c23e7099c80bf137db19144cbb24efeeadfbd090f89a5f64041f  -

要删除尾随破折号,请再添加一个管道:

$echo $(sudo dmidecode -t 4 | grep ID | sed 's/.*ID://;s/ //g') \
       $(ifconfig | grep eth1 | awk '{print $NF}' | sed 's/://g') | sha256sum |
  awk '{print $1}'
59603d5e9957c23e7099c80bf137db19144cbb24efeeadfbd090f89a5f64041f

正如@mikeserv指出in his answer,引导之间的接口名称can change.这意味着今天的eth0明天可能是eth1,所以如果你为eth0 grep,你可能会在不同的靴子上获得不同的MAC地址.我的系统不是这样的,所以我无法真正测试,但可能的解决方案是:

>在ifconfig的输出中为HWaddr grep,但保留所有这些,而不仅仅是对应于特定NIC的那个.例如,在我的系统上,我有:

$ifconfig | grep HWaddr
eth1      Link encap:Ethernet  HWaddr 00:24:a9:bd:2c:28  
wlan0     Link encap:Ethernet  HWaddr c4:16:19:4f:ac:g5  

通过抓取两个MAC地址并通过sha256sum传递它们,您应该能够获得一个唯一且稳定的名称,无论哪个NIC被称为:

$echo $(sudo dmidecode -t 4 | grep ID | sed 's/.*ID://;s/ //g') \
     $(ifconfig | grep -oP 'HWaddr \K.*' | sed 's/://g') | sha256sum |
      awk '{print $1}'
662f0036cba13c2ddcf11acebf087ebe1b5e4044603d534dab60d32813adc1a5    

请注意,散列与上面的散列不同,因为我将ifconfig返回的两个MAC地址传递给sha256sum.
>根据您的硬盘驱动器的UUID创建一个哈希:

$blkid | grep -oP 'UUID="\K[^"]+' | sha256sum | awk '{print $1}'
162296a587c45fbf807bb7e43bda08f84c56651737243eb4a1a32ae974d6d7f4
上一篇:c – 数据库结构和硬盘驱动器寻求时间混乱


下一篇:Android C代码回调java方法