#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 нет проблем. Если вы считаете, что это того стоит, пожалуйста, подумайте о том, чтобы принять это как ответ и, возможно, дерзкий голос