Criando um conteúdo variável variável manualmente

1

Estou criando um script de shell dinamicamente e enviando-o para um servidor remoto para execução. Tudo está funcionando, exceto quando tento injetar uma variável com conteúdo proveniente de um arquivo com várias linhas, aspas simples e duplas e outros caracteres especiais - o sistema tenta executar o arquivo.

Exemplo:

my_script=$(cat some script.sh)

cont=$(cat some_template_with_special_chars.sh)
var='the_var_name_to_inject'
kv="$var=$file_contents"

script_to_send=$kv$my_script

sh -t -t -i key usr@ip "$script_to_send"

Agora, se o conteúdo de some_template_with_special_chars.sh for um texto simples, ele funcionará, se tiver várias linhas e caracteres especiais, não. Outra questão é perder os espaços apesar de usar aspas duplas.

    
por Adam Silver 25.04.2016 / 18:41

1 resposta

3

Use "printf" para escapar de strings

Se eu entendi corretamente, você está criando uma instrução de atribuição de variável que será concatenada com um arquivo de script e tudo será executado em um shell.

Neste caso, sugiro algo nos moldes:

#!/bin/bash

my_script=$(<somescript.sh)

cont=$(<file)
var='xx'

# This will escape the string in $cont, and store it in $kv
printf -v kv "$var=%q" "$cont"

script_to_send="$kv
$my_script"

# sh -c used for testing here
sh -c "$script_to_send"

Exemplo:

Suponha que somescript.sh seja

echo "This is the value of xx:"
echo "$xx"
echo 'Script terminated'

e file contêm

aa
bb"
'cc
dd

Saída:

This is the value of xx:
aa
bb"
'cc
dd
Script terminated
    
por 25.04.2016 / 19:09