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

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

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

sdb                                           X55MM4827123
└─sdb1
  └─luks-4d0dc651-9aa6-452d-9442-7b33d95f8427                /run/media/main/mydrive

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

答案不一定必须使用lsblk,但希望它应该简洁,并且最好只使用简单的 bash 脚本。

答案1

这些选项将打印您的磁盘序列号,不带标题:lsblk -n -o SERIAL /dev/sda

选项解释,可以在联机帮助页中找到:

-n, --noheadings
Do not print a header line.

Serial:此选项将从命令输出中删除标题。

-o, --output list
Specify which output columns to print. Use --help to get a list of all supported columns.

选择要打印的有关磁盘的信息。

这足以为您带来连续剧。不幸的是,lsblk它不适用于安装点,因为序列号是磁盘的属性,而不是分区的属性。看一下synopsis

Synopsis

lsblk [options]
lsblk [options] device...

您将必须付出巨大的努力从挂载点提取分区,修剪磁盘信息,然后将其作为参数提供给lsblk.这可能会解决问题:

mount| grep /run/media/main/mydrive | awk 'NR==1{print $1}'|sed 's/[0-9]*//g'

mount将列出所有安装点,grep将获取安装点的行,awk将获取分区列并sed删除代表分区的数字。总结所有:

lsblk -n -o SERIAL `mount| grep /run/media/main/mydrive | awk 'NR==1{print $1}'|sed 's/[0-9]*//g'`

答案2

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

演示2

$ ./mount2serial.sh /                                                                                                    
[sudo] password for xieerqi: 
Serial Number:    4G7AA3Q1HSZ4HH4YN
$ ./mount2serial.sh /mnt/HDD                                                                                             
[sudo] password for xieerqi: 
Serial Number:    4O75CEXFLML9M

这是脚本本身:

#!/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:'

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

$ ./mount2serial.py '/mnt/ubuntu'
4O75CEXFLML9M
xie@xie-PC:~$ ./mount2serial.py '/'
B4VOM8OEIZIHF
#!/usr/bin/env python3

import json
import subprocess
import sys

lsblk = subprocess.run(['lsblk','-J','-o','NAME,SERIAL,MOUNTPOINT'],stdout=subprocess.PIPE)
for dev in json.loads(lsblk.stdout.decode())['blockdevices']:
    serial = ''
    # find serial number of current block device
    for key,value in dev.items():
        if key == 'serial':
            serial = value
            break
    # we don't need to iterate through everything in dev.items()
    for child in dev['children']:
        if child['mountpoint'] == sys.argv[1]:
            print(serial)
            sys.exit(0)
# if nothing is found we end up here with exit status 1 and nothing printed
sys.exit(1)

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

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

相关内容