使用 sudo 将命令和局部变量传递给 ssh 时如何避免所需的引用和转义?

使用 sudo 将命令和局部变量传递给 ssh 时如何避免所需的引用和转义?

使用 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 "$(,并且您将获得远程执行部分的输出,以用于调试目的。

"$(提示:您可能需要转义...块中不成对的单引号或双引号)",即使您在注释中使用它。

相关内容