Command-Line

如何從掛載點獲取驅動器序列號?

  • August 3, 2019

如果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 腳本。

據我了解,目標是將命令輸入作為安裝點和輸出序列號。好吧,使用一點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可以輸出 JSON 數據,lsblk 因此我整理了一個 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出於展示目的生成的隨機字元串

這些選項將列印沒有標題的磁碟序列: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'`

引用自:https://unix.stackexchange.com/questions/337121