Насколько я понимаю, цель состоит в том, чтобы вводить команду как точку монтирования и выводить серийный номер. Что ж, это возможно с помощью небольшого скрипта, который использует немного awk
magic и пакет 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. Понятия не имею, существуют ли не-GNU версии lsblk
, но если они есть - оставьте комментарий
2. Показанные серийные номера представляют собой случайные строки, сгенерированные из / dev / urandom
для демонстрационных целей