Bash

手動創建複雜的變數內容

  • April 25, 2016

我正在動態創建一個 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 的內容是簡單的文本,它可以工作,如果它有多行和特殊字元,它就不行。另一個問題是儘管使用了雙引號,它還是會失去空格。

使用“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

引用自:https://unix.stackexchange.com/questions/278969