如何在ssh命令中导出变量

如何在ssh命令中导出变量

我有这个带有 ssh 会话的脚本:

ssh -i /path/to/private_key somebody@ip_address_2 <<'EOF'
...
# Get the join command
JOIN_COMMAND=$(kubeadm token create --print-join-command)
EOF

ssh -i /path/to/second_private_key someother@ip_address_2 <<'EOF'
...
# run the JOIN_COMMAND
$JOIN_COMMAND
EOF

JOIN_COMMAND第二个会话需要使用第一个会话中生成的变量。我曾尝试export在第一个中使用,但没有导出,产生了错误。我怎样才能在 bash 中实现这一目标?

注意:ssh 会话发生在不同的远程节点上,即两个不同的 IP 地址。

答案1

环境变量是当一个命令执行另一个命令时从一个命令传递到另一个命令的变量,它是传递的东西,而不是位于任何进程都可以查询的某个虚幻位置的东西。

在这里,您似乎想使用某种形式的永久存储,例如文件系统:

ssh -i /path/to/private_key somebody@ip_address sh << 'EOF' || exit
kubeadm token create --print-join-command > join-command
EOF

它将 的输出存储kubeadm到 的主目录join-command中的文件中。somebody

然后:

ssh -i /path/to/private_key somebody@ip_address 'sh ./join-command'

或者,如果ssh从同一个本地 shell 中调用这两个命令,请让该 shell 将命令存储在其变量之一中:

join_command=$(
  ssh -i /path/to/private_key somebody@ip_address sh <<'EOF'
# Get the join command
kubeadm token create --print-join-command
EOF
) || exit
printf '%s\n' "$join_command" |
  ssh -i /path/to/private_key somebody@ip_address sh

这里假设命令输出kubeadm实际上是sh语法中的代码。

答案2

您需要在当前计算机上设置变量,而不是在远程计算机上。

所以像

JOIN_COMMAND=$(ssh -i /path/to/private_key somebody@ip_address_2 kubeadm token create --print-join-command)

请注意,对于如此简单的事情,您不需要“此处”脚本。

同样(如果没有特殊字符)你可以这样做

ssh -i /path/to/second_private_key someother@ip_address_2 $JOIN_COMMAND

相关内容