ประการแรกโปรดทราบว่า CPUID นั้นไม่ใช่เครื่องหมายระบุตำแหน่งที่สามารถเข้าถึงได้โดยทั่วไปสำหรับระบบใด ๆ หลังจาก Intel Pentium III ในขณะที่การแฮ็คมันด้วยที่อยู่ MAC อาจนำไปสู่การทำเครื่องหมายที่ไม่ซ้ำกันอย่างแน่นอนนี่เป็นเพราะคุณสมบัติเฉพาะของ MACs เองและ CPUID ในกรณีนั้นไม่มีอะไรมากไปกว่าสถานการณ์ ยิ่งกว่านั้นการแฮชที่เกิดขึ้นนั้นไม่น่าจะมีความเป็นเอกลักษณ์ใด ๆ มากกว่าเมนบอร์ดของ UUID และง่ายต่อการดึงข้อมูลและกระบวนการนั้นมีแนวโน้มที่จะผิดพลาดน้อยกว่ามาก จากwikipedia.org/wiki/cpuid :
EAX = 3 : หมายเลขซีเรียลของโปรเซสเซอร์
ดูเพิ่มเติมที่: Pentium III §การโต้เถียงเกี่ยวกับปัญหาความเป็นส่วนตัว
ส่งคืนหมายเลขซีเรียลของโปรเซสเซอร์ หมายเลขซีเรียลของโปรเซสเซอร์ได้รับการแนะนำใน Intel Pentium III แต่เนื่องจากข้อกังวลเกี่ยวกับข้อมูลส่วนบุคคลฟีเจอร์นี้จะไม่ถูกนำไปใช้กับรุ่นภายหลัง (ฟีเจอร์บิต PSN จะถูกล้างเสมอ) โปรเซสเซอร์ Efficeon และ Crusoe ของ Transmeta มีคุณสมบัตินี้เช่นกัน อย่างไรก็ตามซีพียูของ AMD ไม่ได้ใช้คุณสมบัตินี้ในซีพียูทุกรุ่น
คุณสามารถดู CPUID แจงตัวเองด้วยการทำหรือแม้เพียงแค่cat /proc/cpuinfo
lscpu
นี่ทำให้คุณได้รับที่อยู่ MAC ทั้งหมดสำหรับเครือข่ายอินเทอร์เฟซที่ลินุกซ์เคอร์เนลรู้จักผมคิดว่า:
ip a | sed '\|^ *link[^ ]* |!d;s|||;s| .*||'
อาจจำเป็นต้องกรองรายการดังกล่าวหากอาจรวมถึง nics เสมือนจริงกับ MAC ที่สร้างแบบสุ่ม คุณสามารถทำได้ด้วยการตั้งค่าสถานะในการโทรip
โดยตรง ดูip a help
ข้อมูลเกี่ยวกับวิธีการทำ
โปรดทราบด้วยว่าปัญหานี้ไม่ได้มีลักษณะเฉพาะip
และจะต้องได้รับการจัดการหากคุณใช้ifconfig
แต่สามารถจัดการได้อย่างน่าเชื่อถือมากขึ้นip
ซึ่งเป็นส่วนหนึ่งของiproute2
ชุดเครือข่ายและได้รับการดูแลอย่างแข็งขันมากกว่าifconfig
ที่เป็นสมาชิก ของnet-tools
แพคเกจและเลื่อยที่ผ่านมาลินุกซ์เปิดตัวในปี 2001 เนื่องจากมีการเปลี่ยนแปลงฟีเจอร์ในเคอร์เนลตั้งแต่รีลีสล่าสุดifconfig
เป็นที่ทราบกันดีว่ารายงานคุณสมบัติเครือข่ายบางอย่างผิดพลาดและควรหลีกเลี่ยงการใช้งานหากเป็นไปได้
แม้ว่าจะเข้าใจว่าการกรองด้วยชื่ออินเตอร์เฟสของเคอร์เนลeth[0-9]
นั้นไม่ใช่วิธีการที่เชื่อถือได้เนื่องจากสิ่งเหล่านี้สามารถเปลี่ยนแปลงได้ตามลำดับของการตรวจจับแบบขนานโดยudev
ในระหว่างกระบวนการบู๊ต โปรดดูชื่อเครือข่ายที่คาดการณ์ได้สำหรับข้อมูลเพิ่มเติม
เนื่องจากdmidecode
ไม่ได้ติดตั้งบนระบบของฉันฉันในตอนแรกคิดว่าจะแฮชรายการของ serials ฮาร์ดดิสก์ที่สร้างเช่น:
lsblk -nro SERIAL
ทำ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
ได้รับมันถูกสร้างขึ้นแบบสุ่มและคุณจะต้องคิดใหม่การกำหนด ID แต่มันเป็นเรื่องง่ายเหมือนที่จะได้รับอย่างน้อย และมันควรจะค่อนข้างมั่นคงถ้าคุณสามารถหาวิธีที่จะทำให้มันสำคัญ
สุดท้ายในระบบ UEFI สิ่งนี้จะง่ายกว่ามากเนื่องจากตัวแปรสภาพแวดล้อมเฟิร์มแวร์ของ EFI ทุกตัวมี UUID ของตนเอง ตัวแปรสภาพแวดล้อม{Platform,}LangCodes-${UUID}
ควรมีอยู่ในทุกระบบของ UEFI ควรมีการรีบูตและแม้กระทั่งการอัพเกรดเฟิร์มแวร์และการดัดแปลงส่วนใหญ่และระบบ Linux ใด ๆ ที่efivarfs
โหลดโมดูลสามารถแสดงรายการชื่อใดชื่อหนึ่งหรือทั้งสองชื่อได้อย่างง่ายดาย
printf '%s\n' /sys/firmware/efi/efivars/*LangCodes-*
แบบฟอร์มที่เก่ากว่า - LangCodes-${UUID}
เห็นได้ชัดว่าเลิกใช้แล้วและในระบบที่ใหม่กว่านั้นควรจะเป็นPlatformLangCodes-${UUID}
แต่ตามสเป็คหนึ่งหรืออื่น ๆ ควรจะปรากฏในทุกระบบ UEFI ด้วยความพยายามเพียงเล็กน้อยคุณสามารถกำหนดตัวแปรถาวรการรีบูตของคุณเองและอาจใช้ประโยชน์จากตัวสร้าง UUID ของเคอร์เนลมากขึ้น หากสนใจดูเป็นefitools