- Уникальные идентификаторы в GNU/Linux
- Нет пророка в своём отечестве.
- Идентификаторы операционной системы в Linux
- Получите уникальный идентификатор компьютера в Python в windows и linux
- 11 ответов
- Как узнать UUID в Linux
- Формат UUID
- Как узнать (найти) UUID
- Использование команды lsblk
- Использование команды ls
- Заключение
- получить уникальный идентификатор машины
Уникальные идентификаторы в GNU/Linux
Когда Вы пишете программу, которая должна взаимодействовать с приложениями, запущенными другим пользователем, в другой сессии или на другом компьютере, возникает необходимость в использовании уникальных идентификаторов. Они могут быть привязаны к различным аппаратным и программным объектам, либо присваиваться каждому процессу на время его выполнения. И зачастую, при выборе идентификатора, программист совершает ошибку.
Так начинается опубликованная на 0pointer.de короткая, но содержательная статья, посвящённая различным, уникальным и не очень, идентификаторам, которыми можно пользоваться в Линуксе. Также в статье рассмотрены их достоинства и недостатки, принципы работы и почему некоторые из них применять не стоит.
статья даже не на русском. о чём новость?
Нет пророка в своём отечестве.
Подобных статей немало по всему рунету, это — раз.
Но вот эта — НА АНГЛИЙСКОМ.
Use /var/lib/dbus/machine-id! Use /proc/self/sessionid! Use /proc/sys/kernel/random/boot_id! Use getuid()! Use /dev/urandom! And forget about the rest
Не знаю, у кого как, а у меня /proc/self/sessionid совпало на всех машинах (4294967295). Очень уникальный номер.
Вроде бы на ссылку «Новости» нажимал, а тут такое вылезло.
Источник
Идентификаторы операционной системы в Linux
Виндовс несет в себе множество идентификаторов операционной системы, которые позволяют узнать конкретный экземпляр ОС — дата установки системы, номер лицензии, VolumeiID, SID, WSUS Client ID, DTC. А есть аналоги в Linux (конкретно — Debian)? Метки конкретного экземпляра ОС, установленного на конкретной машине под конкретным железом. И главное — есть ли источник, в котором можно найти информацию по этому поводу?
Но зойчем, чем мак адрес не устраивает?
Здесь у нас такое не принято, достаточно /etc/os-release.
Вполне может быть почищено какой-нибудь чистилкой логов или вручную. Если дебиан с ненужноД, то есть /etc/machine-id — уникальный (типа, так как там слишком мало символов) иденификатор машины + его можно поменять легко. Так что можно например ориентироватся на макадрес сетевухи. но ее тоже можно вытащить или поменять мак.
Можно идентифицировать машину по серийному номеру винчестера.
Ненужно идентифицировать *глобально*, но для своих нужд — можно настроить /etc/motd и сделать hostname, какое нравится.
И главное — есть ли источник, в котором можно найти информацию
Интернет большой. Вот прямо этот сайт — тоже интернет, имелась ввиду документация, литература, конкретные места компактного проживания нужной информации (не нашел). Опять таки, если не нашел информацию по идентификаторам ОС — то не смогу понять, просто не нашел или их не существует.
В «этих» ОС такое огораживание не практикуется, если тебе по служебным надобностям это надо, то сделай сам, или найми человека который это сделает за тебя.
Как-раз на днях впервые заметил эту штуку. Лоргугл, скажи зачем оно (не)нужно?
Чтобы куратору было проще.
Ну это само собой, я имею в виду какое официальное обоснование
Сходи в википедию по запросу «GUID».
Create a machine ID for journaling to work. This can be done through the following command:
Создайте идентикационный код машины, для журналирования. Это можно сделать следующей командой:
The command systemd-machine-id-setup also has an impact on the systemd-networkd service. If you don’t run this command, strange behavior like network interfaces not coming UP or network addresses not being applied will occur.
Команда systemd-machine-id-setup также влияет на работу systemd-networkd. Если вы не выполните данную команду, то этот сервис будет вести себя непредсказуемо, например сетевые интерфейсы не будут подниматься, или сетевые адреса не будут применены
Источник
Получите уникальный идентификатор компьютера в Python в windows и linux
Я хотел бы получить идентификатор, уникальный для компьютера с Python в Windows и Linux. Это может быть идентификатор процессора, серия материнской платы . или что-нибудь еще.
Я посмотрел на несколько модулей (pycpuid, psi. ) без везения.
есть идеи, как это сделать?
11 ответов
Как насчет использования MAC-адреса в качестве уникального идентификатора?
Кажется, что нет прямого способа «python» сделать это. На современном оборудовании ПК обычно есть UUID, хранящийся в BIOS — на Linux есть утилита командной строки dmidecode это может прочитать это; пример с моего рабочего стола:
проблема с MAC-адресами заключается в том, что обычно вы можете легко измените их программно (по крайней мере, если вы запустите ОС в виртуальной машине)
в Windows вы можете использовать это C API
для Windows вам нужно DmiDecode для Windows (ссылке):
для Linux (не root):
или если вы не хотите использовать подпроцесс, (это медленно) использовать под. Это для Linux non root.
Вы можете использовать это так:
вызовите один из них в оболочке или через канал в Python, чтобы получить серийный номер аппаратного обеспечения компьютеров Apple под управлением OS X >= 10.5:
/usr/sbin/system_profiler SPHardwareDataType | fgrep ‘Serial’ | awk ‘
ioreg -l | awk ‘/IOPlatformSerialNumber/ < print >‘ | sed s/\»//g
BTW: MAC-адреса не являются хорошей идеей: в машине может быть >1 сетевая карта, а MAC-адреса могут быть поддельный.
Я не думаю, что есть надежные, кросс-платформенный способ сделать это. Я знаю одно сетевое устройство, которое изменяет свой MAC-адрес как форму сообщения об ошибках оборудования, и есть миллион других способов, которыми это может потерпеть неудачу.
единственное надежное решение для вашего приложения, чтобы назначить уникальный ключ для каждой машины. Да, его можно подделать, но вам не нужно беспокоиться о том, что он полностью сломается. Если вы беспокоитесь о спуфинге, вы можете применить какую-то эвристику (например, изменение mac-адреса), чтобы попытаться определить, был ли перемещен ключ.
обновление: можно использовать бактериальные отпечатки пальцев.
Источник
Как узнать UUID в Linux
UUID (Universally Unique identifier) — это 128 битный уникальный номер, стандартизированный Open Software Foundation. UUID помогает идентифицировать разделы в системах Linux. Он генерируется с помощью библиотеки libuuid (используемой e2fsprogs), которая является частью util-linux. Доступна сразу после установки Linux начиная с версии ядра 2.15.1.
UUID создается в локальной системе и всегда уникален.
Если ваша система использует много хранилищ данных, таких как SAN, ISCSI и т. д., то у UUID появляется преимущество. Каждый раз, когда вы перемещаете хранилище, вам не нужно беспокоиться об обновлении /etc/fstab.
В этой статье вы узнаете, как найти UUID накопителей в системе Linux.
Формат UUID
UUID отображается в пяти группах, разделенных дефисами, в виде 8-4-4-4-12 в общей сложности 36 символов.
Как узнать (найти) UUID
В системах на базе Linux/Unix вы можете использовать некоторые утилиты командной строки для поиска UUID устройств. Вы можете найти UUID всех разделов диска системы Linux с помощью команды blkid. Чтобы найти UUID разделов диска, подключенных к вашей системе, выполните следующую команду.
Вы получите следующий результат:
Использование команды lsblk
Вы можете найти UUID разделов устройств с помощью команды lsblk. Например чтобы вывести список UUID разделов устройств, выполните следующую команду lsblk.
$ sudo lsblk -o PATH,SIZE,RO,TYPE,MOUNTPOINT,UUID,MODEL
Ответ терминала будет следующим:
Вывод списка UUID с помощью команды lsblk
Использование команды ls
В системах Linux сделано так что ОС показывает все устройства как файлы. Таким образом, разделы UUID хранятся в виде файла.
Вы можете перечислить все UUID разделов с помощью команды ls. Для этого вам потребуется ввести:
Ответ в терминале вы увидите следующий.
Перечисление UUID с помощью команды ls
Заключение
Помните, что UUID будет не очень полезен при работе на ноутбуках или домашних компьютерах. Там где обычно не используются высококачественные устройства хранения данных.
Источник
получить уникальный идентификатор машины
Постоянно использую один внешний hdd, загружая с него Linux систему на разных машинах. Хочу написать скрипт для автоматизации рутинных действий по индивидуальной настройке hardware с вызовом разных программ для разных машин.
Т.е. напр.
If (Home)
cp /etc/X11/xorg-home.conf. /etc/X11/xorg.conf
if (Notebook)
/etc/init.d/wpa_supplicant start
и т.п
Вот только как отличать друг от друга различные компьютеры в скрипте? Нужен уникальный идентификатор машины.
По смыслу подошел бы например серийный номер. мат. платы, процессора или что-то в этом духе, но как получить эту информацию в скрипте я не знаю.
Думал про легко доступные вещи типа MAС-адреса сетевых карточек и серийников hdd но это будет не очень надежно (сетевух может быть много, hdd может поменяться и тп.).
Есть ли ещё какие-то доступные из скрипта id, которые можно использовать в качестве уникального идентификатора машины?
Может подойдёт вывод dmidecode.
Как насчет hostname?
Только не hostname, а hostid. Хотя это все равно что взять mac от первой сетевой карты в системе, вроде от него вычисляется. Главное чтобы /etc/hostid не сушествовал.
Он же сам не меняется =/
dmidecode | grep UUID — уникальный id мат платы.
$ cpuid | grep «Processor serial»
Processor serial: 0001-06CA-0000-0000-0000-0000
dmidecode | grep UUID — уникальный id мат платы.
Чтобы SPD прочитать нужен модуль.
От рута dmidecode возвращает искомый UUID безо всяких modprobe eeprom, но насколько я понял условие задачи, рута может и не быть. Не говоря уже о том, что modprobe сам по себе требует рута.
Может не eeprom, у меня он тоже не загружен, i2c может быть. Не важно, раз от рута работает.
dmidecode от юзера у меня «not found», cpuid — работает.
The processor serial number was introduced on Intel Pentium III, but due to privacy concerns, this feature is no longer implemented on later models (PSN feature bit is always cleared).
dmidecode от юзера у меня «not found»
А у меня «/dev/mem: Permission denied» даже после добавления юзера в группу kmem и выдаче kmem прав на запись в /dev/mem (право на чтение у kmem и так есть).
Скопировал dmidecode /usr/sbin/ в /usr/bin/ и получил то же самое.
даже после добавления юзера в группу kmem и выдаче kmem прав
Похоже не в правах дело. Даже после chmod 777 на /dev/mem
# dmidecode 2.11
/dev/mem: Operation not permitted
ядро не дает напрямую читать, защита включена
Что за защита кроме прав? Уже интересно. Руту дает, юзеру не даёт, Как знает кто есть кто?
Куски стрейса, на /dev/mem 777. Рут:
Лол, и что это должно дать?
В ядре может быть что угодно. man capabilities
Ты прав, ЛОЛ. Достаточно было полный путь указать. Т.к. /usr/sbin не в $PATH у юзера.
lsusb | base64 | md5sum 640cb464dff295e9f8d99f41bfc41aba —
Вот тебе и уникальный идентификатор
Вместо lsusb выбрать что-то по стабильней lspci к примеру
dmidecode | grep UUID — уникальный id мат платы.
очень уникальный у моего десктопа 🙂
А не, походу ошибся, у меня даже руту не даёт.
но насколько я понял условие задачи, рута может и не быть.
Это в какой системе можно писать в /etc/X11/ обычному пользователю?
От рута dmidecode возвращает искомый UUID безо всяких modprobe eeprom, но насколько я понял условие задачи, рута может и не быть. Не говоря уже о том, что modprobe сам по себе требует рута.
А системные конфиги ты собрался от пользователя менять, а не от рута? И init-скрипты тоже запускать от пользователя будешь?
most (less) — читает.
🙂 Там далее в простыне был вендор материнской платы ASRock. Я к тому, что на самосборных ПК этот UUID считать уникальным рискованно.
Вообще, этот UUID (по назначению) — идентификатор всей системы, а не материнки
Вот только как отличать друг от друга различные компьютеры в скрипте? Нужен уникальный идентификатор машины.
/sbin/fdisk -l | sed -rn ‘/Disk identifier: /p’ выдаст несколько идентификаторов дисков и флешек. Я их юзаю.
Они создаются при разметке устройства.
PS: важно: их можно клонировать командой dd.
мамка тоже может поменяться. Как раз hdd удобнее, если ты его на другую мамку сунул или клонировал.
Поскольку с получением по-настоящему уникального железного идентификатора машины вылезают всякие проблемы, я бы разово создал через uuidgen и хранил где-нибудь на каждом хосте метку.
тоже годное решение. Но я просто задаю hostname уникальный, и немного осмысленный.
Значит, я недопонял условие задачи, только и всего.
да ты, похоже, вообще топ не читал, там же первой строкой идёт:
Постоянно использую один внешний hdd, загружая с него Linux систему на разных машинах.
и как тут без рута?
А где хранить метку то? Ведь по условиям задачи речь идёт о загрузке разного железе с одно и того же внешнего винта. Нет никаких гарантий, что в системе есть другие диски, и что там есть место что-то хранить.
Тогда я бы взял MAC в качестве идентификатора. Вероятность обмена местами сетевых карт на двух хостах низка, а сложность других методов автоопределения снижает общую надёжность самого автоопределения.
В конце концов, если у скрипта возникают сомнения в достоверном определении, можно и у пользователя спросить, какой сценарий выполнять дальше.
Постоянно использую один внешний hdd, загружая с него Linux систему на разных машинах.
Для того, чтобы загрузить ту или иную ОС (в частности, Linux) с того или иного устройства, не нужен не то, что рут, но и вообще какая-либо учетка в этой ОС. Для дальнейшей работы в загруженном Linux рут вообще говоря не принципиален и даже вреден. Другое дело, что «скрипт для автоматизации рутинных действий по индивидуальной настройке hardware с вызовом разных программ для разных машин» без рута не обойдется, кто бы спорил.
да, рут присутсвует, сетевых карточек а также, других hdd может и не быть.
За dmidecode спасибо, на retail системах это может быть решением.
hostid прямой связи с mac не имеет, определяется софтом и насколько я понимаю тупо может быть изменен в любой момент вызовом sethostid().
Но вообще как подсказал qbe
информация dmidecode не очень то и надежная и в ряде случаев производители на неё забивают.
Лучше и проще всего MAC адрес.
Я предложил hostname потому что для меня это самый удобный способ идентификации машины. Зачем же привязываться к железу, если можно просто дать человекочитаемое название, для чтения которого не нужен root?
Не понял, нужен динамический id? Если ты о том, чтобы ручками изменить hostname, то это делается за минуту.
да, рут присутсвует, сетевых карточек а также, других hdd может и не быть.
вообще я бы посоветовал не привзываться к идентификации «машины» как цельного объекта, а привязываться к тому, что ты в данный момент хочешь настроить.
например:
if(видеокарта hd8700)
cp /etc/X11/xorg.conf.hd8700 /etc/X11/xorg.conf
.
if(есть вай-фай карта с маком 00:ab:cd:ef )
service networkManager start
кстати, для подобных действий есть уже готовое решение — правила udev 🙂
Идея хорошая, но например для моего «Intel(R) Core(TM) i7-2630QM» никаких serial в /proc/cpuinfo не наблюдается
информация dmidecode не очень то и надежная
Там много строк, не обязательно привязываться к конкретному параметру, можно сразу к нескольким. И вы же пишите под себя, под конкретные компьютеры, зачем сразу же думать о плохом 🙂
А так, компьютерное железо позволяет сделать полные клоны, если прозводитель забъёт на id, ЕМНИП, как-то давно видел материнки у которых всё было по нулям, даже MAC-адреса встроенных сетёвок.
вообще я бы посоветовал не привзываться к идентификации «машины» как цельного объекта, а привязываться к тому, что ты в данный момент хочешь настроить.
кстати, для подобных действий есть уже готовое решение — правила udev 🙂
нет, udev для моих задач не удобен. При появлении каждого устройства надо будет добавлять его руками в udev.rules. Идентификация устройства в ряде случаев будет сложнее инициализации, каждый раз надо думать по какому id, шине и пр. опознавать устройстово, копировать серийники из /sys и т.п. Кроме того ну не делать же через udev вещи типа «поставить на разных машинах разные обои» 🙂
Для моих задач проще сначала опознать машину и сделать для неё скриптами доп. инициализацию всех устройств и настройку программ в зависимости от роли этой машины. А при появлении нового девайса не морочиться с его опознанием и добавить строчку инициализации в скрипт.
Вообщем как и ожидалось простого и универсального решения не существует, для себя попробую пока такой вариант
При появлении каждого устройства надо будет добавлять его руками в udev.rules
чем это отличается от
А при появлении нового девайса не морочиться с его опознанием и добавить строчку инициализации в скрипт.
по-моему абсолютно одно и та же последовательность действий при определенном навыке.
обои выставлять нет смысла, но обои вообще выставлять от рута — довольно странная идея (если это конечно не дефолтная обоина для всех пользователей, тогда удев вполне себе вариант).
Источник