不使用 sudo 能否提取 Linux 的序列号?
我知道在 Windows 中可以这样做:wmic bios get serialnumber
,在 macOS 中可以这样做:system_profiler | grep "r (system)"
,两者都不需要 root 权限。
在 Linux 中可以使用以下命令:sudo dmidecode -s system-serial-number
,但是需要 sudo。还有其他方法吗?
不使用 sudo 能否提取 Linux 的序列号?
我知道在 Windows 中可以这样做:wmic bios get serialnumber
,在 macOS 中可以这样做:system_profiler | grep "r (system)"
,两者都不需要 root 权限。
在 Linux 中可以使用以下命令:sudo dmidecode -s system-serial-number
,但是需要 sudo。还有其他方法吗?
dmidecode
从物理内存中读取此信息,使用 /dev/mem
,需要 root 权限。
相同的信息也可以通过 Linux 内核在虚拟目录 /sys/devices/virtual/dmi/id
中的 sysfs 提供。
不幸的是,有人决定该虚拟目录中的所有信息都向任何人开放,只是不包括序列号:
$ ls -l /sys/devices/virtual/dmi/id
-r--r--r-- 1 root root 4096 Nov 25 17:12 bios_date
-r--r--r-- 1 root root 4096 Nov 14 14:59 bios_vendor
-r--r--r-- 1 root root 4096 Nov 25 17:12 bios_version
-r--r--r-- 1 root root 4096 Nov 25 17:12 board_asset_tag
-r--r--r-- 1 root root 4096 Nov 25 17:12 board_name
-r-------- 1 root root 4096 Nov 25 17:12 board_serial
-r--r--r-- 1 root root 4096 Nov 14 14:59 board_vendor
-r--r--r-- 1 root root 4096 Nov 25 17:12 board_version
-r--r--r-- 1 root root 4096 Nov 25 17:12 chassis_asset_tag
-r-------- 1 root root 4096 Nov 25 17:12 chassis_serial
-r--r--r-- 1 root root 4096 Nov 25 17:12 chassis_type
-r--r--r-- 1 root root 4096 Nov 25 17:12 chassis_vendor
-r--r--r-- 1 root root 4096 Nov 25 17:12 chassis_version
-r--r--r-- 1 root root 4096 Nov 25 17:12 modalias
drwxr-xr-x 2 root root 0 Nov 25 17:12 power
-r--r--r-- 1 root root 4096 Nov 14 14:59 product_name
-r-------- 1 root root 4096 Nov 25 17:12 product_serial
-r-------- 1 root root 4096 Nov 14 14:59 product_uuid
-r--r--r-- 1 root root 4096 Nov 14 14:59 product_version
lrwxrwxrwx 1 root root 0 Nov 14 14:59 subsystem -> ../../../../class/dmi
-r--r--r-- 1 root root 4096 Nov 14 14:59 sys_vendor
-rw-r--r-- 1 root root 4096 Nov 14 14:59 uevent
如果您可以安装软件包hal
(在最新的Ubuntu版本中不会默认安装),则此命令将作为非root用户对您起作用。 lshal | grep system.hardware.serial
system.hardware.serial = '<serial_number>' (string)
这是因为hal
软件包安装了hald
守护程序,该程序以root身份运行并收集数据,使得lshal
能够以非root身份读取它。
lshal
没有作为sudo启动,它如何访问这些数据? - Albertohal
的等效物是什么? - Basile Starynkevitch另一种不需要 root 权限的解决方案:
udevadm info --query=all --name=/dev/sda | grep ID_SERIAL
这实际上是 lsblk 库,由 don_crissti 提到,但我的 lsblk 版本不包括串行选项。
设备1名称及对应序列号:
lsblk --nodeps -o name,serial
输出:
NAME SERIAL
sda 0000000012400917BA30
sdb 0000000012400917BA96
如果您不想打印标题行,请添加 -n:
lsblk --nodeps -no name,serial
输出:
sda 0000000012400917BA30
sdb 0000000012400917BA96
lsblk --nodeps -no serial /dev/sda
输出:
0000000012400917BA30
请记住lsblk列出了所有可用(或指定的)块设备的信息。现在,对于那些不知道最后一个术语是什么意思的人:
一般来说,块设备是存储或保存数据的设备。软盘驱动器、硬盘驱动器和 CD-ROM 驱动器都是块设备。但是,在使用 lsblk 时,您可以简单地添加更多列,例如type(设备类型)和/或tran(设备传输类型)等:
lsblk --nodeps -no name,serial,type,tran
.
sda 0000000012400917BA30 disk sata
sdb 0000000012400917BA96 disk sata
sr0 4B583242334C453233353320 rom usb