Установка содержимого файла с символами новой строки и других специальных символов в качестве переменной среды с интерпретацией включенных переменных [дубликат]

0
27.07.2017, 14:59
2 ответа

Попробуйте:

eval "content=\$(cat << @@@EOF@@@
$(cat file)
@@@EOF@@@
)"

Это расширит подстановки параметров, арифметики и команд, а \используется для экранирования (из $, `и только самого )и продолжения строки -. Например,на вход типа:

* foo
\/-!~ 
FOO=${FOOBAR} $((1+1)) $(uname)
\${FOOBAR}\\foo\
bar

Это дает что-то вроде:

* foo
\/-!~
FOO=content-of-$FOOBAR 2 Linux
${FOOBAR}\foobar

Должно быть очевидно, что это уязвимость внедрения команд, если содержимое файла не находится под вашим полным контролем.

0
28.01.2020, 02:45

Этот ответ основан на принятом ответе наhttps://stackoverflow.com/questions/10683349/forcing-bash-to-expand-variables-in-a-string-loaded-from-a-file

и адаптирован из него.
#!/bin/bash
export FOOBAR="SUCCESS"
file="testfile.txt"
var_name="TEST"
name="$file"

content="$(envsubst < "$file")"
echo "$content"

В отличие от eval, envsubstзаменяет только переменные, нет риска выполнения других программ посредством подстановки команд или чего-то подобного. Это очень простой инструмент для создания шаблонов для оболочки.

envsubstявляется частью утилиты интернационализации GNU gettext (в Debian, она находится в пакете gettext-base).

Обратите внимание, что envsubst(, являясь внешней командой, а не оболочкой, созданной -в ), может видеть только те переменные, которые были экспортированы (, но см. стандартную allexportопцию sh, чтобы сделать оболочку экспортировать впоследствии определенные переменные в среду ).

2
28.01.2020, 02:45

Теги

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