如何在 Shell 脚本中生成每个主机的 UUID?

How to Generate a per-Host UUID in a Shell Script?

我正在编写一个 shell 脚本,它将部署到多台机器并连接到中央服务器。连接时,脚本应识别它 运行 所在的机器。 (这用于实现一些基本的锁定,但这对问题并不重要。)

我知道我可以使用 hostname -f 报告的主机名来识别机器。但是很多个人设备都没有唯一的主机名,例如 my-laptopworkstation 所以我对使用这个很谨慎。

我可以通过将主机名与其​​他一些不会更改的特定于主机的信息一起散列来添加熵。

echo $(hostname -f) $(uname -snmpio) | md5sum

但是增加的熵很低。我很难想到可以散列并保证不会更改的其他系统属性。 (例如,我不想添加文件系统或其他系统配置的任何属性1,因为它可能随时合法更改。)

最后,我想到了在脚本第一次 运行 时生成一个随机字符串并将其存储在某个配置文件中。这极有可能是独一无二的,并且保证不会改变。但如果可能的话,我宁愿不必管理持久状态。

理想情况下,将存在一个实用程序来获取本地系统的确定性非易失性 UUID(如块设备的 blkid)。不要求 UUID 难以伪造。这不是身份验证机制,我相信 运行 脚本的所有各方。

有没有我忽略的更好的选择?


1 从技术上讲,主机名也是一种系统配置。但是,如果我们更改它,我们预计系统将不再被识别为之前的系统。

如何生成版本 4 UUID

生成唯一标识符的最简单方法是使用 UUID。为此目的最常见的 UUID 类型是 UUID v4,这通常是正确的选择,除非您有某些特定情况(例如,命名空间要求或熵源不足)会导致您使用其他 UUID 类型之一.

如果需要,您可以使用 uuidgen on Linux, which can be found in the "uuid-runtime" package on Debian-based systems. The uuidgen tool is also installed by default OS X。在 Linux 上,该工具依赖 libuuid/dev/random 生成版本 4 UUID。如果没有高质量的随机数生成器,uuidgen 将回退到版本 1 基于时间的 UUID。

UUIDGEN(1) 说:

There are two types of UUIDs which uuidgen can generate: time-based UUIDs and random-based UUIDs. By default uuidgen will generate a random-based UUID if a high-quality random number generator is present. Otherwise, it will choose a time-based UUID. It is possible to force the generation of one of these two UUID types by using the -r or -t options.

作为一般规则,如果您能够这样做,您绝对应该坚持使用版本 4,因为版本 1 具有已知的安全风险和对其唯一性属性的限制。但是,具体用例可能会有所不同。

为了提供选项,您可以使用本地主机的 RSA 指纹。您的机器很可能已经配置了所有必要的组件。

hostkey=$(ssh-keygen -l -f /path/to/host_key.pub)

输出将包含空格和诸如此类的东西,但如果有问题,您可以解析它们。主机密钥通常在 /etc/ssh/ssh_host_* 中,但可能取决于 linux.

的分布