从类似unix的系统中获取唯一的id

Blu*_*lue 22 unix linux uniqueidentifier

我想从任何类Unix系统(如果可能的话)获得一个唯一的id,每次我的应用程序在同一台机器上运行时它都会持久化.如果有可能,我想从Linux或FreeBSD或Solaris等获得相同的ID ...我不想为每台机器生成一个新的id,但是获得一个已经存在的id,我更喜欢这个id来自操作系统,我不喜欢使用类似MAC地址的东西.

如果没有其他可用选项,我可以将MAC与其他内容结合使用,例如id可以是MAC地址组合的md5哈希值.

我想听听你的建议.

如果它有用,我的应用程序是用C/C++编写的.

所有这一切的目的是阻止用户运行我的应用程序两次或更多次.我想只运行一次.

Jas*_*Day 28

根文件系统的UUID怎么样?您可以/etc/fstab通过手动解析文件或使用getfsent (3)或来获取根文件系统设备getfsfile (3).一旦你的设备,你可以通过检查环节中获得UUID /dev/disk/by-uuid或从blkid命令.


Mar*_*wis 11

Solaris和Linux都提供了hostid(1)实用程序

  • 在Linux glibc上,gethostid()(这是hostid使用的)返回一个基于IP地址的值,该值既不唯一也不是不变. (10认同)
  • 我刚刚在3台不同的计算机上测试了`hostid`(但同一个发行版):它为所有计算机返回相同的值. (6认同)

Ces*_*arB 9

像往常一样,最好的方法是看看其他人是如何解决同样的问题的.

FLEXlm还为其节点锁定许可证使用主机标识符.它使用的最常见的主机标识符是您的一个网络接口的以太网MAC地址,在没有任何分隔符的情况下粉碎在一起.

它还可以使用(在Windows上)C:驱动器的卷序列号(再次在没有任何分隔符的情况下一起打碎),在Solaris上输出hostid命令(IIRC,在Sun计算机上,这个数字实际上是唯一的,位于系统板上的小型可移动EEPROM).

虽然MAC地址非常容易伪造,但它现在几乎是普遍的标识(几乎所有新计算机都至少有一个以太网端口,并且它们在板上非常普遍),并且实际上是全球唯一的(在事实上,以太网协议依赖于这种独特性.这种方法会遇到的主要问题是:

  • 有些计算机有几个以太网地址; 其中一些在主板上,一些在单独的可移动卡上.
  • 它们非常容易伪造(一些协议依赖于能够改变它们).
  • 某些虚拟化环境会在每次启动时生成随机的以太网地址(但它们通常可以强制使用固定值).


小智 5

没有通用且可靠的方法来获得您想要的东西。


Phi*_*lan 5

另一个选择是使用从dmidecode派生的信息,这是linux上的一个命令.此信息从/ dev/mem解码,因此需要root访问权限.

知道dmidecode读取的信息是有缺陷的,因为一些主板制造商谎言或假冒某些领域.


Yon*_*oit 2

我认为这是不可能的。最接近的方法是创建一个非常长的随机字符串(就像 MS 对 GUID 所做的那样)并将其存储在系统上的某个位置。