BashからUSBフラッシュドライブのシリアル番号を取得する方法

BashからUSBフラッシュドライブのシリアル番号を取得する方法
cat /proc/scsi/usb-storage/27 
------------------
   Host scsi27: usb-storage
       Vendor: SanDisk
      Product: Cruzer Blade
Serial Number: 4C530000230331109030
     Protocol: Transparent SCSI
    Transport: Bulk
       Quirks: SANE_SENSE

これは、ペンドライブを接続するたびにホストcsi番号が変更され続けるためです。

答え1

使用lsblk:

$ lsblk --output KNAME,SERIAL /dev/sdb
KNAME SERIAL
sdb   4CEDFB6D543AF360199308B2

同じデバイスで2回テストしましたが、常に同じシリアル番号が出ました。

答え2

私が使用するsmartctlツール:

# smartctl /dev/sda -i | grep Serial
Serial Number:    S1D3LYBG290266

私は電子が人が読みやすくなるのでこれを好みますlsblkが、bashスクリプトで必要な場合は役に立ちません。

答え3

多くの検索の最後に、他の人にも役立つより良いスクリプトを思いつきました。ペンドライブなどのリムーバブルデバイスのみが表示されます。このスクリプトは私のcentos7のすべてのユーザーに動作します。

#!/bin/bash
for C in `ls /sys/block/`; do 
    RE=`cat /sys/block/$C/removable`
        if [ $RE == "1" ] ;then 
            #VENDOR=`/bin/udevadm info --name=/dev/$C | grep ID_VENDOR=|awk -F"=" ' { print $2}'`
            #MODEL=`/bin/udevadm info --name=/dev/$C | grep ID_MODEL=|awk -F"=" ' { print $2}'`
            #SERIAL=`/bin/udevadm info --name=/dev/$C | grep SERIAL_SHORT|awk -F"=" ' { print $2}'`
            #echo $VENDOR-$MODEL"-"$SERIAL #print as per your taste
            USB_SERIAL=`/bin/udevadm info --name=/dev/$C | grep ID_SERIAL=|awk -F"=" ' { print $2}'|awk -F"-" ' { print $1}'`
            echo  $USB_SERIAL #or just the default one
        fi 
done

JetFlash_Transcend_4GB_08XHIHH4

関連情報