2016-03-26 20 views
7

Sto cercando di trovare qualcosa che possa essere usato come stringa/numero univoco per il mio script, corretto in una macchina e facilmente ottenibile (multipiattaforma). Presumo che una macchina abbia una scheda di rete. Non ho bisogno che sia davvero unico, ma il necessario è che dovrebbe essere risolto a lungo termine e il più raro possibile.Identificatore fisso per una macchina (uuid.getnode)

So che il MAC può essere modificato e probabilmente farei un avvertimento al riguardo nella mia sceneggiatura, tuttavia non mi aspetto che qualcuno cambi il MAC ogni mattina.

Quello che mi è venuta è uuid.getnode(), ma nel docs c'è:

Se tutti i tentativi di ottenere l'indirizzo hardware falliscono, si sceglie un numero casuale a 48 bit

fa significa che per ogni chiamata di funzione ottengo un altro numero casuale, quindi non è possibile utilizzarlo se il MAC non è ottenibile?

... su una macchina con più interfacce di rete può essere restituito l'indirizzo MAC di uno qualsiasi di essi.

Questa frase significa getnode() ottiene un MAC casuale (o primo) da tutti disponibili? Cosa succederebbe se ottenesse MAC A alla prima esecuzione e MAC B la prossima volta? Non ci sarebbe alcun problema se avessi una lista fissa (ordinata, concatenata, tadaaa!)

Sto chiedendo perché non ho modo di testarlo da solo.

risposta

2

Sono riuscito a testare la prima parte sul mio dispositivo Android e su ogni nuova esecuzione python ha creato un numero casuale, quindi non è utilizzabile a tutti per questo scopo.

Il secondo tipo di problema si annega, perché se nei documenti ha menzionato che può restituire any one of them, quindi non è qualcosa su cui poter fare affidamento (+ Non sono riuscito a trovare una macchina in cui potrei verificarlo). Un pacchetto bel netifaces è venuto a salvare, che fa una cosa simile

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

Tuttavia io invece dato usando MAC, ho avuto qualcosa di più stabile.

Ora per gli identificatori:

1) di Windows:

l'esecuzione di questo e ottenere un output può essere abbastanza buono:

wmic csproduct get UUID 

o quella che ho usato ed è disponibile nel registro (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 

o

/sys/class/dmi/id/product_uuid 

o se non root:

cat /var/lib/dbus/machine-id 

3) Android:

Se si sta lavorando con il pitone e non si vuole pasticciare con roba Java, allora questo dovrebbe funzionare abbastanza bene:

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

, ma se vi piace Java, quindi andare per this answer sebbene anche ANDROID_ID s' unicità è piuttosto discutibile se è permesso cambiare, quindi un numero seriale è molto probabilmente una scommessa più sicura.

Nota che, come già menzionato nella risposta collegata, anche ril.serialnumber può essere nullo/vuoto o non esistente (chiave mancante). La stessa cosa accade anche con il funzionario Android API dove è chiaramente indicato questo: numero di serie

Un hardware, se disponibile.

Mac/iPhone: non ho trovato alcuna soluzione, come non ho accesso a uno di questi, ma se c'è una variabile che contiene il valore ID macchina, allora si dovrebbe essere in grado di arrivare con semplici subprocess.check_output()

+0

non sono in grado di ottenere uuid Android con questo codice. Sto usando Android marshmallow e installato l'emulatore di terminale su di esso posso vedere l'elenco completo di 'getprop' ma' ril.serialnumber' non esiste. ha bisogno del permesso di root? – Gahan

+0

@Gahan vedi [questo commento] (https://stackoverflow.com/questions/27368423/how-can-i-get-a-ril-serial-number-for-motorola-moto-x#comment43189061_27368423) per perché è che hapenning. È piuttosto sfortunato, ma per tutti i metodi per ottenere un identificatore di dispositivo univoco dovresti anche avere un "piano di backup", ad esempio magari gettare qualche file/stringa su una funzione di hash o qualcosa di simile. Se utilizzi [Kivy] (http://kivy.org/), puoi accedere all'API di Android direttamente con [pyjnius] (https://github.com/kivy/pyjnius/) (richiede JNI). – KeyWeeUsr

+0

Non sto usando kivy.tuttavia ho python per funzionare con tutti i suoi moduli predefiniti, come uuid, os, sys, subprocess, ecc., qualsiasi altro modulo non è disponibile per la compilation cross esistente che sto usando. – Gahan

0

per Mac/iPhone si può provare qui sotto comando:

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. 
Problemi correlati