'Extract the Linux serial number without sudo
It is possible to extract the Linux serial number without using sudo?
I know it is possible to do in Windows: wmic bios get serialnumber and in
macOS: system_profiler | grep "r (system)". Both of them do not require root privileges.
In Linux this can be used: sudo dmidecode -s system-serial-number, but it needs sudo. Is there another way?
Solution 1:[1]
dmidecode reads this information from physical memory, using /dev/mem, which requires root.
The same information is also provided by the Linux kernel via sysfs in a virtual directory, /sys/devices/virtual/dmi/id.
Unfortunately, someone decided that all information in that virtual directory is open to anyone for reading, just not the serial numbers:
$ 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
If you can install package hal (not installed by default on recent Ubuntu versions), this command will work for you as non-root:
lshal | grep system.hardware.serial
system.hardware.serial = '<serial_number>' (string)
This works because package hal installs the hald daemon, which runs as root and collects this data, making it possible for lshal to read it as non-root.
Solution 2:[2]
Another solution which does not require root privileges:
udevadm info --query=all --name=/dev/sda | grep ID_SERIAL
This is actually the library that lsblk, mentioned by don_crissti, leverages, but my version of lsblk does not include the option for serial.
Solution 3:[3]
Device1 name and corresponding serial number:
lsblk --nodeps -o name,serial
Output:
NAME SERIAL
sda 0000000012400917BA30
sdb 0000000012400917BA96
Add -n if you don't want to print the header line:
lsblk --nodeps -no name,serial
Output:
sda 0000000012400917BA30
sdb 0000000012400917BA96
Pass the device as an argument to get only the serial number of a specific device:
lsblk --nodeps -no serial /dev/sda
Output:
0000000012400917BA30
Keep in mind lsblk lists information about all available (or the specified) block devices. Now, for those who do not know what that last term means:
In general, block devices are devices that store or hold data. Diskette drives, hard drives and CD-ROM drives are all block devices. But that's not a problem when using lsblk as you can simply add more columns, e.g., type (device type) and/or tran (device transport type), etc.:
lsblk --nodeps -no name,serial,type,tran
.
sda 0000000012400917BA30 disk sata
sdb 0000000012400917BA96 disk sata
sr0 4B583242334C453233353320 rom usb
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | Peter Mortensen |
| Solution 2 | Paulo Boaventura |
| Solution 3 | Peter Mortensen |
