我公司的生产服务器(FOO、BAR...)位于两个网关服务器(A、B)后面。为了连接到服务器 FOO,我必须使用我的用户名 JOHNDOE 打开与服务器 A 或 B 的 ssh 连接,然后从 A(或 B)我可以访问任何使用标准用户名打开 SSH 连接的生产服务器(我们称之为韦比)。
所以,每次我必须做类似的事情:
ssh johndoe@a
...
ssh webby@foo
...
# now I can work on the server
可以想象,当我需要使用scp
或需要快速打开多个连接时,这很麻烦。
我已经配置了一个 ssh 密钥,并且我正在使用 .ssh/config 作为一些快捷方式。
我想知道是否可以创建某种 ssh 配置以便输入
ssh foo
并让 SSH 为我打开/转发所有连接。可能吗?
编辑
womble 的答案正是我一直在寻找的,但现在我似乎无法使用 netcat,因为它没有安装在网关服务器上。
weppos:~ weppos$ ssh foo -vv
OpenSSH_5.1p1, OpenSSL 0.9.7l 28 Sep 2006
debug1: Reading configuration data /Users/xyz/.ssh/config
debug1: Applying options for foo
debug1: Reading configuration data /etc/ssh_config
debug2: ssh_connect: needpriv 0
debug1: Executing proxy command: exec ssh a nc -w 3 foo 22
debug1: permanently_drop_suid: 501
debug1: identity file /Users/xyz/.ssh/identity type -1
debug2: key_type_from_name: unknown key type '-----BEGIN'
debug2: key_type_from_name: unknown key type 'Proc-Type:'
debug2: key_type_from_name: unknown key type 'DEK-Info:'
debug2: key_type_from_name: unknown key type '-----END'
debug1: identity file /Users/xyz/.ssh/id_rsa type 1
debug2: key_type_from_name: unknown key type '-----BEGIN'
debug2: key_type_from_name: unknown key type 'Proc-Type:'
debug2: key_type_from_name: unknown key type 'DEK-Info:'
debug2: key_type_from_name: unknown key type '-----END'
debug1: identity file /Users/xyz/.ssh/id_dsa type 2
bash: nc: command not found
ssh_exchange_identification: Connection closed by remote host
作为凯尔答案的更具体版本,您要放入
~/.ssh/config
文件中的是:然后,当您运行“ssh foo”时,SSH 将尝试 SSH 到
johndoe@a
,运行netcat
( ),然后通过此隧道nc
执行 SSH 到。webby@foo
魔法!当然,为了做到这一点,需要在网关服务器上安装netcat;该软件包适用于每个主要发行版和操作系统。
您可以在 ~/.ssh/config 文件中使用 ProxyCommand 指令,例如使用 netcat 作为中继:
您只需使用“ssh server2”。该指令的手册页信息可在“man ssh_config”中找到
我更喜欢另一种方法,即维护到网关服务器的预认证隧道。在
~/.ssh/config
:然后在
.bashrc
:所以要连接到 foo:
第一次连接时,它将根据“a”对您进行身份验证并打开一个持久的后台 ssh 隧道。随后对“s”的调用将通过预先认证的隧道几乎立即打开。
效果很好。
这可以通过做来完成
ssh -At johndoe@a ssh webby@foo
。该-A
命令转发您的 ssh 代理(这样您就可以避免在代理上重新进行身份验证),同时-t
确保代理上存在终端。以下 bash 函数可能有用:这种类型的功能存在于较新版本的 OpenSSH 中,可以通过以下方式使用
server2
您的预定目的地在哪里,server1
您的代理主机在哪里。您可以通过使用ProxyCommand
ssh 配置中的选项来简化此操作,例如:当
netcat
代理上不可用时,试试这个技巧:那么你应该可以
ssh foo
。此外,如果您在 a 上安装了最新版本的 ssh(即,使用
-W
转发标准输入和输出的命令),您可以使用:最后,仅仅因为我觉得它很酷(而不是因为它适用于您的特定情况,因为用户名不同),一位朋友的博客文章指出了如何使这种事情动态化并递归链接 SSH 代理(以及一些事情效果不好):
然后
ssh machine1/machine2
应该给你一个shellmachine2
,隧道通过machine1
。我想知道是否使用自定义
sed
命令代替dirname
并且basename
可能无法解决不同用户名的问题?自 OpenSSH 7.3 (2016-08-01) 以来,该
ProxyJump
选项和相应-J
的命令行标志已可用于通过一个或多个 SSH 堡垒或“跳转主机”进行更简单的间接访问。这消除了对Womble 解决方案
nc
中的外部命令的依赖。将以用户 johndoe 的身份建立从您的工作站到网关服务器的 SSH 连接,
a
并通过隧道将 SSH 会话通过该连接为用户 Webby 托管 foo。为了简化为您和您创建主机定义的
~/.ssh/config
过程,您可以简单地执行ssh foo
Netcat 未安装在
a
. 当你运行时ssh host "command arg"
,在你的本地机器上而不是在你的本地机器上command
执行。host