如何从挂载点获取驱动器序列号?

use*_*159 5 command-line scripting mount hard-disk

如果lsblk -o NAME,SERIAL,MOUNTPOINT在其输出中包含以下内容

sdb                                           X55MM4827123
??sdb1
  ??luks-4d0dc651-9aa6-452d-9442-7b33d95f8427                /run/media/main/mydrive
Run Code Online (Sandbox Code Playgroud)

X55MM4827123当我提供挂载点(/run/media/main/mydrive在本例中)时,我可以使用什么简单的控制台/CLI 命令来获取序列号(在本例中)?

答案不一定必须使用lsblk,但它应该是简洁的,理想情况下只使用简单的 bash 脚本。

Ser*_*nyy 0

据我了解,目标是将命令输入作为安装点并输出序列号。好吧,通过一个使用一点awk魔法和smartmontools包的小脚本就可以实现。

演示2

$ ./mount2serial.sh /                                                                                                    
[sudo] password for xieerqi: 
Serial Number:    4G7AA3Q1HSZ4HH4YN
$ ./mount2serial.sh /mnt/HDD                                                                                             
[sudo] password for xieerqi: 
Serial Number:    4O75CEXFLML9M
Run Code Online (Sandbox Code Playgroud)

这是脚本本身:

$ ./mount2serial.sh /                                                                                                    
[sudo] password for xieerqi: 
Serial Number:    4G7AA3Q1HSZ4HH4YN
$ ./mount2serial.sh /mnt/HDD                                                                                             
[sudo] password for xieerqi: 
Serial Number:    4O75CEXFLML9M
Run Code Online (Sandbox Code Playgroud)

由于您确实在 中获得了序列号lsblk,并且 GNU 版本1可以lsblk 输出 JSON 数据,因此我整理了一个 Python 脚本,其工作方式如下2

$ ./mount2serial.py '/mnt/ubuntu'
4O75CEXFLML9M
xie@xie-PC:~$ ./mount2serial.py '/'
B4VOM8OEIZIHF
Run Code Online (Sandbox Code Playgroud)
#!/usr/bin/env bash

if [ "$1" = "/"  ]
then
    dev=$(awk -v mount="$1" '$2 == mount{print $1}' /proc/self/mounts)
else
    dev=$(awk -v mount="$1" '$0 ~ mount{print $1}' /proc/self/mounts)
fi
sudo smartctl -i "$dev" | grep 'Serial Number:'
Run Code Online (Sandbox Code Playgroud)

1. 我不知道是否存在非 GNU 版本lsblk,但如果存在 - 发表评论

2. 显示的序列号是出于/dev/urandom演示目的而生成的随机字符串