2016-03-26 25 views
7

Tôi đang cố gắng tìm một thứ gì đó mà tôi có thể sử dụng làm chuỗi/số duy nhất cho tập lệnh được sửa trong máy và dễ dàng nhận được (đa nền tảng). Tôi đoán một máy sẽ có một card mạng. Tôi không cần nó thực sự độc đáo, nhưng điều cần thiết là nó phải được cố định trong một thời gian dài và càng hiếm càng tốt.Mã định danh cố định cho máy (uuid.getnode)

Tôi biết MAC có thể được thay đổi và có thể tôi sẽ cảnh báo về nó trong tập lệnh của mình, tuy nhiên tôi không mong đợi bất kỳ ai thay đổi MAC mỗi sáng.

Những gì tôi đã đưa ra là uuid.getnode(), nhưng trong docs có:

Nếu tất cả những nỗ lực để có được những địa chỉ phần cứng thất bại, chúng tôi chọn một số 48-bit ngẫu nhiên

Liệu nó có nghĩa là cho mỗi cuộc gọi chức năng tôi nhận được một số ngẫu nhiên, do đó nó không thể sử dụng nó nếu MAC là không thể đạt được?

... trên máy có nhiều giao diện mạng địa chỉ MAC của bất kỳ một trong số chúng có thể được trả lại.

Câu này có nghĩa là getnode() có MAC ngẫu nhiên (hoặc đầu tiên) từ tất cả các mục có sẵn không? Điều gì sẽ xảy ra nếu nó nhận được MAC A trong lần chạy đầu tiên và MAC B vào lần tới? Sẽ không có vấn đề gì nếu tôi có danh sách cố định (sắp xếp, nối, tadaaa!)

Tôi hỏi vì tôi không có cách nào tự kiểm tra nó.

Trả lời

2

Tôi quản lý để kiểm tra phần đầu tiên trên thiết bị Android của tôi và trên mỗi con trăn mới chạy nó tạo ra số ngẫu nhiên, do đó, nó không thể sử dụng ở tất cả cho mục đích này.

Loại vấn đề thứ hai bị chết đuối, bởi vì nếu tài liệu đề cập đến nó có thể trả lại any one of them, thì đó không phải là thứ bạn có thể dựa vào (+ Tôi không thể tìm thấy máy tôi có thể thử nghiệm). Một gói đẹp netifaces đến giải cứu, mà làm một điều tương tự

netifaces.interfaces() # returns e.g. ['lo', 'eth0', 'tun2'] 

netifaces.ifaddresses('eth0')[netifaces.AF_LINK] 
# returns [{'addr': '08:00:27:50:f2:51', 'broadcast': 'ff:ff:ff:ff:ff:ff'}] 

Tuy nhiên tôi chứ không phải từ bỏ sử dụng máy Mac, tôi có một cái gì đó chứ không phải ổn định hơn.

Bây giờ để định danh:

1) Windows:

Thực thi này và nhận được đầu ra có thể đủ tốt:

wmic csproduct get UUID 

hoặc một tôi đã sử dụng và là có sẵn trong đăng ký (HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography):

import _winreg 
registry = _winreg.HKEY_LOCAL_MACHINE 
address = 'SOFTWARE\\Microsoft\\Cryptography' 
keyargs = _winreg.KEY_READ | _winreg.KEY_WOW64_64KEY 
key = _winreg.OpenKey(registry, address, 0, keyargs) 
value = _winreg.QueryValueEx(key, 'MachineGuid') 
_winreg.CloseKey(key) 
unique = value[0] 

2) Linux:

/sys/class/dmi/id/board_serial 

hoặc

/sys/class/dmi/id/product_uuid 

hoặc nếu không root:

cat /var/lib/dbus/machine-id 

3) Android:

Nếu bạn đang làm việc với trăn và không muốn gây rối với Java công cụ, sau đó điều này sẽ làm việc khá tốt:

import subprocess 
cmd = ['getprop', 'ril.serialnumber'] 
self.unique = subprocess.check_output(cmd)[:-1] 

nhưng nếu bạn thích Java, sau đó đi cho this answer mặc dù thậm chí ANDROID_ID 's độc đáo là khá gây tranh cãi nếu nó được phép thay đổi, do đó một số sê-ri có nhiều khả năng là đặt cược an toàn hơn.

Lưu ý rằng giống như đã được đề cập trong câu trả lời được liên kết, thậm chí ril.serialnumber có thể là rỗng/trống hoặc không tồn tại (thiếu khóa). Điều tương tự xảy ra ngay cả với chính thức Android API nơi nó đã nêu rõ điều này:

Số sê-ri phần cứng, nếu có.

Mac/iPhone: tôi không thể tìm thấy bất kỳ giải pháp như tôi không có quyền truy cập vào bất kỳ trong số này, nhưng nếu có một biến chứa giá trị máy id, sau đó bạn sẽ có thể đạt được điều đó với đơn giản subprocess.check_output()

+0

tôi không thể có được uuid android với mã này. Tôi đang sử dụng marshmallow Android và trình mô phỏng thiết bị đầu cuối được cài đặt trên đó tôi có thể thấy danh sách đầy đủ của 'getprop' nhưng' ril.serialnumber' không tồn tại. nó có cần quyền root không? – Gahan

+0

@Gahan xem [nhận xét này] (https://stackoverflow.com/questions/27368423/how-can-i-get-a-ril-serial-number-for-motorola-moto-x#comment43189061_27368423) vì sao mà hapenning. Thật không may, nhưng đối với tất cả các phương pháp để có được một định danh thiết bị duy nhất, bạn cũng nên có một "kế hoạch sao lưu" tức là có thể ném một số tập tin/chuỗi vào một hàm băm hoặc một điều tương tự. Nếu bạn đang sử dụng [Kivy] (http://kivy.org/), bạn có thể truy cập trực tiếp Android API bằng [pyjnius] (https://github.com/kivy/pyjnius/) (cần JNI). – KeyWeeUsr

+0

Tôi không sử dụng kivy.Tuy nhiên tôi có python để làm việc với tất cả các mô-đun mặc định nó đi kèm với như uuid, os, sys, subprocess vv bất kỳ mô-đun khác không có sẵn cho việc biên dịch chéo hiện tại tôi đang sử dụng. – Gahan

0

Đối Mac/iphone bạn có thể thử bên dưới lệnh:

import subprocess 
subprocess.check_output("ioreg -rd1 -c IOPlatformExpertDevice | grep -E '(UUID)'", shell=True).split('"')[-2] # for me i got it on list value -2 if having any trouble try getting it with any alternative list element. 
Các vấn đề liên quan