Прежде всего, я хотел бы извиниться за заголовок, который не включает детали оборудования. Это потому, что я ищу команду, которая будет работать во всех дистрибутивах Linux.
Вопрос:
Я новичок в Linux и мало что знаю, однако можно ли получить серийный номер жесткого диска, работающего без полномочий root. Я знаю, что есть команды для получения этой информации с помощью sudo. Однако мне нужен способ получить эту информацию без использования sudo.
Будем очень признательны за любые предложения.
С уважением,
Мустафа
В большинстве современных дистрибутивов серийные номера жестких дисков хранятся в базе данных udev, которую можно запросить без прав root:
/sbin/udevadm info --query=property --name=sda
(искать ID_SERIAL
, ID_SERIAL_SHORT
; это также /dev/disk/by-id/ata-*
символические ссылки для дисков ATA на основе этих значений).
udisks
обеспечивает интерфейс более высокого уровня для этих данных и многого другого (он также предоставляет доступ к атрибутам SMART, не требуя привилегий root, которые могут потребоваться для вызова, например, smartctl
напрямую).
Другой способ, который обычно работает:
ls -l /dev/disk/by-id/
Вот один вкладыш, который дает вам быстрый список дисков и модели / серийного номера:
ls -l /dev/disk/by-id/ | grep scsi- | grep -v part | awk '{print $NF " " $(NF-2)}' | sed 's|../../||g' | sed 's/scsi-...._//g'
Или для удаленных машин:
ssh $host "ls -l /dev/disk/by-id/ | grep scsi- | grep -v part | awk '{print \$NF \" \" \$(NF-2)}' | sed 's|../../||g' | sed 's/scsi-...._//g'"
Затем вы можете продолжить обработку этого вывода. Для большинства типов дисков вторая строка в строке - MODEL_SERIAL.
Как сказал womble, без root-доступа или предоставления root-подобных разрешений для какого-либо процесса вы не можете этого добиться. Однако, поскольку вы говорите, что вы новичок, позвольте мне отметить вас об удобной команде под названием lshw
.
Вы не можете этого добиться, если не предоставить права доступа root для некоторого процесса. Даже с правами root вы не можете сделать это на некоторых конфигурациях оборудования.
Ссылки в / dev / disk / by-id создаются udev. В /etc/udev/rules.d/50-udev.rules можно найти такие строки:
KERNEL=="sd*[!0-9]|sr*", SYSFS{ieee1394_id}=="*", ENV{ID_SERIAL}="$sysfs{ieee1394_id}", ENV{ID_BUS}="ieee1394"
KERNEL=="sd*[!0-9]|sr*", ENV{ID_SERIAL}=="", IMPORT{program}="/lib/udev/usb_id -x"
KERNEL=="sd*[!0-9]|sr*", ENV{ID_SERIAL}=="", IMPORT{program}="/lib/udev/scsi_id -g -x -s %p -d $tempnode"
KERNEL=="sd*[!0-9]|sr*", ENV{ID_SERIAL}=="", IMPORT{program}="/lib/udev/scsi_id -g -x -a -s %p -d $tempnode"
KERNEL=="nst[0-9]*|st*|sd*[!0-9]|sr*|dasd*[!0-9]|cciss?c", ENV{ID_SERIAL}=="?*", SYMLINK+="disk/by-id/$env{ID_BUS}-$env{ID_SERIAL}"
К сожалению, узнать это нетривиально. by-id
символическая ссылка от имени устройства. Но есть как минимум один прямой путь:
$ udevinfo -q path -n /dev/sda
/block/sda
$ udevinfo -q symlink -p /block/sda
disk/by-id/scsi-SATA_KINGSTON_SVP100_31JY100MY5SK disk/by-path/pci-0000:00:11.0-scsi-0:0:0:0
Возвращается список, разделенный пробелами. Так что by-id
путь можно найти.
Или Вы можете напрямую получить "составной" серийный номер:
$ udevinfo -q env -p /block/sda
ID_VENDOR=ATA
ID_MODEL=KINGSTON_SVP100S
ID_REVISION=CJR1
ID_SERIAL=SATA_KINGSTON_SVP100_31JY100MY5SK
ID_TYPE=disk
ID_BUS=scsi
ID_PATH=pci-0000:00:11.0-scsi-0:0:0:0
в ID_SERIAL
после последнего символа подчеркивания вы увидите серийный номер.
Как я вижу, серийный номер может содержать буквенно-цифровые символы и «-» (у меня такие жесткие диски SCSI). Кто-нибудь знает какие-либо ограничения по серийному номеру? Если он может содержать "_", то этот метод не является пуленепробиваемым.
В ID_MODEL
ключ можно использовать для более точной локализации начала серийного номера, так как (мне кажется) его первые 15 символов добавляются к ID_SERIAL
(пробелы заменены на '_').