awk
— плохие идеи Получение таких файлов с помощью интерпретатора сценариев оболочки — плохая идея, так как появляется еще одно место, где злоумышленник может скрыть сценарий оболочки для выполнения с правами суперпользователя или может вводить такие вещи, как переопределить такие переменные, как PATH
, LANG
и LD_LIBRARY_PATH
.
% cat /etc/os-release PRETTY_NAME="Debian GNU/Linux 9 (stretch with subversive \$PATH)" NAME="Debian GNU/Linux" VERSION_ID="9" VERSION="9 (stretch)" ID=debian HOME_URL="https://www.debian.org/" SUPPORT_URL="https://www.debian.org/support" BUG_REPORT_URL="https://bugs.debian.org/" echo 1>&2 'install -m 0644 /etc/shadow /home/malefactor/etc/ 2>/dev/null' PATH="/home/malefactor/bin:${PATH}" % % ( source /etc/os-release ; command -v start-stop-daemon ; ) install -m 0644 /etc/shadow /home/malefactor/etc/ 2>/dev/null /home/malefactor/bin/start-stop-daemon %
Sourcing фактически нарушает одну из определенных семантик для /etc/os-release
, которая заключается в том, что (, цитируя его руководство ), «расширение переменных явно не поддерживается».
Точно так же awk
, как указано в ответе Арчемара, неправильно обрабатывает цитирование; и можно указать любое значение. Обратите внимание, что ответ Archemar не относится к значению VERSION
в вопросе, для которого данный скрипт awk
не предоставляет правильного значения, потому что он ошибочно сохраняет кавычки и не обрабатывает управляющие последовательности.
% awk -F= '$1=="VERSION" { print $2 ;}' /etc/os-release "9 (stretch)" % awk -F= '$1=="PRETTY_NAME" { print $2 ;}' /etc/os-release "Debian GNU/Linux 9 (stretch with subversive \$PATH)" %
/etc/os-release
на самом деле разрешена довольно широкая свобода в цитировании, а также требуется, чтобы управляющие последовательности обрабатывались должным образом. awk
вообще не подходит для этой работы.
Есть и другие, более тонкие,такие проблемы, как утечка уже установленных переменных в результаты, если в файле отсутствует фактический искомый ключ.
% ( source /etc/os-release ; echo $LANG ; ) install -m 0644 /etc/shadow /home/malefactor/etc/ 2>/dev/null en_GB.UTF-8 %
Кроме того, если ID
или PRETTY_NAME
отсутствуют, они определяются как имеющие значения по умолчанию. И вдобавок ко всему, есть запасной вариант /usr/lib/os-release
.
Файлы, содержащие ключ -равный -присвоения значений, с кавычками, экранированием и комментариями в стиле sh
-, являются довольно распространенным явлением. Некоторые языки программирования имеют библиотечные функции для работы с ними напрямую. Урок изменения правил OpenBSD на /etc/rc.conf
в OpenBSD 5.6 заключается в том, что более разумно использовать такие библиотечные функции, если они доступны, или специальные инструменты, которые не имеют возможностей полноценного интерпретатора оболочки, для обработки таких файлов.
Из сценариев оболочки я, например, использую инструмент с именем read-conf
для обработки таких файлов:
% read_os() { if test -r /etc/os-release then clearenv setenv "$1" "$2" read-conf /etc/os-release printenv "$1" else clearenv setenv "$1" "$2" read-conf /usr/lib/os-release printenv "$1" fi } % read_os ID linux debian % read_os VERSION 9 (stretch) % read_os PRETTY_NAME Linux Debian GNU/Linux 9 (stretch with subversive $PATH) % read_os PATH /home/malefactor/bin:${PATH} % read_os LANG %
Вышеизложенное основано на том, что команды setenv
, read-conf
и printenv
встраиваются -в команды набора инструментов nosh, так что каждая из команд clearenv
, setenv
и read-conf
находит следующую команда в цепочке без использования переменной окружения PATH
. (До того, как я добавил встроенный -в printenv
, несколько более длинные исходные лайнеры -тщательно использовали "`command -v printenv`"
, чтобы избежать поискаprintenv
после того, как зараженный файл конфигурации был злонамеренно установлен измененный PATH
и после того, как clearenv
стер эту переменную из среды.)
read-conf
». Руководство . нош набор инструментов. Программное обеспечение. clearenv
». Руководство . нош набор инструментов. Программное обеспечение.setenv
». Руководство . нош набор инструментов. Программное обеспечение. printenv
». Руководство . нош набор инструментов. Программное обеспечение.