Bash

使用 sudo 將命令和局部變數傳遞給 ssh 時,如何避免引用和轉義?

  • February 7, 2018

使用 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 "$(,您將獲得遠端執行部分的輸出,用於調試目的。

"$(提示:您可能需要在…塊中轉義非成對的單引號或雙引號)",即使您在註釋中使用它也是如此。

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