首先,我想为不包括硬件细节的标题道歉。 这是因为我正在寻找一个适用于所有Linux发行版的命令。
题:
我对Linux非常陌生,但是知道的不多,是否可以检索以非root用户身份运行的硬盘序列号。 我知道有一些命令可以检索使用sudo运行的这些信息。 但是,我需要一种方法来检索这些信息,而不是作为sudo运行。
任何build议将不胜感激。
亲切的问候,
穆斯塔法
在大多数当前的发行版中,HDD序列号存储在udev数据库中,可以在没有根权限的情况下查询:
/sbin/udevadm info --query=property --name=sda
(查找ID_SERIAL
, ID_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-id
path。
或者你可以直接得到“复合”序列号:
$ 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为'_')。