我当前正在尝试编写一个别名,该别名涉及从本地计算机SSH到一台主机,然后再通过SSH到最后一台计算机。我的bash技能还不能完全达到标准,而且我似乎无法弄清楚到底发生了什么。
这就是我拥有的
ssh -A my_user@host_1 -t "get_ip | sed -n 2p | xargs -I {} ssh -T my_user@{}"
最终,我想从本地计算机运行一个命令:
换句话说:
在本地计算机上运行命令->在第一台远程服务器上运行命令,并使用该命令的输出获取下一台计算机的ip->使用检索到的IP SSH连接到最后一台计算机->将最后一台计算机打开到SSH进行开放会话>
现在我当前的命令正在返回:
Connection to host_1 closed
答案 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连接,并且仅执行了一次身份验证。