Bash
使用 sudo 將命令和局部變數傳遞給 ssh 時,如何避免引用和轉義?
使用 sudo 將命令和局部變數傳遞給 ssh 時,如何避免引用和轉義?
發現有人提供了一種創造性的方式來避免使用 here-documents 引用。這聽起來是個好主意,但它在 bash 中對我不起作用。這是我找到的建議:在 ssh 中引用 $ host $ FOO 和 ssh $ host “sudo su user -c $ FOO” 類型構造
這是一個基本的 bash 腳本範例。
# Assign values to variables locally. myvar1="myvalue1" myvar2="myvalue2" # Add your local commands here. ssh myremotehost "$( cat <<HEREDOC_EXPORT_VARIABLES export myvar1="$myvar1" export myvar2="$myvar2" HEREDOC_EXPORT_VARIABLES cat <<'HEREDOC_SUDO' sudo -Eu root /bin/bash <<'HEREDOC_COMMANDS' # Optionally display your variables. echo "myvar1: $myvar1" echo "myvar2: $myvar2" # Add your remote commands here. HEREDOC_COMMANDS HEREDOC_SUDO )" | tee logfile.log
不同部分的解釋。
變數在本地賦值(在遠端機器上執行命令之前):
myvar1="myvalue1" myvar2="myvalue2"
"$(
…)"
允許將多個命令組合在一起並允許在此塊中使用雙引號。導出 here-document 塊,不是單引號,允許在塊中使用局部變數:
cat <<HEREDOC_EXPORT_VARIABLES ... ... HEREDOC_EXPORT_VARIABLES
導出可用於遠端命令的局部變數。
export myvar1="$myvar1" export myvar2="$myvar2"
用單引號括起來的外部 here-document 塊,以回顯 sudo 命令並消除內部 here-document 的遠端變數轉義的必要性(可能被替換為
echo
不帶換行符):cat <<'HEREDOC_SUDO' ... ... HEREDOC_SUDO
內部的 here-document 塊,用單引號括起來,以消除遠端變數轉義的必要性。
sudo -Eu root /bin/bash <<'HEREDOC_COMMANDS' ... ... HEREDOC_COMMANDS
-E
選項 insudo
允許保留之前導出的環境變數。
tee logfile.log
允許同時將輸出回顯到終端和日誌文件。作為獎勵,您可以將
ssh myremotehost "$(
line替換為echo "$(
,您將獲得遠端執行部分的輸出,用於調試目的。
"$(
提示:您可能需要在…塊中轉義非成對的單引號或雙引號)"
,即使您在註釋中使用它也是如此。