Command-Line
如何從掛載點獲取驅動器序列號?
如果
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)
我不知道是否存在非 GNU 版本
lsblk
,但如果存在 - 請發表評論顯示的序列號是
/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'`