Intereting Posts
Управление удалением файлов linux Apache показывает страницу Blank для PHP Файл "mv" с искаженным именем по номеру inode? Планирование процесса Linux – Cap / Weight? Как приоритет дискового ввода-вывода связан с приоритетом процесса? RHEL: не может использовать утилиту ipset с ошибкой: не удается открыть сеанс для ядра rsync-сервер и клиентская проблема Могу ли я установить GPT на 32-битную систему с помощью BIOS? Почему повторное связывание монтирует создание записей для исходного каталога? Можно ли смотреть Netflix с качеством 4K на Манджаро? / home / user: ошибка смены каталога Настройки громкости alsa постоянно упираются в значение по умолчанию каждый раз, когда я включаю и выключаю свои наушники. Как это исправить? Как я могу удалить заголовки Получить данные из debian через внешний жесткий диск, командную строку и пользователя root polkit-gnome-authentication-agent-1 не запускается автоматически после обновления

генерировать согласованный уникальный идентификатор машины

Можем ли мы генерировать уникальный идентификатор для каждого ПК, что-то вроде uuuidgen, но оно никогда не изменится, если не произойдут аппаратные изменения? Я думал о слиянии CPUID и MACADDR и хэш их для создания согласованного идентификатора, но я понятия не имею, как разбирать их с использованием сценария bash, я знаю, как я могу получить CPUID из

dmidecode -t 4 | grep ID 

а также

 ifconfig | grep ether 

то мне нужно объединить эти шестнадцатеричные строки и использовать их с помощью sha1 или md5 для создания шестнадцатеричной строки фиксированной длины.
Как я могу разобрать этот вывод?

Как насчет этих двух:

 $ sudo dmidecode -t 4 | grep ID | sed 's/.*ID://;s/ //g' 52060201FBFBEBBF $ ifconfig | grep eth1 | awk '{print $NF}' | sed 's/://g' 0126c9da2c38 

Затем вы можете комбинировать и хешировать их с помощью:

 $ echo $(sudo dmidecode -t 4 | grep ID | sed 's/.*ID://;s/ //g') \ $(ifconfig | grep eth1 | awk '{print $NF}' | sed 's/://g') | sha256sum 59603d5e9957c23e7099c80bf137db19144cbb24efeeadfbd090f89a5f64041f - 

Чтобы удалить трейлинг-черту, добавьте еще один канал:

 $ echo $(sudo dmidecode -t 4 | grep ID | sed 's/.*ID://;s/ //g') \ $(ifconfig | grep eth1 | awk '{print $NF}' | sed 's/://g') | sha256sum | awk '{print $1}' 59603d5e9957c23e7099c80bf137db19144cbb24efeeadfbd090f89a5f64041f 

Как указывает @mikeserv в своем ответе , имя интерфейса может меняться между загрузками. Это означает, что сегодня eth0 может быть eth1 завтра, поэтому, если вы grep для eth0 вы можете получить другой MAC-адрес на разных ботинках. Моя система не ведет себя так, поэтому я не могу проверить, но возможные решения:

  1. Grep для HWaddr в выводе ifconfig но сохраните все из них, а не только тот, который соответствует конкретному HWaddr . Например, в моей системе у меня есть:

     $ ifconfig | grep HWaddr eth1 Link encap:Ethernet HWaddr 00:24:a9:bd:2c:28 wlan0 Link encap:Ethernet HWaddr c4:16:19:4f:ac:g5 

    Захватив оба MAC-адреса и передавая их через sha256sum , вы должны иметь возможность получить уникальное и стабильное имя, независимо от того, какой NIC называется тем, что:

     $ echo $(sudo dmidecode -t 4 | grep ID | sed 's/.*ID://;s/ //g') \ $(ifconfig | grep -oP 'HWaddr \K.*' | sed 's/://g') | sha256sum | awk '{print $1}' 662f0036cba13c2ddcf11acebf087ebe1b5e4044603d534dab60d32813adc1a5 

    Обратите внимание, что хеш отличается от хэша выше, потому что я пропускаю оба MAC-адреса, возвращаемые ifconfig в sha256sum .

  2. Создайте хэш на основе UUID вашего жесткого диска (ов):

     $ blkid | grep -oP 'UUID="\K[^"]+' | sha256sum | awk '{print $1}' 162296a587c45fbf807bb7e43bda08f84c56651737243eb4a1a32ae974d6d7f4 

