![使用 sudo 将命令和局部变量传递给 ssh 时如何避免所需的引用和转义?](https://linux22.com/image/127143/%E4%BD%BF%E7%94%A8%20sudo%20%E5%B0%86%E5%91%BD%E4%BB%A4%E5%92%8C%E5%B1%80%E9%83%A8%E5%8F%98%E9%87%8F%E4%BC%A0%E9%80%92%E7%BB%99%20ssh%20%E6%97%B6%E5%A6%82%E4%BD%95%E9%81%BF%E5%85%8D%E6%89%80%E9%9C%80%E7%9A%84%E5%BC%95%E7%94%A8%E5%92%8C%E8%BD%AC%E4%B9%89%EF%BC%9F.png)
使用 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 "$(
,并且您将获得远程执行部分的输出,以用于调试目的。
"$(
提示:您可能需要转义...块中不成对的单引号或双引号)"
,即使您在注释中使用它。