Сценарий Bash для вывода пути на флеш-накопитель USB

Как я могу вернуть (вывести) путь к любой USB-карте флэш-памяти USB, подключенной к локальному компьютеру с помощью bash (Ubuntu и Linux Mint)?

Задний план:

Я предоставляю пользователям автоматический сценарий резервного копирования. (Фактическое программное обеспечение для резервного копирования уже установлено на их компьютере.)

Задача пользователя – подключить флеш-накопитель USB и ввести одну команду на терминал (без каких-либо параметров, параметров или любой другой информации о переменных).

Мне нужен сценарий bash, который может найти путь к флэш-накопителю USB. Если обнаружено более одного такого пути, я, вероятно, просто остановлю и вытащу сообщение, чтобы связаться со мной. Вместо того, чтобы создавать сложный сценарий, мне проще просто сказать им, чтобы в тот момент, когда они хотят выполнить резервное копирование, убедитесь, что в компьютер подключен только один накопитель.

4 Solutions collect form web for “Сценарий Bash для вывода пути на флеш-накопитель USB”

После подключения USB-устройства вы можете узнать, что было установлено, просто взглянув на этот путь:

$ ls -l /dev/disk/by-id/usb* 

пример

 $ 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 

С приведенной выше информацией ваш скрипт мог бы просто посмотреть на те записи, используя что-то вроде readlink :

 $ readlink -f /dev/disk/by-id/usb-JMTek_USBDrive-0:0* /dev/sdb /dev/sdb1 

И затем, используя команду 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) 

Это можно было бы расширить до одного лайнера следующим образом:

 $ 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 

Получение идентификатора устройства

Вы можете разобрать это так на выходе из /dev/disk/by-id/usb* , например:

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

Кстати, эта информация является конкатенацией производителя 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 ... 

Вы также можете получить к нему доступ, как только вы установили, какое устройство ( /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 

Вы можете написать сценарий, чтобы пройти через / etc / mtab и посмотреть на смонтированные устройства, а затем использовать udevadm, чтобы проверить, являются ли они USB-устройствами. / etc / mtab включает имя устройства в / dev и его точку монтирования. Таким образом, вы можете сделать что-то вроде:

 IFS=$'\n' for mtabline in `cat /etc/mtab`; do device=`echo $mtabline | cut -f 1 -d ' '` udevline=`udevadm info -q path -n $device 2>&1 |grep usb` if [ $? == 0 ] ; then devpath=`echo $mtabline | cut -f 2 -d ' '` echo "devpath: $devpath" fi done 

(Вам нужно установить IFS в свой скрипт, чтобы mtab читался по строкам, а не «слово» словом «word»).

На моем рабочем столе без каких-либо флеш-устройств USB:

 % lsblk -o tran,name,mountpoint > TRAN NAME MOUNTPOINT > sata sda > ├─sda1 /esp > ├─sda2 / > ├─sda3 /mnt/sda3 > ├─sda4 > └─sda5 > sata sdb > sata sdc > sata sr0 

На моем ноутбуке с двумя:

 % lsblk -o tran,name,mountpoint > TRAN NAME MOUNTPOINT > usb sda > ├─sda1 /esp > └─sda2 / > usb sdb > └─sdb1 /home > sata sr0 

Это должно быть все, что вам нужно.

Поэтому некоторые другие также сказали мне, что некоторые семейные системы debian еще не поддерживают транспортный вариант. В этом случае попробуйте следующее:

  ( set -- $(lsblk -ndo name,rm) while [ $# -ge 2 ] ; do { [ $2 -eq 1 ] && \ udevadm info --query=all --name "/dev/$1" shift 2 } ; done ) 

Вышеупомянутая команда сначала запрашивает lsblk для списка текущих (только для родительских – только для sda а не sda1 ) блоков по имени и столбца для removable флага. Результат выглядит так:

 sda 0 sdb 1 sdc 1 

Только устройства, помеченные 1 являются съемными.

Таким образом, мы set позиционные параметры ( подоболочки ) в разделенное содержимое, которое составляет два параметра для каждой записи. while у нас есть по крайней мере 2 позиционных параметра, мы [ test ] $2 для 1 съемного флага, && и если они присутствуют, мы запрашиваем udevadm устройств системы для всей информации, имеющейся у нашего первого позиционного параметра, или /dev/$1 . Затем shift наши первые 2 позиционных параметра и начните с следующих двух.

udevadm предоставляет много информации об устройствах, которые могут вас заинтересовать, но если вы действительно просто хотите прямо перейти к сути, вы можете добавить следующий: |pipe to udevadm 's stdout :

  udevadm info --name "/dev/$1" |\ grep -q ID_BUS=usb && echo "/dev/$1" 

Это обеспечит вам список только устройств-отладочных устройств usb / dev / $ DEV, которые в настоящее время присутствуют в системе в формате:

 /dev/$DEV /dev/$ALSODEV 

Если в этот момент вас интересовали только точки монтирования смонтированных разделов вышеперечисленных родительских ссылок, вы можете свернуть их вместе с findmnt следующим образом:

 ( set -- $(lsblk -ndo name,rm) while [ $# -ge 2 ] ; do { [ $2 -eq 1 ] && udevadm info --query=all --name "/dev/$1" |\ grep -q ID_BUS=usb && printf 'findmnt %s -no TARGET ;' "/dev/$1" /dev/"$1"[0-9] shift 2 ; } ; done ) |\ . /dev/stdin 

Это должно предоставить вам список, например:

 /removable/usb/device/mount/point/1 /ditto/2 /also/3 

Вот такой подход, который я использую. Оно произошло от:

https://unix.stackexchange.com/a/119782/15010
https://unix.stackexchange.com/a/60335/15010

 export USBKEYS=($( for blk in $(lsblk -ndo name) ; do { udevadm info --query=all --name "/dev/$blk" |\ grep -q ID_BUS=usb && printf 'findmnt %s -no TARGET ;'\ "/dev/$blk" /dev/"$blk"[0-9] } ; done 2>&- |. /dev/stdin )) echo "$USBKEYS" export STICK case ${#USBKEYS[@]} in 0 ) echo "No USB stick found."; exit 0 ;; 1 ) STICK=$USBKEYS; echo "STICK=$USBKEYS" ;; * ) NOTE: the code for this case is not included in the interest of brevity. esac 

Это также работает для меня. В основном это происходит от https://unix.stackexchange.com/a/119260/15010

 #!/bin/bash while read mtabline do device=`echo $mtabline | awk '{print $1}'` udevline=`udevadm info -q path -n $device 2>&1 |grep usb` if [ $? == 0 ] ; then echo "$device" fi done < /etc/mtab 
  • Медленная скорость передачи - копирование с hdd на usb hdd
  • Partclone: ​​ошибка при попытке копирования разделенных блоков-блоков
  • Автоматизация USB-приводов на Debian 8 не работает
  • как заставить GRUB найти модули для многозадачных Linux LiveUSB?
  • Почему пишет SLOW на необработанном устройстве и FAST на файловой системе (USB-ключ)?
  • OpenWRT mount / boot ethernet HDD
  • Linux Mint 16: устройство Android, не указанное в lsusb
  • USB-накопитель 4 ГБ теперь всего 1,37 ГБ?
  • VMWare медленнее на внешнем USB-диске
  • Как полностью перестроить загрузочный раздел с помощью grub?
  • синхронизировать или асинхронно для массового дублирования USB?
  • Linux и Unix - лучшая ОС в мире.