Я сделал бы это на двух шагах.
Создайте названный файл all_apple_a.dat
список всех файлов с "Apple_A" в имени файла:
ls | grep Apple_A > all_apple_a.dat
Создайте названный файл labelled_apples.dat
который 'маркирует' Ваши имена файлов:
perl -pe 's/(\d+_Apple)(.*)/\1=\1\2/' all_apple_a.dat > labelled_apples.dat
Как насчет этих двух:
$ 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 завтра, так что если вы воспользуетесь eth0
, вы можете получить другой MAC адрес на разных загрузках. Моя система ведет себя не так, поэтому я не могу протестировать, но возможные решения следующие:
Grep для HWaddr
в выводе ifconfig
, но сохраните их все, а не только тот, который соответствует определенной сетевой карте. Например, на моей системе у меня есть:
$ ifconfig | grep HWaddr.
eth1 Ссылка encap:Ethernet HWaddr 00:24:a9:bd:2c:28
wlan0 Ссылка 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
.
Создайте хэш на основе UUID вашего жесткого диска(ов) вместо:
$ blkid | grep -oP 'UUID="\K[^"]+' | sha256sum | awk '{print $1}'.
162296a587c45fbf807bb7e43bda08f84c56651737243eb4a1a32ae974d6d7f4
] Многие современные дистрибутивы поставляют файл []/etc/machine-id[
], содержащий, скорее всего, уникальную шестнадцатеричную 32-символьную строку. Он берется из systemd, где []manpage имеет больше информации [], и может быть подходящим для ваших целей.[
] Нужно ли менять идентификатор машины при смене аппаратного обеспечения? Используется ли идентификатор машины для защиты? Лучший способ, на мой взгляд, иметь "последовательный" ID машины - это хранить где-нибудь в системе случайную строку, и таким образом, если что-то изменится в аппаратном обеспечении, ID машины тоже не изменится. Это также хорошо для виртуализированных систем, где аппаратный доступ ограничен, а идентификатор MAC - 00:00:00:00[
] []Попробуйте что-нибудь вроде этого скрипта sh, чтобы создать и получить ID:[
] [#!/bin/sh
FILE="/etc/machine-id"
if [ ! -f $FILE ]; then
cat /dev/urandom|tr -dc A-Z0-9|head -c32 > $FILE;
fi
cat $FILE;
] Во-первых, обратите внимание, что CPUID определенно не общедоступный однозначно идентифицирующий маркер для любой системы, более поздней, чем Intel Pentium III. Хотя хеширование с помощью MAC-адресов, безусловно, может привести к появлению уникальных маркеров, это связано только с уникальными качествами самих MAC-адресов, и CPUID в этом случае не более чем косвенный. Более того, полученный хэш вряд ли будет более уникальным, чем UUID материнской платы, и его гораздо легче получить, а процесс гораздо менее подвержен ошибкам. Из wikipedia.org/wiki/cpuid :
EAX = 3 : Серийный номер процессора
См. Также: Pentium III § Споры по вопросам конфиденциальности
Это возвращает серийный номер процессора. Серийный номер процессора был введен в Intel Pentium III, но из соображений конфиденциальности эта функция больше не реализована в более поздних моделях (бит функции PSN всегда сброшен). Процессоры Transmeta Efficeon и Crusoe также предоставляют эту функцию. Однако процессоры AMD не поддерживают эту функцию ни в каких моделях процессоров.
Вы можете просмотреть проанализированный процессор самостоятельно, выполнив cat / proc / cpuinfo
или даже просто lscpu
.
Это дает вам все MAC-адреса для сетевых интерфейсов, распознаваемых ядром Linux, я думаю:
ip a | sed '\|^ *link[^ ]* |!d;s|||;s| .*||'
Возможно, потребуется отфильтровать этот список, если он может включать виртуальные сетевые устройства со случайно сгенерированными MAC-адресами. Вы можете сделать это с помощью флагов в вызове ip
напрямую. См. ip a help
для получения информации о том, как это сделать.
Также обратите внимание, что эта проблема не уникальна для ip
и ее также необходимо решать, если вы используете ifconfig
, но что ее можно более надежно решить с помощью ip
, который является частью сетевого пакета iproute2
и активно поддерживается - чем с помощью ifconfig
, который является членом net-tools
пакет и последний раз выпуск Linux был в 2001 году . Из-за изменения функций в ядре с момента его последнего выпуска ifconfig
, как известно, неверно сообщает о некоторых флагах сетевых функций , и его использования следует избегать, если это вообще возможно.
Однако следует понимать, что фильтрация с использованием имен интерфейсов ядра, таких как eth [0-9]
, не является надежным средством для этого, поскольку они могут меняться в зависимости от порядка параллельного обнаружения с помощью udev
во время загрузки. См. Предсказуемые сетевые имена для получения дополнительной информации.
Поскольку dmidecode
не установлен в моей системе, я сначала подумал хэшировать список серийных номеров жесткого диска, сгенерированный наподобие:
lsblk -nro SERIAL
Do 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
. Я проверил несколько файлов:
cat ./board_serial ./product_serial
###OUTPUT###
To be filled by O.E.M.
To be filled by O.E.M.
Тем не менее, этот выглядит довольно неплохо, но я не буду публиковать вывод:
sudo cat /sys/class/dmi/id/product_uuid
Я думаю, что dmidecode
все равно получает большую часть информации именно здесь. и на самом деле он действительно выглядит так . Согласно man dmidecode
вы также можете значительно упростить использование этого инструмента, указав аргумент:
dmidecode -s system-uuid
Еще проще, но вы можете просто прочитать файл. Обратите внимание, что этот конкретный файл определяет материнскую плату. Вот отрывок из патча ядра 2007 , который изначально реализовывал этот экспорт в виртуальную файловую систему / 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. Переменная среды {Platform,} LangCodes - $ {UUID}
должна присутствовать в каждой системе UEFI, должна сохраняться при перезагрузках и даже большинстве обновлений и модификаций прошивки, а также в любой системе Linux с Загруженный модуль efivarfs
может перечислять одно или оба имени так же просто, как:
printf '%s\n' /sys/firmware/efi/efivars/*LangCodes-*
Старая форма - LangCodes - $ {UUID}
, по-видимому, теперь устарела , и в новых системах должно быть PlatformLangCodes - $ {UUID}
, но, согласно спецификации, тот или иной должен присутствовать в каждой системе UEFI. С небольшими усилиями вы можете определить свои собственные постоянные переменные перезагрузки и, возможно, таким образом больше использовать генератор UUID ядра. Если интересно, загляните в efitools .
На многих машинах Linux файл / var / lib / dbus / machine-id
содержит уникальный идентификатор для каждого распределения Linux и может получить доступ к вызову к DBUS_GET_LOCAL_MACHINE_ID ()
. Это, вероятно, так же, как / etc / machine-id
, упомянутый выше. Он работает на виртуальных установках Linux. Я проверил его на текущих распределениях Ubuntu, Suse и Centos.
В других ответах дается ряд способов извлечения идентификаторов из оборудования. Вы можете использовать одно или несколько устройств в качестве идентификатора. Это проблематично, если вам необходимо произвольно менять местами оборудование.
Некоторые люди могут вместо этого хранить id сгенерированный идентификатор на своем жестком диске (или использовать UUID), но жесткие диски можно клонировать.
Модули TPM и безопасная загрузка могут предоставить средства привязки материнской платы и другого оборудования к установке на жесткий диск.
В таких случаях всегда немного проще, если вы дадите больше информации о том, чего хотите достичь.