Linux硬盘序列号为非root用户

首先,我想为不包括硬件细节的标题道歉。 这是因为我正在寻找一个适用于所有Linux发行版的命令。

题:

我对Linux非常陌生,但是知道的不多,是否可以检索以非root用户身份运行的硬盘序列号。 我知道有一些命令可以检索使用sudo运行的这些信息。 但是,我需要一种方法来检索这些信息,而不是作为sudo运行。

任何build议将不胜感激。

亲切的问候,

穆斯塔法

在大多数当前的发行版中,HDD序列号存储在udev数据库中,可以在没有根权限的情况下查询:

/sbin/udevadm info --query=property --name=sda 

(查找ID_SERIALID_SERIAL_SHORT ;还有基于这些值的ATA驱动器的/dev/disk/by-id/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'" 

然后你可以进一步处理这个输出。 对于大多数驱动器types,每行第二个string是MODEL_SERIAL。

就像womble所说的那样,没有root访问权限或者授予root权限的某个进程,就无法实现这一点。 但是,既然你说你是一个新手,让我注意一下一个叫做lshw的方便命令。

对某些进程授予root权限的权限,你不能实现这一点。 即使作为root,你也不能在一些硬件configuration上做到这一点。

/ dev / disk / by-id下的链接由udev创build。 在/etc/udev/rules.d/50-udev.rules这样的行可以find:

 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符号链接并不是微不足道的。 但是至less有一个直接的方法:

 $ 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 

返回一个空格分隔的列表。 所以可以findby-idpath。

或者你可以直接得到“复合”序列号:

 $ 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 (空格被replace为'_')。