lsblk -o NAME,SERIAL,MOUNTPOINT
の出力に次のものが含まれている場合
sdb X55MM4827123
└─sdb1
└─luks-4d0dc651-9aa6-452d-9442-7b33d95f8427 /run/media/main/mydrive
マウントポイント(この場合はX55MM4827123
)を指定するときに、シリアル番号(この場合は/run/media/main/mydrive
)を取得するために使用できる単純なコンソール/ CLIコマンドとは何ですか?
答えは必ずしも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 version1 of 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バージョンが存在するかどうかはわかりませんが、存在する場合-コメントを残してください
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'`