手动创建复杂的变量内容

手动创建复杂的变量内容

我正在动态创建一个 shell 脚本并将其发送到远程服务器以供执行。一切正常,除非我尝试注入一个变量,其中的内容来自具有多行、单引号和双引号以及其他特殊字符的文件——系统尝试执行该文件。

例子:

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"

现在,如果 some_template_with_special_chars.sh 的内容是简单文本,则它可以工作,如果它有多行和特殊字符,则不能。另一个问题是尽管使用双引号,但它还是丢失了空格。

答案1

使用“printf”转义字符串

如果我理解正确的话,您将创建一个变量赋值语句,该语句将与脚本文件连接,并且所有内容都将在 shell 中执行。

在这种情况下,我建议如下:

#!/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"

例子:

假设somescript.sh

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

file包含

aa
bb"
'cc
dd

输出:

This is the value of xx:
aa
bb"
'cc
dd
Script terminated

相关内容