Кто-нибудь может помочь мне понять этот сценарий bash?

#bash #shell #firmware

#bash #оболочка #прошивка

Вопрос:

Я пытаюсь провести некоторый анализ прошивки SSD и нашел скрипт bash, называемый firmware.sh, который кажется мне интересным. Однако я действительно не знаю, на что я здесь смотрю.

Если кто-нибудь может помочь мне понять, для чего может использоваться этот код или что он делает, я был бы очень признателен!

Вот bash:

 #!/bin/sh -e

FIRMWARE_DIRS="/lib/firmware /usr/local/lib/firmware"

err() {
   echo "$@" >amp;2
   if [ -x /usr/bin/logger ]; then
       /usr/bin/logger -t "${0##*/}[$]" "$@"
   fi
}

if [ ! -e /sys$DEVPATH/loading ]; then
   err "udev firmware loader misses sysfs directory"
   exit 1
fi

for DIR in $FIRMWARE_DIRS; do
   [ -e "$DIR/$FIRMWARE" ] || continue
   echo 1 > /sys$DEVPATH/loading
   cat "$DIR/$FIRMWARE" > /sys$DEVPATH/data
   echo 0 > /sys$DEVPATH/loading
   exit 0
done

echo -1 > /sys$DEVPATH/loading
err "Cannot find  firmware file '$FIRMWARE'"
exit 1
 

Особый интерес для меня представляет цикл for … Я думаю, я понимаю, что синтаксис $NAME используется для переменных в bash, но я не знаю, на что ссылаются эти переменные. Спасибо за ваше внимание!

Комментарии:

1. это широкий вопрос. Вы пытались понять входные данные (переменные среды, параметры командной строки, считываемые файлы и каталоги, доступ к другим программам) и выходные данные (печатаемые сообщения, создаваемые файлы)?

Ответ №1:

Я попытаюсь объяснить это построчно.

 FIRMWARE_DIRS="/lib/firmware /usr/local/lib/firmware"
 

FIRMWARE_DIRS настраивается с двумя каталогами, разделенными пробелом. Это настроено для for цикла позже в сценарии.

 ...
for DIR in $FIRMWARE_DIRS; do
 

Для каждого цикла DIR устанавливается для каждого каталога, хранящегося в FIRMWARE_DIRS

    [ -e "$DIR/$FIRMWARE" ] || continue
 
  • [ обозначает начало теста, очень похожего if на , и ] отмечает конец этого теста.
  • -e проверяет, является ли переданный аргумент файлом или каталогом, который существует.
  • || означает or , что все, что находится справа от этого, будет выполнено, если тест слева завершится неудачей.
  • continue останавливает текущую итерацию цикла, который начинается на следующей итерации.
  • FIRMWARE предположительно, перед запуском этого скрипта настроена переменная среды. Вы можете увидеть его значение, если оно было настроено при входе в систему, выполнив команду echo $FIRMWARE в командной строке.

    echo 1 > /sys$DEVPATH/loading
 

Усекает файл /sys$DEVPATH/loading , если он существует, затем выводит номер 1 в этот файл.

    cat "$DIR/$FIRMWARE" > /sys$DEVPATH/data
 

Усекает файл /sys$DEVPATH/data , если он существует, затем выводит содержимое файла (ов) $DIR/$FIRMWARE в /sys$DEVPATH/data . Если FIRMWARE содержит подстановочный * знак, он скопирует содержимое всех сопоставленных файлов.

    echo 0 > /sys$DEVPATH/loading
 

Усекает файл sys$DEVPATH/loading , если он существует, затем выводит номер 0 в этот файл.

    exit 0
 

Завершает работу скрипта со статусом возврата 0 (означает, что он завершен нормально). Это приводит к завершению сценария в for цикле на этом этапе для любой итерации, которая прошла тест выше (тот, который проверяет, существует ли файл или каталог).

В целом, похоже, что он проверяет первый существующий каталог FIRMWARE_DIRS , копирует один или несколько файлов прошивки оттуда в другое место ( /sys$DEVPATH/data ) и завершает работу, как только это будет сделано один раз.

Комментарии:

1. Потрясающе, это очень помогает. Спасибо!

2. @Derdle нет проблем. Если вы считаете, что это того стоит, пожалуйста, подумайте о том, чтобы принять это как ответ и, возможно, дерзкий голос