Bash 脚本输出到 U 盘的路径

Mou*_*inX 3 filesystems bash path shell-script usb-drive

如何使用 bash(Ubuntu 和 Linux Mint)返回(输出)连接到本地计算机的任何 USB 闪存棒的路径?

背景:

我正在为用户提供一个自动备份脚本。(实际的备份软件已经安装在他们的计算机上。)

用户的工作是插入 U 盘并在终端输入一个命令(不带任何参数、选项或任何其他变量信息)。

我需要一个可以找到 U 盘路径的 bash 脚本。如果找到不止一个这样的路径,我可能会中止并弹出一条消息与我联系。与其制作复杂的脚本,我更容易告诉他们确保在他们希望执行备份时只有一个记忆棒插入计算机。

slm*_*slm 5

插入 USB 设备后,您只需查看以下路径即可知道安装了什么:

$ ls -l /dev/disk/by-id/usb*
Run Code Online (Sandbox Code Playgroud)

例子

$ ls -l /dev/disk/by-id/usb*
lrwxrwxrwx. 1 root root  9 Mar 12 01:01 /dev/disk/by-id/usb-JMTek_USBDrive-0:0 -> ../../sdb
lrwxrwxrwx. 1 root root 10 Mar 12 01:01 /dev/disk/by-id/usb-JMTek_USBDrive-0:0-part1 -> ../../sdb1
Run Code Online (Sandbox Code Playgroud)

有了以上信息,您的脚本就可以使用以下内容简单地查看这些条目readlink:

$ readlink -f /dev/disk/by-id/usb-JMTek_USBDrive-0:0*
/dev/sdb
/dev/sdb1
Run Code Online (Sandbox Code Playgroud)

然后使用mount命令回退以找出设备自动挂载到的目录:

$ mount | grep '/dev/sdb\b'
$ mount | grep '/dev/sdb1\b'
/dev/sdb1 on /run/media/saml/HOLA type vfat (rw,nosuid,nodev,relatime,uid=1000,gid=1000,fmask=0022,dmask=0077,codepage=437,iocharset=ascii,shortname=mixed,showexec,utf8,flush,errors=remount-ro,uhelper=udisks2)
Run Code Online (Sandbox Code Playgroud)

这可以扩展为这样的单行:

$ readlink -f /dev/disk/by-id/usb-JMTek_USBDrive-0:0* | \
    while read dev;do mount | grep "$dev\b" | awk '{print $3}';done
/run/media/saml/HOLA
Run Code Online (Sandbox Code Playgroud)

获取设备 ID

您可以从 的输出中像这样解析它/dev/disk/by-id/usb*,如下所示:

$ ls /dev/disk/by-id/usb* | sed 's/.*usb-\(.*\)-[0-9]:.*/\1/'
JMTek_USBDrive
JMTek_USBDrive
Run Code Online (Sandbox Code Playgroud)

顺便说一下,此信息是 USB 制造商 + 产品说明的串联。

$ usb-devices
...
T:  Bus=02 Lev=02 Prnt=02 Port=01 Cnt=02 Dev#= 10 Spd=12  MxCh= 0
D:  Ver= 1.10 Cls=00(>ifc ) Sub=00 Prot=00 MxPS= 8 #Cfgs=  1
P:  Vendor=058f ProdID=9380 Rev=01.00
S:  Manufacturer=JMTek
S:  Product=USBDrive
C:  #Ifs= 1 Cfg#= 1 Atr=80 MxPwr=100mA
I:  If#= 0 Alt= 0 #EPs= 2 Cls=08(stor.) Sub=06 Prot=50 Driver=usb-storage
...
Run Code Online (Sandbox Code Playgroud)

一旦您确定/dev/sd*了 USB 设备正在使用哪个设备 ( ),您也可以通过 UDEV 以这种方式访问​​它:

$ udevadm info --query=all --name=sdb | grep -E "MODEL=|VENDOR=|ID_SERIAL"
E: ID_MODEL=USBDrive
E: ID_SERIAL=JMTek_USBDrive-0:0
E: ID_VENDOR=JMTek
Run Code Online (Sandbox Code Playgroud)