使用 sudo 将命令和局部变量传递给 ssh 时如何避免所需的引用和转义?
发现有人提供了一种创造性的方法来避免使用此处文档进行引用。这听起来是个好主意,但在 bash 中对我来说不起作用。这是我找到的建议:在 ssh $host $FOO 和 ssh $host "sudo su user -c $FOO" 类型构造中引用
答案1
这是一个基本的 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"
"$(
...)"
允许将多个命令分组在一起并允许在此块中使用双引号。
导出此处文档块(不使用单引号)允许在块中使用局部变量:
cat <<HEREDOC_EXPORT_VARIABLES
...
...
HEREDOC_EXPORT_VARIABLES
导出本地变量以供远程命令使用。
export myvar1="$myvar1"
export myvar2="$myvar2"
外部此处文档块,用单引号括起来,用于回显 sudo 命令并消除内部此处文档转义远程变量的必要性(可能可以替换为echo
不带换行符):
cat <<'HEREDOC_SUDO'
...
...
HEREDOC_SUDO
内部此处文档块用单引号引起来,以消除转义远程变量的必要性。
sudo -Eu root /bin/bash <<'HEREDOC_COMMANDS'
...
...
HEREDOC_COMMANDS
-E
选项sudo
允许保留之前导出的环境变量。
tee logfile.log
允许同时将输出回显到终端和日志文件。
作为奖励,您可以将ssh myremotehost "$(
line 替换为echo "$(
,并且您将获得远程执行部分的输出,以用于调试目的。
"$(
提示:您可能需要转义...块中不成对的单引号或双引号)"
,即使您在注释中使用它。