![手动创建复杂的变量内容](https://linux22.com/image/6763/%E6%89%8B%E5%8A%A8%E5%88%9B%E5%BB%BA%E5%A4%8D%E6%9D%82%E7%9A%84%E5%8F%98%E9%87%8F%E5%86%85%E5%AE%B9.png)
我正在动态创建一个 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