2016-03-26 14 views
7

Próbuję znaleźć coś, co mogę użyć jako unikalny ciąg/numer dla mojego skryptu, który jest naprawiony w maszynie i łatwo dostępny (na różnych platformach). Zakładam, że komputer miałby kartę sieciową. Nie potrzebuję tego, by był naprawdę wyjątkowy, ale konieczne jest, aby został on ustalony na dłuższą metę i tak rzadki, jak to tylko możliwe.Naprawiono identyfikator komputera (uuid.getnode)

Wiem, że MAC może zostać zmieniony i prawdopodobnie będę ostrzegał o tym w moim skrypcie, jednak nie oczekuję, że ktokolwiek zmieni MAC każdego ranka.

Co wymyśliłem jest uuid.getnode(), ale w docs znajduje się:

Jeśli wszystkie próby uzyskania adresu sprzętowego nie, wybieramy losowo 48-bitowy numer

Does oznacza to, że dla każdego wywołania funkcji otrzymuję inną liczbę losową, dlatego nie można jej użyć, jeśli MAC jest nieosiągalny?

... na komputerze z wieloma interfejsami sieciowymi może zostać zwrócony adres MAC dowolnego z nich.

Czy to zdanie oznacza, że ​​getnode() otrzymuje losowy (lub pierwszy) adres MAC ze wszystkich dostępnych? Co by było, gdyby MAC A w pierwszym przebiegu i MAC B następnym razem? Nie byłoby problemu, gdybym dostał stałą listę (sort, concatenate, tadaaa!)

Pytam, ponieważ nie mam sposobu, aby przetestować to sam.

Odpowiedz

2

Udało mi się przetestować pierwszą część na moim urządzeniu z Androidem i na każdym nowym pythonie uruchomić utworzoną losową liczbę, więc nie można jej w ogóle użyć do tego celu.

Drugi problem utopił się, ponieważ jeśli w dokumentach wspomniał, że może on powrócić any one of them, to nie jest to coś, na czym można polegać (+ nie mogłem znaleźć maszyny, na której mógłbym ją przetestować). Miłym pakiet netifaces przyszedł do ratowania, która robi coś podobnego

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'}] 

jednak raczej zrezygnował z wykorzystaniem MAC, mam coś raczej stabilny.

Teraz do identyfikatorów:

1) Windows:

Wykonanie tego jednego i coraz wyjście może być wystarczająco dobre: ​​

wmic csproduct get UUID 

lub jeden użyłem i jest dostępny w rejestrze (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 

lub

/sys/class/dmi/id/product_uuid 

czy nie główny:

cat /var/lib/dbus/machine-id 

3) ANDROID

Jeśli pracujesz z python i nie chcą zadzierać z rzeczy Java, to powinno działać całkiem dobrze:

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

ale jeśli tak jak Java, a następnie przejść do this answer chociaż nawet ANDROID_ID „s wyjątkowość jest raczej dyskusyjne, jeśli można je zmienić, dlatego numer seryjny jest prawdopodobnie bezpieczniejszy.

Należy zauważyć, że jak już wspomniano w połączonej odpowiedzi, nawet ril.serialnumber może mieć wartość zerową/pustą lub nieistniejącą (brakujący klucz). To samo dzieje się nawet z oficjalnym Android API gdzie jest to wyraźnie stwierdził: numer seryjny

sprzętowym, jeśli są dostępne.

Mac/iPhone: nie mogłem znaleźć żadnego rozwiązania, ponieważ nie ma dostępu do żadnej z nich, ale jeśli nie jest to zmienna, która przechowuje wartość identyfikatora urządzenia, a następnie powinny być w stanie dostać się tam z prostego subprocess.check_output()

+0

jestem w stanie uzyskać android UUID z tym kodem. Używam Androida marshmallow i zainstalowanego na nim emulatora terminala Widzę pełną listę 'getprop', ale' ril.serialnumber' nie istnieje. czy potrzebuje uprawnień roota? – Gahan

+0

@Gahan zobacz [ten komentarz] (https://stackoverflow.com/questions/27368423/how-can-i-get-a-ril-serial-number-for-motorola-moto-x#comment43189061_27368423), dlaczego jest to się dzieje. Jest to raczej niefortunne, ale dla wszystkich metod uzyskania unikalnego identyfikatora urządzenia powinieneś mieć również "plan tworzenia kopii zapasowych", tzn. Może wrzucić plik/łańcuch znaków do funkcji mieszania lub coś podobnego. Jeśli korzystasz z [Kivy] (http://kivy.org/), możesz uzyskać dostęp do API Androida bezpośrednio z [pyjnius] (https://github.com/kivy/pyjnius/) (wymaga to JNI). – KeyWeeUsr

+0

Nie używam kivy.jednak mam Pythona do pracy z domyślnym modułem, który jest dostarczany z uuid, os, sys, podprocesu itp. jakikolwiek inny moduł nie jest dostępny dla istniejącej kompilacji crossowej, której używam. – Gahan

0

dla Mac/iPhone można spróbować poniżej polecenia:

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. 
Powiązane problemy