En primer lugar, tenga en cuenta que el CPUID definitivamente no es un marcador de identificación único comúnmente accesible para cualquier sistema posterior a un Intel Pentium III. Si bien el hashing con direcciones MAC puede conducir a marcadores únicos, esto se debe solo a las cualidades únicas de los MAC y el CPUID en ese caso no es más que circunstancial. Además, es probable que el hash resultante no sea más exclusivo que el UUID de la placa base, y eso es mucho más fácil de recuperar y el proceso es mucho menos propenso a errar. Desde wikipedia.org/wiki/cpuid :
EAX = 3 : Número de serie del procesador
Ver también: Pentium III § Controversia sobre cuestiones de privacidad
Esto devuelve el número de serie del procesador. El número de serie del procesador se introdujo en Intel Pentium III, pero debido a problemas de privacidad, esta característica ya no se implementa en modelos posteriores (el bit de la función PSN siempre se borra). Los procesadores Efficeon y Crusoe de Transmeta también proporcionan esta característica. Sin embargo, las CPU AMD no implementan esta característica en ningún modelo de CPU.
Puede ver un cpuid analizado usted mismo haciendo cat /proc/cpuinfo
o incluso simplemente lscpu
.
Creo que esto le proporciona todas las direcciones MAC para las interfaces de red reconocidas por el kernel de Linux:
ip a | sed '\|^ *link[^ ]* |!d;s|||;s| .*||'
Puede ser necesario filtrar esa lista si puede incluir nics virtuales con MAC generados aleatoriamente. Puede hacer esto con banderas en la llamada a ip
directamente. Consulte ip a help
para obtener información sobre cómo hacerlo.
También tenga en cuenta que este problema no es exclusivo ip
y también debe abordarse si lo usa ifconfig
, pero que puede manejarse de manera más confiable ip
, que es parte del iproute2
conjunto de redes y se mantiene activamente, de lo que puede hacerlo ifconfig
, que es un miembro del net-tools
paquete y vimos por última vez un lanzamiento de Linux en 2001 . Debido a las características cambiantes en el núcleo desde su última versión, ifconfig
se sabe que informa erróneamente algunos indicadores de características de red y su uso debe evitarse si es posible.
Sin embargo, comprenda que filtrar con nombres de interfaz de kernel como eth[0-9]
no es un medio confiable para hacerlo, ya que estos pueden cambiar según su orden de detección en paralelo udev
durante el proceso de arranque. Consulte los nombres de red predecibles para obtener más información al respecto.
Como dmidecode
no está instalado en mi sistema, al principio pensé en hacer un hash de una lista de seriales de disco duro generados como:
lsblk -nro SERIAL
Haga lsblk --help
algunas pistas para refinar esa lista, por tipo de disco, por ejemplo. También considere lspci
y / o lsusb
tal vez.
Combinarlos es fácil:
{ ip a | sed ... ; lsblk ... ; } | #abbreviated... for brevity...
tr -dc '[:alnum:]' | #deletes all chars not alphanumeric - including newlines
sha256sum #gets your hash
Como me ha informado, está poniendo los recursos del usuario de su lado en sus identificadores únicos, y no se puede confiar en que existan los discos duros, pensé que cambiaría mi táctica.
Dicho esto, busqué nuevamente en el sistema de archivos y encontré la /sys/class/dmi/id
carpeta. Revisé algunos de los archivos:
cat ./board_serial ./product_serial
###OUTPUT###
To be filled by O.E.M.
To be filled by O.E.M.
Sin embargo, este parece ser bastante bueno, pero no publicaré el resultado:
sudo cat /sys/class/dmi/id/product_uuid
Supongo que de ahí es donde dmidecode
obtiene gran parte de su información de todos modos y, de hecho, se parece . Según man dmidecode
usted, también puede simplificar mucho el uso de esa herramienta especificando el argumento:
dmidecode -s system-uuid
Sin embargo, aún más simple, solo puede leer el archivo. Tenga en cuenta que este archivo en particular identifica específicamente una placa base. Aquí hay un extracto del parche del kernel de 2007 que implementó originalmente estas exportaciones al /sysfs
sistema de archivos virtual:
+DEFINE_DMI_ATTR_WITH_SHOW(bios_vendor, 0444, DMI_BIOS_VENDOR);
+DEFINE_DMI_ATTR_WITH_SHOW(bios_version, 0444, DMI_BIOS_VERSION);
+DEFINE_DMI_ATTR_WITH_SHOW(bios_date, 0444, DMI_BIOS_DATE);
+DEFINE_DMI_ATTR_WITH_SHOW(sys_vendor, 0444, DMI_SYS_VENDOR);
+DEFINE_DMI_ATTR_WITH_SHOW(product_name, 0444, DMI_PRODUCT_NAME);
+DEFINE_DMI_ATTR_WITH_SHOW(product_version, 0444, DMI_PRODUCT_VERSION);
+DEFINE_DMI_ATTR_WITH_SHOW(product_serial, 0400, DMI_PRODUCT_SERIAL);
+DEFINE_DMI_ATTR_WITH_SHOW(product_uuid, 0400, DMI_PRODUCT_UUID);
+DEFINE_DMI_ATTR_WITH_SHOW(board_vendor, 0444, DMI_BOARD_VENDOR);
+DEFINE_DMI_ATTR_WITH_SHOW(board_name, 0444, DMI_BOARD_NAME);
+DEFINE_DMI_ATTR_WITH_SHOW(board_version, 0444, DMI_BOARD_VERSION);
+DEFINE_DMI_ATTR_WITH_SHOW(board_serial, 0400, DMI_BOARD_SERIAL);
+DEFINE_DMI_ATTR_WITH_SHOW(board_asset_tag, 0444, DMI_BOARD_ASSET_TAG);
+DEFINE_DMI_ATTR_WITH_SHOW(chassis_vendor, 0444, DMI_CHASSIS_VENDOR);
+DEFINE_DMI_ATTR_WITH_SHOW(chassis_type, 0444, DMI_CHASSIS_TYPE);
+DEFINE_DMI_ATTR_WITH_SHOW(chassis_version, 0444, DMI_CHASSIS_VERSION);
+DEFINE_DMI_ATTR_WITH_SHOW(chassis_serial, 0400, DMI_CHASSIS_SERIAL);
+DEFINE_DMI_ATTR_WITH_SHOW(chassis_asset_tag, 0444, DMI_CHASSIS_ASSET_TAG);
Es posible que pueda usar esos datos solo para identificar el sistema, si la placa base es suficiente. Pero puede combinar esta información con los MAC del sistema de la misma manera que demostré que podría hacerlo con los discos duros:
sudo sh <<\CMD | tr -dc '[:alnum:]' | sha256sum
ip a | sed '\|^ *link[^ ]* |!d;s|||;s| .*||'
cat /sys/class/dmi/id/product_uuid
CMD
El kernel de Linux también puede generar UUID para usted:
cat /proc/sys/kernel/random/uuid #new random uuid each time file is read
O:
cat /proc/sys/kernel/random/boot_id #randomly generated per boot
De acuerdo, es generado de forma aleatoria y se tendrá que replantear asignación de ID, pero es casi tan fácil como se pone a conseguir por lo menos. Y debería ser bastante sólido si puedes encontrar un medio para teclearlo.
Por último, en los sistemas UEFI esto es mucho más fácil de hacer, ya que cada variable de entorno de firmware EFI incluye su propio UUID. La variable de entorno {Platform,}LangCodes-${UUID}
debe estar presente en todos los sistemas UEFI, debe persistir los reinicios e incluso la mayoría de las actualizaciones y modificaciones de firmware, y cualquier sistema Linux con el efivarfs
módulo cargado puede enumerar uno o ambos nombres simplemente como:
printf '%s\n' /sys/firmware/efi/efivars/*LangCodes-*
La forma más antigua, LangCodes-${UUID}
aparentemente ahora está en desuso , y en los sistemas más nuevos debería estar PlatformLangCodes-${UUID}
, pero, según las especificaciones, uno u otro debería estar presente en cada sistema UEFI. Con poco esfuerzo, puede definir sus propias variables persistentes de reinicio, y tal vez hacer más uso del generador de UUID del núcleo de esa manera. Si está interesado, busque efitools .