Мне нужно создать файл конфигурации для моего собственного скрипта: вот пример:
сценарий:
#!/bin/bash
source /home/myuser/test/config
echo "Name=$nam" >&2
echo "Surname=$sur" >&2
Содержание /home/myuser/test/config
:
nam="Mark"
sur="Brown"
это работает!
Мой вопрос: это правильный способ сделать это или есть другие способы?
bash
shell
shell-script
Пол Халлен
источник
источник
abcde
также делает это таким образом, и это довольно большая программа (для сценария оболочки). Вы можете посмотреть на это здесь .Ответы:
source
не является безопасным, поскольку он будет выполнять произвольный код. Это может вас не беспокоить, но если права доступа к файлам неверны, злоумышленник с правами доступа к файловой системе может выполнить код от имени привилегированного пользователя, внедрив код в файл конфигурации, загруженный сценарием, защищенным иным способом, таким как сценарий инициализации.Пока что лучшее решение, которое я смог определить, - это неуклюжее решение «изобретать за рулем»:
myscript.conf
Используя
source
, это будет запускатьсяecho rm -rf /
дважды, а также изменит работающего пользователя$PROMPT_COMMAND
. Вместо этого сделайте это:myscript.sh (Bash 4)
myscript.sh (Mac / Bash 3-совместимый)
Пожалуйста, ответьте, если вы найдете уязвимость в моем коде.
источник
*
правильно обрабатывать входные данные, но что тогда в Bash хорошо обрабатывает этот символ?my\\password
Вот чистая и портативная версия, совместимая с Bash 3 и выше, как для Mac, так и для Linux.
Он определяет все значения по умолчанию в отдельном файле, чтобы избежать необходимости в огромной, загроможденной, дублированной функции конфигурации «по умолчанию» во всех ваших сценариях оболочки. И это позволяет вам выбирать между чтением с или без отступлений по умолчанию:
config.cfg :
config.cfg.defaults :
config.shlib (это библиотека, поэтому нет строки shebang):
test.sh (или любые сценарии, в которых вы хотите прочитать значения конфигурации) :
Объяснение тестового скрипта:
printf
линия? Ну, это то, о чем вы должны знать:echo
это плохая команда для печати текста, которую вы не можете контролировать. Даже если вы используете двойные кавычки, он будет интерпретировать флаги. Попробуйте установитьmyvar
(вconfig.cfg
) значение,-e
и вы увидите пустую строку, потому чтоecho
будете думать, что это флаг. Ноprintf
не имеет этой проблемы. Ониprintf --
говорят: «напечатайте это, и ничего не интерпретируйте как флаги», и"%s\n"
говорят: «форматируйте вывод как строку с завершающим переводом строки, и, наконец, последний параметр - это значение для printf для форматирования.myvar="$(config_get myvar)";
. Если вы собираетесь распечатывать их на экране, я предлагаю использовать printf для полной защиты от любых несовместимых с эхом строк, которые могут быть в конфигурации пользователя. Но echo - это хорошо, если предоставленная пользователем переменная не является первым символом строки, которую вы выводите, поскольку это единственная ситуация, в которой «флаги» могут быть интерпретированы, поэтому что-то вроде этогоecho "foo: $(config_get myvar)";
безопасно, поскольку «foo» не начинаться с тире и, следовательно, говорит echo, что остальная часть строки также не является для него флажком. :-)источник
config.cfg.defaults
вместо определения их во время вызова$(config_get var_name "default_value")
. tritarget.org/static/...Разобрать файл конфигурации, не выполнять его.
В настоящее время я пишу приложение на работе, которое использует чрезвычайно простую конфигурацию XML:
В сценарии оболочки («приложение») это то, что я делаю, чтобы получить имя пользователя (более или менее я поместил его в функцию оболочки):
xml
Команда XMLStarlet , которая доступна для большинства юниксы.Я использую XML, так как другие части приложения также имеют дело с данными, закодированными в файлах XML, так что это было проще всего.
Если вы предпочитаете JSON, есть
jq
простой в использовании анализатор оболочки JSON.Мой файл конфигурации будет выглядеть примерно так в JSON:
И тогда я получу имя пользователя в сценарии:
источник
eval
для установки нескольких значений, вы выполняете выбранные части файла конфигурации :-).eval
. Увеличение производительности при использовании стандартного формата с существующим синтаксическим анализатором (даже если это внешняя утилита) незначительно по сравнению с надежностью, объемом кода, простотой использования и ремонтопригодностью.Наиболее распространенным, эффективным и правильным способом является использование
source
или.
в качестве сокращенной формы. Например:или
Однако необходимо учитывать проблемы безопасности, которые могут возникнуть при использовании дополнительного файла конфигурации из внешних источников, учитывая возможность добавления дополнительного кода. Для получения дополнительной информации, в том числе о том, как обнаружить и решить эту проблему, я бы порекомендовал взглянуть на раздел «Безопасное использование» на http://wiki.bash-hackers.org/howto/conffile#secure_it.
источник
Я использую это в моих сценариях:
Должен поддерживать все комбинации символов, кроме ключей, которые не могут быть
=
в них, так как это разделитель. Все остальное работает.Кроме того, это абсолютно безопасно, так как он не использует никаких
source
/eval
источник
Для моего сценария
source
или.
было нормально, но я хотел поддерживать локальные переменные среды (т.е.FOO=bar myscript.sh
), имеющие приоритет над настроенными переменными. Я также хотел, чтобы файл конфигурации был редактируемым пользователем и удобным для кого-то, кто использовал исходные файлы конфигурации, и чтобы он был как можно меньшим / простым, чтобы не отвлекать от основной идеи моего очень маленького сценария.Вот что я придумал:
По сути - он проверяет определения переменных (не проявляя особой гибкости в отношении пробелов) и переписывает эти строки, чтобы значение для этой переменной было преобразовано в значение по умолчанию, и переменная не изменяется, если она найдена, как
XDG_CONFIG_HOME
переменная выше. Он получает эту измененную версию файла конфигурации и продолжает работу.Дальнейшая работа может сделать
sed
скрипт более устойчивым, отфильтровывать строки, которые выглядят странно или не являются определениями и т. Д., Не прерывать комментарии в конце строки - но для меня этого пока достаточно.источник
Это сжато и безопасно:
В
-i
гарантирует , что вы получите только переменные изcommon.vars
источник
Ты можешь это сделать:
источник