Получение уникального идентификатора из Unix-подобной системы - PullRequest
22 голосов
/ 30 ноября 2008

Я хочу получить из любой Unix-подобной системы (если это возможно) уникальный идентификатор, который будет постоянным каждый раз, когда мое приложение запускается на той же машине. Если это возможно, я хочу получить тот же идентификатор из Linux, FreeBSD, Solaris и т. Д. Я не хочу генерировать новый идентификатор для каждой машины, но получаю уже существующий идентификатор, и я предпочитаю этот идентификатор происходят из операционной системы, и я не предпочитаю использовать что-то вроде MAC-адреса.

Если нет другой доступной опции, я могу использовать MAC в сочетании с чем-то другим, например, id может быть хешем md5 комбинации MAC-адреса и чего-то еще.

Я бы хотел выслушать ваши предложения.

Если это полезно, мое приложение написано на C / C ++.

Цель всего этого - не дать пользователю запускать мое приложение два или более раз. Я хочу бежать только один раз.

Ответы [ 14 ]

28 голосов
/ 05 декабря 2008

Как насчет UUID корневой файловой системы? Вы можете получить устройство корневой файловой системы из /etc/fstab, либо вручную проанализировав файл, либо используя getfsent (3) или getfsfile (3). Получив устройство, вы можете получить UUID, проверив ссылки в /dev/disk/by-uuid или с помощью команды blkid.

11 голосов
/ 30 ноября 2008

Как Solaris, так и Linux предоставляют утилиту hostid (1)

9 голосов
/ 30 ноября 2008

Лучший способ, как обычно, посмотреть, как другие люди уже решили ту же проблему.

FLEXlm также использует идентификатор хоста для своих лицензий с блокировкой узла. Самым распространенным идентификатором хоста, который он использует, является MAC-адрес Ethernet для одного из ваших сетевых интерфейсов, разделенный без разделителя.

Он также может использовать (в Windows) серийный номер тома диска C: (снова разделенный без разделителей), а в Solaris вывод команды hostid (IIRC, на компьютерах Sun это число равно на самом деле уникальный, и находится на небольшой съемной EEPROM на системной плате).

Хотя MAC-адрес очень легко подделать, в настоящее время он является почти универсальным идентификатором (почти все новые компьютеры имеют по крайней мере один порт Ethernet, и они очень часто используются на борту) и фактически предназначены для глобального использования уникальны (фактически, протоколы Ethernet зависят от этой уникальности). Основные проблемы, с которыми вы столкнетесь при таком подходе:

  • Некоторые компьютеры имеют несколько адресов Ethernet; некоторые из них находятся на основной плате, некоторые на отдельных сменных картах.
  • Их очень легко подделать (и некоторые протоколы зависят от возможности их изменения).
  • Некоторые виртуализированные среды генерируют случайные адреса Ethernet при каждой загрузке (но обычно у них есть способ принудительно установить фиксированное значение).
5 голосов
/ 03 декабря 2008

Другой вариант - использовать информацию, полученную из dmidecode , команды, представленной в linux. Эта информация декодируется из / dev / mem, поэтому требуется root-доступ.

Известно, что информация, считываемая dmidecode, неверна, так как некоторые производители материнских плат лгут или подделывают некоторые поля.

3 голосов
/ 01 декабря 2008

Не существует общего и надежного способа получить то, что вы хотите.

3 голосов
/ 30 ноября 2008

Я не думаю, что это возможно. Самое близкое, что вы можете получить, - это создать очень длинную случайную строку (как MS делает с GUID) и сохранить ее где-нибудь в вашей системе.

1 голос
/ 02 апреля 2015

Вы можете получить UUID корневой файловой системы /, которая достаточно надежна, но она не будет различать chroot и, возможно, vms, работающие на одном диске.

Если вы в основном имеете дело с внутренними или статическими жесткими дисками, предназначенными для работы с конкретной ОС, тогда вы сможете использовать UUID корневой файловой системы для обнаружения системы.

Вы можете получить UUID root fs примерно так: alias sys_guid='sudo /sbin/blkid | grep "$(df -h / | sed -n 2p | cut -d" " -f1):" | grep -o "UUID=\"[^\"]*\" " | sed "s/UUID=\"//;s/\"//"'

Если вам необходимо дополнительно провести различие между версиями ядра одной и той же ОС или разными ОС, работающими на одном диске, вы можете использовать данные из uname и / или объединить их с UUID root fs.

1 голос
/ 30 ноября 2008

Вы не упоминаете, насколько стабильным должен быть уникальный идентификатор - всегда ли вы хотите, чтобы один и тот же хост генерировал один и тот же идентификатор при каждом запуске кода?

Если нет, то предложение fuzzymonk о uuidgen - это то, что вы хотите.

Если да, то вам нужно решить, что значит "то же самое", насколько это важно для принимающей стороны. Одним из способов, как вы предлагаете, является сумма MD5 MAC первого интерфейса Ethernet и «что-то». Для «чего-то» в этом случае я бы рассмотрел полное доменное имя, если только ваше понятие «тот же хост» не включает изменение полного доменного имени ...

1 голос
/ 30 ноября 2008

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

Однако процессор сохраняет уникальный серийный номер, но доступ к нему должен быть разным в разных системах.

0 голосов
/ 23 марта 2016

Ответы от Jason Day и A.Danischewski, кажется, находятся на правильном пути, но не соответствуют вашим критериям любой "Unix-подобной системы", так как /sbin/blkid и /etc/fstab не существуют в OSX.

Единственный 100% переносимый подход заключается в выборе стандартного местоположения для файла, который будет создано вашим собственным приложением, например /etc/YOURAPP.cfg и сохраните там UUID, если он еще не существует.

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

Но, в конце концов, не существует такого понятия, как «та же самая машина». Любой компьютер не больше и не меньше, чем его компоненты + текущая конфигурация. Я не думаю, что вы можете сделать лучше, чем это, переносимо.

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