Öncelikle, CPUID'nin Intel Pentium III'ten sonraki herhangi bir sistem için kesinlikle yaygın olarak erişilebilen benzersiz bir tanımlayıcı işaret olmadığını lütfen unutmayın . MAC adresleri ile karıştırmak kesinlikle benzersiz işaretlere yol açabilir, ancak bu sadece MAC'lerin kendilerinin benzersiz niteliklerinden kaynaklanır ve bu durumda CPUID durumdan başka bir şey değildir. Dahası, ortaya çıkan hashın anakartın UUID'sinden daha benzersiz olması muhtemel değildir ve alınması çok daha kolaydır ve süreç hataya çok daha az eğilimlidir. Gönderen wikipedia.org/wiki/cpuid :
EAX = 3 : İşlemci Seri Numarası
Ayrıca bkz: Pentium III § Gizlilik sorunları hakkında tartışma
Bu işlemcinin seri numarasını döndürür. İşlemci seri numarası Intel Pentium III'te tanıtıldı, ancak gizlilik endişeleri nedeniyle bu özellik daha sonraki modellerde uygulanmıyor (PSN özellik biti her zaman temizlenir). Transmeta'nın Efficeon ve Crusoe işlemcileri de bu özelliği sağlar. Ancak AMD işlemciler bu özelliği hiçbir CPU modelinde uygulamamaktadır.
Ayrıştırılmış bir cpuid'i yaparak cat /proc/cpuinfo
veya hatta sadece kendiniz görüntüleyebilirsiniz lscpu
.
Bu, linux çekirdeği tarafından tanınan ağ arabirimleri için tüm MAC adreslerini alır, sanırım:
ip a | sed '\|^ *link[^ ]* |!d;s|||;s| .*||'
Rastgele oluşturulmuş MAC'lara sahip sanal nics içeriyorsa, bu listeye filtre uygulamak gerekebilir. Bunu ip
doğrudan çağrıdaki bayraklarla yapabilirsiniz . Bunun ip a help
nasıl yapılacağı hakkında bilgi için bkz .
Ayrıca, bu sorunun benzersiz olduğunu ip
ve kullanmanız durumunda ele alınması gerektiğini ifconfig
, ancak ağ paketinin birip
parçası olan ve aktif olarak bakımı yapılan - bir üye olan - daha güvenilir bir şekilde ele alınabileceğini unutmayın. ait paketin Linux ve son testere 2001 yılında bırakma . Çekirdeğin son sürümünden bu yana değişen özellikler nedeniyle, bazı ağ özelliği bayraklarını yanlış bildirdiği bilinmektedir ve mümkünse kullanımından kaçınılmalıdır.iproute2
ifconfig
net-tools
ifconfig
Bununla birlikte, çekirdek arabirim adları ile filtrelemenin böyle eth[0-9]
güvenilir bir yöntem olmadığını anlayın, çünkü bunlar udev
önyükleme işlemi sırasında paralel algılama sırasına göre değişebilir . Bununla ilgili daha fazla bilgi için lütfen Öngörülebilir Ağ Adlarına bakın .
Çünkü dmidecode
benim sistemde yüklü değil ben ilk başta gibi oluşturulan sabit disk seri listesi karma düşündüm:
lsblk -nro SERIAL
Do lsblk --help
bu listeyi rafine bazı ipuçları - Disk tipine göre, derler. Ayrıca düşünün lspci
ve / veya lsusb
belki.
Bunları birleştirmek kolaydır:
{ ip a | sed ... ; lsblk ... ; } | #abbreviated... for brevity...
tr -dc '[:alnum:]' | #deletes all chars not alphanumeric - including newlines
sha256sum #gets your hash
Bana bildirdiğiniz gibi, kullanıcının kaynaklarını benzersiz kimliklerine girdiğinizde kilitliyorsunuz ve sabit disklerin varlığına güvenilemiyor, yapışmamı değiştirmeyi düşündüm.
Bu göz önüne alındığında, dosya sistemine tekrar baktım ve /sys/class/dmi/id
klasörü buldum . Birkaç dosyayı kontrol ettim:
cat ./board_serial ./product_serial
###OUTPUT###
To be filled by O.E.M.
To be filled by O.E.M.
Ancak, bu oldukça iyi görünüyor, ancak çıktıyı yayınlamayacağım:
sudo cat /sys/class/dmi/id/product_uuid
dmidecode
Zaten onun bilgilerinin çoğunu burada alıyor ve aslında öyle görünüyor . Buna göre man dmidecode
, argümanı belirterek bu aracı kullanmanızı büyük ölçüde basitleştirebilirsiniz:
dmidecode -s system-uuid
Yine de daha basit, sadece dosyayı okuyabilirsiniz. Bu dosyanın özellikle bir anakartı tanımladığını unutmayın. İşte, 2007 yılında, bu ihracatları /sysfs
sanal dosya sistemine uygulayan çekirdek düzeltme ekinden bir alıntı :
+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);
Anakart yeterliyse, bu verileri sistemi tanımlamak için tek başına kullanabilirsiniz. Ancak bu bilgileri, sabit disklerle yapabileceğinizi gösterdiğim gibi sistemin MAC'leriyle birleştirebilirsiniz:
sudo sh <<\CMD | tr -dc '[:alnum:]' | sha256sum
ip a | sed '\|^ *link[^ ]* |!d;s|||;s| .*||'
cat /sys/class/dmi/id/product_uuid
CMD
Linux çekirdeği ayrıca sizin için UUID'ler de oluşturabilir:
cat /proc/sys/kernel/random/uuid #new random uuid each time file is read
Veya:
cat /proc/sys/kernel/random/boot_id #randomly generated per boot
Verilmiş, rasgele oluşturulmuş ve sen tekrar düşünmek kimlik ataması zorunda kalacak, ancak alır gibi yaklaşık olarak kolay olsun en azından. Ve bunu anahtarlamak için bir yol bulabilirseniz oldukça sağlam olmalıdır.
Son olarak, her EFI sabit yazılım ortamı değişkeni kendi UUID'sini içerdiğinden, UEFI sistemlerinde bunu yapmak çok daha kolay hale gelir. Ortam değişkeni {Platform,}LangCodes-${UUID}
her UEFI sisteminde bulunmalı, yeniden başlatmalara ve hatta çoğu ürün yazılımı yükseltmelerine ve değişikliklerine devam etmelidir ve efivarfs
modül yüklü herhangi bir Linux sistemi adlardan birini veya her ikisini aşağıdaki gibi basit bir şekilde listeleyebilir:
printf '%s\n' /sys/firmware/efi/efivars/*LangCodes-*
Eski form - LangCodes-${UUID}
görünüşe göre artık kullanılmıyor ve daha yeni sistemlerde olmalı, PlatformLangCodes-${UUID}
ancak spesifikasyonlara göre, her UEFI sisteminde bir veya diğeri mevcut olmalıdır. Biraz çaba harcamadan, kendi yeniden başlatma kalıcı değişkenlerinizi tanımlayabilir ve belki de çekirdeğin UUID üretecini bu şekilde daha fazla kullanabilirsiniz. Eğer ilgileniyorsanız, efitools'a bakın .