Đầu tiên, xin lưu ý rằng CPUID chắc chắn không phải là dấu hiệu nhận dạng duy nhất có thể truy cập phổ biến cho bất kỳ hệ thống nào muộn hơn Intel Pentium III. Mặc dù băm nó với các địa chỉ MAC chắc chắn có thể dẫn đến các điểm đánh dấu duy nhất, điều này chỉ là do các phẩm chất duy nhất của chính MAC và CPUID trong trường hợp đó không có gì khác hơn là hoàn cảnh. Hơn nữa, hàm băm kết quả không có khả năng độc đáo hơn UUID của bo mạch chủ, và điều đó dễ lấy hơn rất nhiều và quá trình này ít bị lỗi hơn. Từ wikipedia.org/wiki/cpuid :
EAX = 3 : Số sê-ri của bộ xử lý
Xem thêm: Pentium III § Tranh cãi về các vấn đề riêng tư
Điều này trả về số sê-ri của bộ xử lý. Số sê-ri bộ xử lý đã được giới thiệu trên Intel Pentium III, nhưng do lo ngại về quyền riêng tư, tính năng này không còn được triển khai trên các mẫu máy sau này (bit tính năng PSN luôn bị xóa). Bộ xử lý Efficeon và Crusoe của Transmeta cũng cung cấp tính năng này. Tuy nhiên, CPU AMD không triển khai tính năng này trong bất kỳ mẫu CPU nào.
Bạn có thể xem một cpuid được phân tích bằng cách thực hiện cat /proc/cpuinfo
hoặc thậm chí chỉ lscpu
.
Điều này giúp bạn có tất cả các địa chỉ MAC cho các giao diện mạng được nhận dạng bởi kernel linux, tôi nghĩ:
ip a | sed '\|^ *link[^ ]* |!d;s|||;s| .*||'
Có thể cần phải lọc danh sách đó nếu nó có thể bao gồm các ảnh ảo với các MAC được tạo ngẫu nhiên. Bạn có thể làm điều này với cờ trong cuộc gọi đến ip
trực tiếp. Xem ip a help
để biết thông tin về cách làm như vậy.
Cũng lưu ý rằng vấn đề này không phải là duy nhất ip
và cũng phải được xử lý nếu bạn sử dụng ifconfig
, nhưng nó có thể được xử lý một cách đáng tin cậy hơn ip
- là một phần của bộ iproute2
mạng và được duy trì tích cực - hơn là với ifconfig
một thành viên của net-tools
gói và lần cuối cùng thấy một bản phát hành Linux vào năm 2001 . Do thay đổi các tính năng trong kernel kể từ lần phát hành cuối cùng của nó, ifconfig
được biết là báo cáo sai một số cờ tính năng mạng và nên tránh sử dụng nó nếu có thể.
Tuy nhiên, hiểu rằng việc lọc với các tên giao diện kernel như eth[0-9]
không phải là một phương tiện đáng tin cậy để làm như vậy, vì chúng có thể thay đổi dựa trên thứ tự phát hiện song song của chúng udev
trong quá trình khởi động. Vui lòng xem Tên Mạng Dự đoán để biết thêm về điều đó.
Bởi vì dmidecode
không được cài đặt trên hệ thống của tôi, ban đầu tôi nghĩ sẽ băm một danh sách các sê-ri đĩa cứng được tạo như sau:
lsblk -nro SERIAL
Làm lsblk --help
cho một số manh mối về tinh chỉnh danh sách đó - theo loại đĩa, nói. Cũng xem xét lspci
và / hoặc lsusb
có thể.
Kết hợp chúng thật dễ dàng:
{ ip a | sed ... ; lsblk ... ; } | #abbreviated... for brevity...
tr -dc '[:alnum:]' | #deletes all chars not alphanumeric - including newlines
sha256sum #gets your hash
Như bạn đã thông báo cho tôi, bạn đang khóa tài nguyên của người dùng vào cuối id của họ và các đĩa cứng không thể dựa vào sự tồn tại, tôi nghĩ sẽ thay đổi chiến thuật của mình.
Điều đó xem xét, tôi nhìn vào hệ thống tập tin một lần nữa và tìm thấy /sys/class/dmi/id
thư mục. Tôi đã kiểm tra một vài trong số các tập tin:
cat ./board_serial ./product_serial
###OUTPUT###
To be filled by O.E.M.
To be filled by O.E.M.
Tuy nhiên, cái này có vẻ khá tốt, nhưng tôi sẽ không công bố đầu ra:
sudo cat /sys/class/dmi/id/product_uuid
Tôi hy vọng đó là nơi dmidecode
nhận được nhiều thông tin của nó và thực tế nó trông giống như vậy . Theo man dmidecode
bạn cũng có thể đơn giản hóa việc sử dụng công cụ đó rất nhiều bằng cách chỉ định đối số:
dmidecode -s system-uuid
Tuy nhiên, đơn giản hơn, bạn chỉ có thể đọc tệp. Lưu ý rằng tập tin cụ thể này xác định cụ thể một bo mạch chủ. Đây là một đoạn trích từ bản vá nhân năm 2007 ban đầu thực hiện các bản xuất này sang /sysfs
hệ thống tệp ảo:
+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);
Bạn có thể sử dụng dữ liệu đó một mình để xác định hệ thống - nếu bo mạch chủ là đủ. Nhưng bạn có thể kết hợp thông tin này với MAC của hệ thống giống như cách tôi đã chứng minh bạn có thể làm với đĩa cứng:
sudo sh <<\CMD | tr -dc '[:alnum:]' | sha256sum
ip a | sed '\|^ *link[^ ]* |!d;s|||;s| .*||'
cat /sys/class/dmi/id/product_uuid
CMD
Nhân Linux cũng có thể tạo UUID cho bạn:
cat /proc/sys/kernel/random/uuid #new random uuid each time file is read
Hoặc là:
cat /proc/sys/kernel/random/boot_id #randomly generated per boot
Cấp, nó được tạo ngẫu nhiên và bạn sẽ phải suy nghĩ lại về việc gán ID, nhưng nó dễ dàng như vậy để có được ít nhất. Và nó sẽ khá vững chắc nếu bạn có thể tìm một phương tiện để khóa nó.
Cuối cùng, trên các hệ thống UEFI, điều này trở nên dễ thực hiện hơn - vì mọi biến môi trường phần sụn EFI đều bao gồm UUID của chính nó. Biến môi trường {Platform,}LangCodes-${UUID}
phải có mặt trên mọi hệ thống UEFI, nên tiếp tục khởi động lại và thậm chí hầu hết các nâng cấp và sửa đổi phần sụn, và bất kỳ hệ thống Linux nào có efivarfs
mô-đun được tải đều có thể liệt kê một hoặc cả hai tên đơn giản như:
printf '%s\n' /sys/firmware/efi/efivars/*LangCodes-*
Hình thức cũ hơn - LangCodes-${UUID}
hiện rõ ràng không dùng nữa và trên các hệ thống mới hơn nên PlatformLangCodes-${UUID}
, nhưng theo thông số kỹ thuật, cái này hay cái kia nên có trong mọi hệ thống UEFI. Với một chút nỗ lực, bạn có thể xác định các biến liên tục khởi động lại của riêng mình và có thể sử dụng nhiều hơn trình tạo UUID của kernel theo cách đó. Nếu quan tâm, hãy nhìn vào efitools .