Как получить информацию о блочном устройстве, используя выходные данные lsusb

В то время как bash, как и все оболочки POSIX, поддерживают добавление шестнадцатеричных чисел с

printf '%x\n' "$((0xfff + 0xaaa))"

(см.:Как добавить два шестнадцатеричных числа в сценарий bash)

Это в лучшем случае ограничено 64-битными целыми числами.

Для таких больших чисел можно использоватьbc:

{
  echo obase=16
  echo ibase=16
  echo 436389bdc34dd718c7959db8d6df16967f2b9895e515da45fb09136183a7a9e2 +\
       1f0c45bbe9bc71a862f0d9672d056d2d741719a2b2d46ea6b269931d0b57674f |
   LC_ALL=C tr a-f A-F
} | BC_LINE_LENGTH=0 bc

BC_LINE_LENGTH=0избегает переноса строки с реализацией GNU bc. В других реализациях вместо этого вы можете использовать канал sed 'N;s/\\\n//'.

Или GNU awkс -M(, если построен с поддержкой арифметики произвольной точности):

$ gawk -M 'BEGIN{printf "%x\n", \ 
  0x436389bdc34dd718c7959db8d6df16967f2b9895e515da45fb09136183a7a9e2 + \
  0x1f0c45bbe9bc71a862f0d9672d056d2d741719a2b2d46ea6b269931d0b57674f}'
626fcf79ad0a48c12a86772003e483c3f342b23897ea48ecad72a67e8eff1131%

0
06.11.2019, 17:10
1 ответ

Ответ на ваш вопрос в некоторой степени зависит от того, какой механизм будет использоваться для запуска скрипта.

Предположим, что сценарий вызывается из какой-либо программы резервного копирования, которая не вызывается немедленно при подключении USB-устройства (, как это было бы в случае, если вы запускаете его из правила udev , для например ), то вы можете использовать udevadm infoдля сбора всей необходимой информации.

Идея была бы следующей:

  • ядро ​​автоматически назначает любому подключенному USB-накопителю узел устройства /dev/sdX
  • если вы перебираете все узлы устройств /dev/sd[a -z](или, скорее, те из них, которые фактически присутствуют в /dev/)и вызываете udevadm info --query=all /dev/sdXна каждый, вы можете определить, какой из них является USB-накопителем, потому что вывод будет иметь одну строку с указанием
E: ID_BUS=usb
  • аналогичным образом вы найдете строки вывода, содержащие информацию о производителе и модели, как в
E: ID_MODEL=Flash_Disk
<... >
E: ID_VENDOR=Generic

Поэтому, проанализировав вывод udevadmс помощью grepили аналогичного, вы сможете собрать всю необходимую информацию для своих целей.

4
28.01.2020, 02:29

Теги

Похожие вопросы