如何使用一个命令通过 B SSH 连接到机器 A?

如何使用一个命令通过 B SSH 连接到机器 A?

我想访问计算机,比如机器A它位于我大学的网络中。但是,这台计算机只能通过大学的内部网络访问,因此我无法直接从家里使用 SSH 访问这台计算机。

以下是我现在的做法:

  1. 登录到不同的大学机器,比如机器B

    (我家里的电脑可以通过 SSH 访问这台机器 B。)

  2. 在 B 上使用 SSH 连接到 A。

有没有更快的方法?仅使用一个 ssh 命令。

答案1

ProxyCommand在您的 SSH 配置中使用。

在您的主目录中创建一个 SSH 配置文件(除非您想使其成为系统范围的)~/.ssh/config,:

Host unibroker          # Machine B definition (the broker)
Hostname 12.34.45.56    # Change this IP address to the address of the broker
User myusername         # Change this default user accordingly 
                        # (`user@unibroker` can overwrite it)

Host internalmachine    # Machine A definition (the target host)
ProxyCommand ssh -q unibroker nc hostname.or.IP.address.internal.machine 22

现在你可以使用以下方式直接访问机器 A

ssh user@internalmachine

还请注意,现在您有一个单独的 SSH 主机目标名称,您也可以在其他应用程序中使用它。例如:

  • SCP 复制文件。

    scp somefile user@internalmachine:~/
    
  • 在您的 GUI 应用程序中:

    用作sftp://user@internalmachine/在机器上浏览的位置。

    基于 KDE (Dolphin): 使用fish://user@internalmachine/

笔记

hostname.or.IP.address.internal.machine将端口 ( )更改22到您想要访问的机器,就像从机器访问一样unibroker

根据 unibroker 主机上的 netcat 版本,-q0必须省略该选项。关于身份验证;您基本上是从工作站设置两个 SSH 连接。这意味着 unibroker 主机和 internalmachine 主机都会被逐个验证/认证(用于密钥对/密码和主机密钥验证)。

解释

这种使用ProxyCommand“netcat”的方法只是其中一种方法。我喜欢这种方法,因为我的 SSH 客户端直接与目标机器对话,这样我就可以从客户端验证主机密钥,并且我可以使用我的公钥身份验证,而无需在代理上使用其他密钥。

每个都Host定义了新主机部分的开始。Hostname是该主机的目标主机名或 IP 地址。User是您作为用户部分提供的内容ssh user@hostname

ProxyCommand将用作通向目标机器的管道。通过使用 SSH 连接到第一台机器,然后直接nc从那里设置一个简单的“netcat”()到目标,这基本上只是从两者之间的代理向内部机器转发纯文本。选项-q是静音任何输出(只是个人偏好)。

确保在代理上安装了 netcat(通常在 Ubuntu 上默认可用)-netcat-openbsd安装 netcat-openbsd或者netcat-传统安装 netcat-traditional

请注意,您在这里仍然使用两次加密的 SSH。虽然 netcat 通道是纯文本,但您 PC 上的 SSH 客户端将与最终目标机器建立另一个加密通道。

答案2

您可以使用-J命令行选项:

ssh -J user@machineB user@machineA

man ssh

-J [user@]host[:port]
     Connect to the target host by first making a ssh connection to
     the jump host and then establishing a TCP forwarding to the
     ultimate destination from there.  Multiple jump hops may be
     specified separated by comma characters.  This is a shortcut to
     specify a ProxyJump configuration directive.

它被引入于OpenSSH版本 7.3(2016 年 8 月发布)。它适用于 Ubuntu 16.10 及更高版本。

答案3

一口气

我提供的 ProxyCommand 方法的一个明显替代方案我的其他答案将直接“跳转”至目标机器:

ssh -t user@machineB ssh user@machineA

注意-t第一个ssh命令中的。如果没有它,它将失败:

Pseudo-terminal will not be allocated because stdin is not a terminal.
ssh_askpass: exec(/usr/bin/ssh-askpass): No such file or directory
Permission denied, please try again.
[...]

它将强制分配一个真正的 TTY

缺点是现在所有配置、验证和身份验证都在机器 B 上进行,出于安​​全原因,我真的不喜欢这种情况。我喜欢在自己的 PC 上使用密钥对,并从自己的 PC 上对最终目标机器进行身份验证和验证。此外,您只能使用交互式 shell 进行 SSH,因此这不会处理其他工具(如 SCP)或使用您的 GUI 文件管理器。

出于上述所有原因,我强烈建议ProxyCommand 方法,但对于快速连接来说,这很好用。

答案4

machineA是最终目标。 machineB是经纪人。

我们希望home -- machineB -- machineA通过 ssh 轻松完成。

OpenSSH 版本 7.3(2016 年 8 月发布)或更高版本,您可以执行以下操作之一:

.ssh/config方法:

将以下几行添加到您的.ssh/config

Host machineB
    Hostname 12.12.12.12           # IP of machineB (w.r.t. home)
    User usernameB                 # username on machineB

Host machineA
    Hostname 34.34.34.34           # IP of machineA (w.r.t. machineB)
    ProxyJump usernameB@machineB   # PROXY MAGIC!
    User usernameA                 # username on machineA    

然后输入ssh machineA。还兼容scp。您可以扩充上述配置,以通过以下方式强制使用特定密钥https://unix.stackexchange.com/a/494485

-J标志选项:

只需输入ssh -J usernameB@machineB usernameA@machineA

最后说明

这个答案结合了 gertvdijk 和 Erik Sjölund 的答案以及以下指南:https://en.wikibooks.org/wiki/OpenSSH/Cookbook/Proxies_and_Jump_Hosts#cite_note-ProxyJump-1

相关内容