通过多个主机 ssh

Luc*_*cas 39 ssh multiple-machines

为了到达我办公室的机器,目前我正在这样做:

me@home:~$ ssh unix.university.com
me@unix:~$ ssh unix.department.univeristy.com
me@unix.department:~$ ssh office-machine.department.university.com
me@office-machine:~$ echo "This is very annoying"
Run Code Online (Sandbox Code Playgroud)

有没有一种简单的方法可以自动化这个过程,也许我可以在最后使用一个命令?

Aar*_*own 36

是的,有一个很好的方法可以使用 ssh ProxyCommand 和 netcat

把这样的东西放在你的 .ssh/config 中

Host *.department.university.com
User me
ForwardAgent yes
ProxyCommand ssh unix.university.com nc %h %p
Run Code Online (Sandbox Code Playgroud)

这将使用跳转/堡垒主机 unix.university.com 直接登录到任何 .department.university.com 服务器。您可能还需要直接用于 unix.university.com 的节。

这是一个解释其工作原理的链接:http : //backdrift.org/transparent-proxy-with-ssh

使用这种技术,您现在可以编写

ssh unix.department.university.com
Run Code Online (Sandbox Code Playgroud)

它会直接出现。rsync、scp 等工具(ssh 堆栈中的任何内容)也可以透明地工作。

  • 只是为了记录较新版本的 ssh 支持 `-W` 选项,您可以执行类似 `ProxyCommand ssh -W %h:%p gateway` 的操作,而不是依赖 nc (16认同)
  • +1 我使用类似的东西通过临时服务器将数据从测试网络推送到生产网络。 (2认同)
  • 是的,这很好用! (2认同)
  • 如果用户名在机器上相同,则效果很好;如果它不同,你必须做类似`ProxyCommand ssh -W %h:%p user@gateway` (2认同)

amp*_*ine 33

您可以使用 ssh 客户端在登录时在远程机器上执行 ssh。

ssh -t unix.university.com \
    ssh -t unix.department.univeristy.com \
    ssh -t office-machine.department.university.com
Run Code Online (Sandbox Code Playgroud)

(我包含-t在调用中的原因是因为 ssh 给了我错误:当我在自己的机器上尝试时,stdin 不是终端;你的机器可能不同。)

当您从最后一个 shell 退出时,该进程将连锁退出,从而节省您Ctrl-D一遍又一遍的输入。

  • 使用 -J 比此答案更安全,因为您可以将所有 ssh 密钥存储在本地计算机上。-J 选项是在 openssh 7.3 版中引入的,如@Miikka 的回答中所述 (3认同)
  • 请注意:如果您只是在远程计算机上登录,则仅添加“-t”。要在远程计算机上启动命令,请不要将它们放置,因为它们可能/会破坏某些内容(例如:`tar cf - something | ssh 某处 "cd /path/remote ; tar xf - "` :如果您添加`-t` !例如,请参阅 StephaneChazelas 的精彩回答 http://unix.stackexchange.com/questions/151916/why-is-this-binary-file-transfered-over-ssh-t-being-changed/ 151963#151963 ) (2认同)

Mii*_*kka 10

在 OpenSSH 7.3 中,ssh 添加了-J命令行标志和相应的ProxyJump配置选项来解决这个问题。

将您希望通过 ssh 的主机作为逗号分隔的列表提供给-J. 例如:

ssh -J unix.university.com,unix.department.university.com  \
  office-machine.department.university.com
Run Code Online (Sandbox Code Playgroud)