不使用sudo提取Linux序列号

16

不使用 sudo 能否提取 Linux 的序列号?

我知道在 Windows 中可以这样做:wmic bios get serialnumber ,在 macOS 中可以这样做:system_profiler | grep "r (system)",两者都不需要 root 权限。

在 Linux 中可以使用以下命令:sudo dmidecode -s system-serial-number,但是需要 sudo。还有其他方法吗?


“Linux序列号”可能指的是BIOS序列号(来自WMIC示例)。 - Peter Mortensen
3个回答

23

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启动,它如何访问这些数据? - Alberto
2
此软件包安装“hald”守护进程,该进程以root身份运行并收集此数据,使得“lshal”可以读取它。 - mvp
谢谢!很遗憾,如果没有 root 权限,无法收集这些数据。 - Alberto
hal-get-property --udi '/org/freedesktop/HAL/devices/computer' --key system.hardware.serial 可以让你获取序列号,而无需解析。 - Marlon
2
在Ubuntu 20.04中,hal的等效物是什么? - Basile Starynkevitch
显示剩余3条评论

0

另一种不需要 root 权限的解决方案:

udevadm info --query=all --name=/dev/sda | grep ID_SERIAL

这实际上是 lsblk 库,由 don_crissti 提到,但我的 lsblk 版本不包括串行选项。


1
这是磁盘序列号,不是BIOS序列号。 - Francesco

0

设备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

问题是关于BIOS序列号,与磁盘无关。 - Peter Mortensen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接