Во-первых, обратите внимание, что CPUID определенно не является общедоступным однозначно идентифицирующим маркером для любой системы позже Intel Pentium III. Хотя хэширование его с помощью MAC-адресов может привести к уникальным маркерам, конечно, это связано только с уникальными качествами самих MAC и CPUID в этом случае не более чем косвенным. Более того, полученный хеш вряд ли будет более уникальным, чем UUID материнской платы, и это намного проще получить, и процесс намного менее подвержен ошибкам. Материал из wikipedia.org/wiki/cpuid :

EAX = 3 : серийный номер процессора

См. Также: Pentium III § Противоречия в вопросах конфиденциальности

Это возвращает порядковый номер процессора. Серийный номер процессора был представлен на Intel Pentium III, но из-за проблем с конфиденциальностью эта функция больше не реализована на более поздних моделях (бит функции PSN всегда очищается). Эти функции также обеспечивают процессоры Efficeon и Crusoe от Transmeta. Однако процессоры AMD не реализуют эту функцию в любых моделях процессоров.

Вы можете просмотреть проанализированный cpuid самостоятельно, выполнив cat /proc/cpuinfo или даже просто lscpu .

Это дает вам все MAC-адреса для сетевых интерфейсов, распознаваемых ядром Linux, я думаю:

 ip a | sed '\|^ *link[^ ]* |!d;s

;s| .*||'

Может потребоваться отфильтровать этот список, если он может включать виртуальные nics со случайно генерируемыми MAC-адресами. Вы можете сделать это с флагами в вызове ip напрямую. См. ip a help информацию о том, как это сделать.

Также обратите внимание, что эта проблема не уникальна для ip и также должна быть рассмотрена, если вы используете ifconfig , но что ее можно более надежно обрабатывать с помощью ip – который является частью сетевого набора iproute2 и активно поддерживается – чем он может с ifconfig – который является членом пакета net-tools и в последний раз видел выпуск Linux в 2001 году . Из-за изменения функций ядра с момента последней версии ifconfig как известно, неверно сообщает о некоторых флагов сетевых функций, и его использование следует избегать, если это вообще возможно.

Поймите, однако, что фильтрация с именами интерфейса ядра, такими как eth[0-9] , не является надежным средством для этого, поскольку они могут изменяться в зависимости от их порядка параллельного обнаружения udev во время процесса загрузки. Дополнительные сведения см. В разделе « Предсказуемые сетевые имена» .

Поскольку dmidecode не установлен в моей системе, я сначала подумал о хеш-списке серийных серий жесткого диска, например:

 lsblk -nro SERIAL 

Сделайте lsblk --help для некоторых подсказок по уточнению этого списка – например, по типу диска. Также рассмотрим lspci и / или lsusb .

Объединить их легко:

 { ip a | sed ... ; lsblk ... ; } | #abbreviated... for brevity... tr -dc '[:alnum:]' | #deletes all chars not alphanumeric - including newlines sha256sum #gets your hash 

Как вы сообщили мне, вы набираете ресурсы пользователя на свой счет для своих уникальных идентификаторов, а на жестких дисках нельзя полагаться на существование, я думал, что изменил свой подход.

/sys/class/dmi/id это, я снова просмотрел файловую систему и нашел папку /sys/class/dmi/id . Я проверил несколько файлов:

 cat ./board_serial ./product_serial ###OUTPUT### To be filled by OEM To be filled by OEM 

Однако, похоже, это очень хорошо, но я не буду публиковать вывод:

 sudo cat /sys/class/dmi/id/product_uuid 

Я ожидаю, что в любом случае dmidecode получает большую часть своей информации, и на самом деле это выглядит так . По словам man dmidecode вы также можете значительно упростить использование этого инструмента, указав аргумент:

 dmidecode -s system-uuid 

Более простой, тем не менее, вы можете просто прочитать файл. Обратите внимание, что этот конкретный файл указывает на материнскую плату. Вот отрывок из патча ядра 2007, который первоначально реализовал эти экспортные /sysfs виртуальную файловую систему /sysfs :

 +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); 

