Configuração do conteúdo do arquivo com novas linhas e outros caracteres especiais como variável de ambiente com interpretação das variáveis incluídas [duplicado]

0

Dado eu gostaria de criar variáveis de ambiente de arquivos contendo novas linhas e caracteres especiais. A pista é que esse conteúdo pode ter referências a outras variáveis de ambiente que precisam ser interpretadas. Talvez eu precise de ferramentas mais complexas do que simplesmente bash?

Um arquivo de teste "testfile.txt" pode ter a seguinte aparência:

* foo
\/-!~ 
FOO=${FOOBAR}

O que eu consegui até agora é o seguinte:

#!/bin/bash
FOOBAR="SUCCESS"
file="testfile.txt"
var_name="TEST"
name="$file"
content="$(<$file)"
echo "$content"

O que me dá uma variável de contexto como saída (assim, exatamente o conteúdo do arquivo):

* foo
\/-!~
FOO=${FOOBAR}

Mas como posso:

  1. Permitir que $ {FOOBAR} seja definido como "SUCESSO" conforme definido acima, mas não toque no restante?
  2. Definir uma variável de ambiente TEST que teria conteúdo como (1)?
por J. Doe 27.07.2017 / 11:03

2 respostas

1

Esta resposta é baseada e adaptada da resposta aceita para link

#!/bin/bash
export FOOBAR="SUCCESS"
file="testfile.txt"
var_name="TEST"
name="$file"

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

Ao contrário de eval , envsubst apenas substitui variáveis, não há risco de executar outros programas por meio de substituição de comando ou similar. É uma ferramenta de templates muito simples para shell.

envsubst é parte dos utilitários de internacionalização do GNU gettext (no debian, é no pacote gettext-base ).

Observe que envsubst (sendo um comando externo, não um shell embutido) pode ver somente as variáveis que foram exportadas (mas veja a opção allexport standard sh para tornar as variáveis subsequentemente definidas pela exportação do shell meio ambiente).

    
por 27.07.2017 / 12:24
0

Tente:

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

Isso expandirá o parâmetro, aritmética e substituições de comandos, e \ será usado para escape (de $ , ' e somente para si) e continuação de linha. Por exemplo, em uma entrada como:

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

Isso dá algo como:

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

Deve ficar óbvio que é uma vulnerabilidade de injeção de comando se o conteúdo do arquivo não estiver sob seu controle total.

    
por 27.07.2017 / 11:23