![如何使用一个命令通过 B SSH 连接到机器 A?](https://linux22.com/image/838040/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%E4%B8%80%E4%B8%AA%E5%91%BD%E4%BB%A4%E9%80%9A%E8%BF%87%20B%20SSH%20%E8%BF%9E%E6%8E%A5%E5%88%B0%E6%9C%BA%E5%99%A8%20A%EF%BC%9F.png)
我想访问计算机,比如机器A它位于我大学的网络中。但是,这台计算机只能通过大学的内部网络访问,因此我无法直接从家里使用 SSH 访问这台计算机。
以下是我现在的做法:
登录到不同的大学机器,比如机器B
(我家里的电脑可以通过 SSH 访问这台机器 B。)
在 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-传统
。
请注意,您在这里仍然使用两次加密的 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。