我有一个许可证服务器。 硬件失败。
许可证软件取决于/usr/bin/hostid返回的系统的“hostid”。 hostid是唯一的“当前主机的数字标识符”。
如果我将软件迁移到另一台主机上,似乎“hostid”将会更改,许可证软件将失败。 请注意,这个系统的主机名和IP地址将保持不变。
两个问题:
hostid是如何确定的? 它是随机的,它取决于主机名或MAC地址等?
我可以在新系统上设置hostid,使其与旧系统的hostid相匹配吗?
在这里假设你所指的是传统的unix hostid。 如果我想把软件绑定到一个系统上,我会使用一个encryption狗或者一些更强的方法来识别一个系统,因为这个系统是非常随意的,但是尽pipe如此..
使用库调用“gethostid”检索hostid。 它只是一个通用的值,如果未设置的话,将基于主机系统的ipv4地址。
请参阅“man 2 gethostid”
在glibc实现中,如果gethostid()无法打开包含主机ID的文件,则使用gethostname(2)获取主机名,将该主机名传递给gethostbyname_r(3)以获取主机的IPv4地址,并返回一个值通过比特扭转IPv4地址获得。 (这个值可能不是唯一的。)
你可以自己设置任何你想要的东西,把文件/ etc / hostid放在你想要的值的地方(大概就是你的捐赠箱上的'hostid'程序出来的)。
要设置它是一个小窍门虽然..该文件需要hostid压缩的二进制表示。
我用python,但你可以做任何事情..(很确定有人知道一个更简单的方法来打印压缩字节)。
from struct import pack f = open('/etc/hostid', 'w') f.write(pack('i', 12345)) f.close()
这将设置hostid的方式,gethostid将返回与捐赠框相同的值作为迁移框。
Afaik hostid要么是(primary?)网卡的MAC地址,要么是某种带有其他值(如IP地址)的混合标识符(这很大程度上取决于您所运行的* nix种类)。
我想,应该有可能在任何系统上“伪造”这个值(至less可以覆盖mac地址)。 但是,最好的方法是要求软件供应商将许可证转移到新系统。 我不明白为什么这是不可能的。