如果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/urandom
2. 显示的序列号是出于演示目的而生成的随机字符串