通过 ssh 远程嵌套服务器中的变量

variables in remote nested server via ssh

正在尝试设置和访问远程服务器上的一些变量 该脚本将在本地服务器上执行,它将登录到 remote-server1,然后再次登录到另一个第二个远程服务器 remote-server2 我可以在本地和远程服务器 1 中成功设置和访问变量,没有任何问题,但在远程服务器 2 上做同样的事情时遇到问题

local1=$(echo "local-srv"); echo "${local1}"
output=$(sshpass -p "${PSSWD}" ssh -t -q -oStrictHostKeyChecking=no admin@$mgmtIP "bash -s" <<EOF
remote1=$(echo "remote-srv1"); echo "${remote1}"
ssh -t -q -oStrictHostKeyChecking=no "${targetCompute}" "bash -s" <<EOF2
remote2=$(echo "remote-srv2"); echo "${remote2}"
EOF2
EOF
)

这是我的输出

local-srv
remote-srv1

如您所见,缺少 remote-srv2

-----更新---

请注意,$(echo "text")只是为了简单起见,但此处将执行复杂的命令并将输出设置为变量

您有两个嵌套的 ssh 命令和嵌套的 here-documents,为了延迟对内部命令中 $ 表达式的解释,您需要更多转义。要查看问题,您可以将 ssh 命令替换为 cat 命令以查看将发送到远程计算机的内容。这是一个示例,使用您的原始代码(以及一些修改后的变量定义);请注意 $> 是来自我的 shell.

的提示
$ targetCompute=remote-server2
$ local1="local-srv"; echo "${local1}"
local-srv
$ cat <<EOF
> remote1=$(echo "remote-srv1"); echo "${remote1}"
> ssh -t -q -oStrictHostKeyChecking=no "${targetCompute}" "bash -s" <<EOF2
> remote2=$(echo "remote-srv2"); echo "${remote2}"
> EOF2
> EOF
remote1=$(echo "remote-srv1"); echo "${remote1}"
ssh -t -q -oStrictHostKeyChecking=no "remote-server2" "bash -s" <<EOF2
remote2=$(echo "remote-srv2"); echo "${remote2}"
EOF2

请注意,与 remote1remote2 相关的行都已删除转义符,因此它们都将在 remote-srv1 上扩展其 $ 表达式。这就是你想要的 remote1 行,但是要延迟对 remote2 行的解释,你必须添加另一个转义......并且转义本身需要转义,所以实际上会有 three escapes 在每个 $:

之前
$ cat <<EOF
> remote1=$(echo "remote-srv1"); echo "${remote1}"
> ssh -t -q -oStrictHostKeyChecking=no "${targetCompute}" "bash -s" <<EOF2
> remote2=\$(echo "remote-srv2"); echo "\${remote2}"
> EOF2
> EOF
remote1=$(echo "remote-srv1"); echo "${remote1}"
ssh -t -q -oStrictHostKeyChecking=no "remote-server2" "bash -s" <<EOF2
remote2=$(echo "remote-srv2"); echo "${remote2}"
EOF2

所以本地here-document中的\$(echo "remote-srv2")"\${remote2}"变成了remote-srv1上here-document中的$(echo "remote-srv2")"${remote2}",然后命令实际上被执行并在 remote-srv2 上扩展变量。

我需要在 ///

之前逃离

感谢@Goron Davisson 的回答

local1=$(echo "local-srv"); echo "${local1}"
output=$(sshpass -p "${PSSWD}" ssh -t -q -oStrictHostKeyChecking=no admin@$mgmtIP "bash -s" <<EOF
remote1=$(echo "remote-srv1"); echo "${remote1}"
ssh -t -q -oStrictHostKeyChecking=no "${targetCompute}" "bash -s" <<EOF2
remote2=\$(echo "remote-srv2"); echo "\${remote2}"
EOF2
EOF
)

输出

local-srv
remote-srv1
remote-srv2