Вы можете использовать эти данные для идентификации системы – если материнской платы достаточно. Но вы можете объединить эту информацию с MAC-адресами системы так же, как я показал, что вы можете делать с жесткими дисками:

 sudo sh <<\CMD | tr -dc '[:alnum:]' | sha256sum ip a | sed '\|^ *link[^ ]* |!d;s

;s| .*||' cat /sys/class/dmi/id/product_uuid CMD

Ядро Linux также может генерировать UUID для вас:

 cat /proc/sys/kernel/random/uuid #new random uuid each time file is read 

Или:

 cat /proc/sys/kernel/random/boot_id #randomly generated per boot 

Конечно, он генерируется случайным образом, и вам придется переосмыслить идентификатор, но это примерно так же просто, как и получить хотя бы. И это должно быть довольно солидно, если вы сможете найти способ закрепить его.

Наконец, в системах UEFI это становится намного легче сделать, поскольку каждая переменная среды прошивки EFI включает в себя собственный UUID. В каждой системе UEFI должна присутствовать переменная среды {Platform,}LangCodes-${UUID} , должна сохраняться перезагрузка и даже большинство обновлений и модификаций прошивки, а любая система Linux с efivarfs модулем efivarfs может перечислить одно или оба имени так же просто, как :

 printf '%s\n' /sys/firmware/efi/efivars/*LangCodes-* 

LangCodes-${UUID} форма – LangCodes-${UUID} по-видимому, теперь устарела , а на новых системах должна быть PlatformLangCodes-${UUID} но, согласно спецификации, одна или другая должна присутствовать в каждой системе UEFI. С небольшими усилиями вы можете определить свои собственные постоянные переменные перезагрузки и, возможно, более эффективно использовать генератор UUID ядра. Если интересно, посмотрите на efitools .

Многие современные дистрибутивы отправляют файл /etc/machine-id содержащий, вероятно, уникальную шестнадцатеричную 32-символьную строку. Он исходит из systemd, где manpage имеет больше информации и может быть подходящей для вашей цели.

На многих машинах Linux файл /var/lib/dbus/machine-id содержит уникальный идентификатор для каждого дистрибутива Linux и может быть dbus_get_local_machine_id() вызовом dbus_get_local_machine_id() . Вероятно, это то же самое, что и упомянутый выше /etc/machine-id . Он также работает на виртуальных установках Linux. Я проверил его на текущих дистрибутивах Ubuntu, SuSE и CentOS.

Вам нужен идентификатор машины для изменения при изменении оборудования? Используется ли идентификатор машины для защиты чего-либо? Лучший способ, по моему мнению, иметь «согласованный» идентификатор машины – хранить случайную строку где-то в системе, и таким образом, если какое-либо из аппаратных средств изменится, то идентификатор машины также не изменится. Это также хорошо для виртуализированных систем, где доступ к аппаратным средствам ограничен, а MAC ID – 00: 00: 00: 00

Попробуйте что-то вроде этого сценария sh для создания и получения идентификатора:

 #!/bin/sh FILE="/etc/machine-id" if [ ! -f $FILE ]; then cat /dev/urandom|tr -dc A-Z0-9|head -c32 > $FILE; fi cat $FILE; и #!/bin/sh FILE="/etc/machine-id" if [ ! -f $FILE ]; then cat /dev/urandom|tr -dc A-Z0-9|head -c32 > $FILE; fi cat $FILE; 

Другие ответы дают несколько способов извлечения идентификаторов из аппаратного обеспечения. Вы могли бы решить использовать одну часть оборудования в качестве идентификатора или многих. Это проблематично, если вам нужно произвольно менять или заменять части оборудования.

Некоторые люди могут вместо этого хранить id сгенерированного идентификатора на своем жестком диске (или использовать UUID), но harddrides могут быть клонированы.

Модули TPM и безопасная загрузка могут служить средством связывания материнской платы и другого оборудования с установкой на жесткий диск.

В этих случаях всегда бывает немного легче, если вы дадите больше информации о том, чего вы хотите достичь.