使用一个命令从我的本地计算机按顺序SSH到多个主机

时间:2018-12-13 17:34:26

标签: ssh terminal zsh

我当前正在尝试编写一个别名,该别名涉及从本地计算机SSH到一台主机,然后再通过SSH到最后一台计算机。我的bash技能还不能完全达到标准,而且我似乎无法弄清楚到底发生了什么。

这就是我拥有的

ssh -A my_user@host_1 -t "get_ip | sed -n 2p | xargs -I {} ssh -T my_user@{}"

最终,我想从本地计算机运行一个命令:

  1. 将我SSH到初始远程计算机。在这里,我想运行get_ip并解析其输出,这为我提供了IP
  2. 第一步的IP是我要SSH进入并获得一个活动会话运行的最终服务器(不想退出)。这是我在命令的最后一部分中想要做的。

换句话说:

在本地计算机上运行命令->在第一台远程服务器上运行命令,并使用该命令的输出获取下一台计算机的ip->使用检索到的IP SSH连接到最后一台计算机->将最后一台计算机打开到SSH进行开放会话

现在我当前的命令正在返回:

Connection to host_1 closed

1 个答案:

答案 0 :(得分:0)

设置管道将替换stdin(以便输入来自现在为空的管道,而不是来自原始终端)。使用命令替换代替xargs,并使用-tt强制在每个阶段分配TTY:

ssh -ttA my_user@host_1 'ssh -tt "my_user@$(get_ip | sed -n 2p)"'

更好:

sshWithCache() {
  ssh \
    -o "ControlPath $HOME/.ssh/control:%h:%p:%r" \
    -o "ControlMaster auto" \
    -o "ControlPersist 5m" \
    "$@"
}

sshIndirectly() {
  local ip
  ip=$(sshWithCache my_user@host_1 'get_ip | sed -n 2p')
  sshWithCache -o "ProxyJump my_user@host_1" "my_user@$ip" "$@"
}

......之后,您可以运行sshIndirectly someCommand在host_2上调用someCommand。由于ControlPath / ControlMaster的配置,仅创建了一个与host_1的实际SSH连接,并且仅执行了一次身份验证。