Я пытаюсь получить серийный номер (или любой уникальный аппаратный идентификатор) USB-накопителя с использованием Python в Linux. Я начал с рецепта, который я нашел в this SO question.USB Stick серийный номер в Python
Код в этой ссылке отлично подходит для стационарных жестких дисков. Например, на моем внутреннем накопителе SSD он возвращает:
$ sudo python clusterTool.py /dev/sda Hard Disk Model: SAMSUNG SSD PM810 2.5" 7mm 256GB Serial Number: S0NUNYAB503012
Качание!
Однако, когда я запускаю его на флэш-палки, я получаю ошибку из IOCTL, что становится неизящно coherced к следующему питона следа:
$ sudo python clusterTool.py /dev/sdb Traceback (most recent call last): File "clusterTool.py", line 21, in buf = fcntl.ioctl(fd, HDIO_GET_IDENTITY, " " * sizeof_hd_driveid) IOError: [Errno 22] Invalid argument
файла предполагает, что они такие же, как бы зверь:
$ file /dev/sd{a,b} /dev/sda: block special /dev/sdb: block special
Я не уверен, как они отличаются друг от друга, но они явно расходятся. В чем разница между этими устройствами, и есть ли какой-либо способ равномерно получить их идентификаторы?
У меня есть временное решение, которое включает в себя очищение вывода [this] (http://stackoverflow.com/questions/8653505/read-usb-serial-code-in-bash-using-udevadm) хак-уродливый и зависит от сценариев оболочки и т. д. Ищете реальный ответ. – meawoppl