我想从任何类Unix系统(如果可能的话)获得一个唯一的id,每次我的应用程序在同一台机器上运行时它都会持久化.如果有可能,我想从Linux或FreeBSD或Solaris等获得相同的ID ...我不想为每台机器生成一个新的id,但是获得一个已经存在的id,我更喜欢这个id来自操作系统,我不喜欢使用类似MAC地址的东西.
如果没有其他可用选项,我可以将MAC与其他内容结合使用,例如id可以是MAC地址组合的md5哈希值.
我想听听你的建议.
如果它有用,我的应用程序是用C/C++编写的.
所有这一切的目的是阻止用户运行我的应用程序两次或更多次.我想只运行一次.
根文件系统的UUID怎么样?您可以/etc/fstab
通过手动解析文件或使用getfsent (3)
或来获取根文件系统设备getfsfile (3)
.一旦你的设备,你可以通过检查环节中获得UUID /dev/disk/by-uuid
或从blkid
命令.
Solaris和Linux都提供了hostid
(1)实用程序
像往常一样,最好的方法是看看其他人是如何解决同样的问题的.
FLEXlm还为其节点锁定许可证使用主机标识符.它使用的最常见的主机标识符是您的一个网络接口的以太网MAC地址,在没有任何分隔符的情况下粉碎在一起.
它还可以使用(在Windows上)C:驱动器的卷序列号(再次在没有任何分隔符的情况下一起打碎),在Solaris上输出hostid
命令(IIRC,在Sun计算机上,这个数字实际上是唯一的,位于系统板上的小型可移动EEPROM).
虽然MAC地址非常容易伪造,但它现在几乎是普遍的标识(几乎所有新计算机都至少有一个以太网端口,并且它们在板上非常普遍),并且实际上是全球唯一的(在事实上,以太网协议依赖于这种独特性.这种方法会遇到的主要问题是:
有些计算机有几个以太网地址; 其中一些在主板上,一些在单独的可移动卡上.
它们非常容易伪造(一些协议依赖于能够改变它们).
某些虚拟化环境会在每次启动时生成随机的以太网地址(但它们通常可以强制使用固定值).
另一个选择是使用从dmidecode派生的信息,这是linux上的一个命令.此信息从/ dev/mem解码,因此需要root访问权限.
知道dmidecode读取的信息是有缺陷的,因为一些主板制造商谎言或假冒某些领域.