Importando configurações de variáveis de ambiente de outro servidor

1

Eu gostaria de importar todas as variáveis 'env' de outra caixa para uma máquina local. Eu copiei as variáveis env para env_var.txt na caixa local. Eu realizei o seguinte:

for i in 'cat env_var.txt'; do export $i; done

No entanto, isso não parece definir todas as minhas variáveis de env corretamente. Eu modifiquei

do export $i

em

do echo $i

e as variáveis parecem exibir tudo bem. O que poderia estar causando este problema. Ou existe uma maneira alternativa de importar todas as variáveis env?

    
por keyboard_solo 06.02.2017 / 19:26

2 respostas

2

Use o comando bash "source" dessa maneira:

source env_var.txt

Todas as variáveis devem ser importadas.

Para mais informações: link

    
por 06.02.2017 / 20:56
0

TL, DR: exportar com

export -p >env_var.sh

e importe com

. env_var.sh

Se o seu código funciona depende do formato env_var.txt e quais caracteres especiais (ou seja, caracteres que têm um significado especial na sintaxe do shell) estão presentes nos nomes e valores das variáveis.

'cat env_var.txt' é uma substituição de comando sem aspas. Deixar uma substituição de comando variável não indicada aplica o operador “split + glob” a ela: primeiro divida a saída do comando nos caracteres no valor da variável IFS , interprete cada parte como um padrão curinga de nome de arquivo e substitua cada padrão que corresponde a alguns arquivos pelos nomes dos arquivos correspondentes. O resultado é uma lista de palavras com as quais o loop for itera.

Uma substituição de comando sem aspas raramente é o que você quer, e neste caso definitivamente não é o que você quer. Isso funciona, no entanto, se a sintaxe do arquivo for, por exemplo, a saída de env e os valores das variáveis não contêm nenhum *?\[ ou espaço em branco .

Se env_var.txt for a saída de env , você poderá obter melhores resultados se a analisar de acordo com sua sintaxe real (atribuições separadas por nova linha), em vez de usar um método de análise que não faz sentido. Se você quiser usar o operador split + glob, que é a maneira mais fácil de fazer isso, defina IFS para ser apenas uma nova linha e a correspondência de caractere curinga.

set -f; IFS='
'
export 'cat env_var.txt'
set +f; unset IFS

Há um problema que você não pode resolver no lado do destinatário, no entanto, que é a saída de env é ambígua. Dado o seguinte conteúdo:

foo=bar
hello=world

não há como saber se há duas variáveis (uma chamada foo com o valor bar e uma chamada hello com o valor world ) ou apenas uma que é chamada foo com o valor

bar
hello=world

Para exportar as variáveis de ambiente de maneira não ambígua, não use env , use export . O comando export -p lista os valores de todas as variáveis de ambiente de uma maneira que pode ser analisada pelo shell. Então, no lado da exportação, corra

export -p >env_var.sh

No lado da importação, execute

. env_var.sh

Ressalva: no bash, a saída de export -p é passível de análise, mas apenas por bash. Para obter uma saída que funcione em outros shells sh-style, defina POSIXLY_CORRECT para qualquer valor de valor. Isso não tem efeito prejudicial em outros shells, então você pode apenas fazer

(POSIXLY_CORRECT=$POSIXLY_CORRECT; export -p) >env_var.sh

Configurar POSIXLY_CORRECT para o valor que tinha antes não faz diferença na saída - ou não estava no ambiente e não será depois de executar isso, ou foi no ambiente e valor não muda. Mas é o suficiente para forçar o bash a usar a sintaxe portátil com export na saída de export -p em vez de uma sintaxe específica do bash com declare .

Observe que a importação de variáveis de ambiente pode levar à execução de código arbitrário, portanto, importe somente env_var.txt ou env_var.sh de uma fonte em que você confia. O culpado são as variáveis de ambiente, não o fato de que . env_var.sh executa o código: apenas importar variáveis como PATH , LD_PRELOAD , ENV etc. pode levar à execução de código mais adiante na linha.

    
por 07.02.2017 / 00:59