Bash
手動創建複雜的變數內容
我正在動態創建一個 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