使用密钥的 ssh 内联代理跳转不起作用

Cab*_*ero 10 ssh ssh-tunnel

我需要通过代理跳转建立到远程服务器的连接。我正在尝试使用 -J 标志来做到这一点。据我了解,语法如下:

ssh -J A B
Run Code Online (Sandbox Code Playgroud)

但我需要对两个连接使用密钥文件。所以我尝试过这个:

ssh -J -i /path/proxy.pem user@proxy_host -i /path/target.pem user@target_host
Run Code Online (Sandbox Code Playgroud)

显然它不起作用,我得到了

option requires an argument -- i
usage: ssh [-46AaCfGgKkMNnqsTtVvXxYy] [-b bind_address] [-c cipher_spec]
           [-D [bind_address:]port] [-E log_file] [-e escape_char]
           [-F configfile] [-I pkcs11] [-i identity_file]
           [-J [user@]host[:port]] [-L address] [-l login_name] [-m mac_spec]
           [-O ctl_cmd] [-o option] [-p port] [-Q query_option] [-R address]
           [-S ctl_path] [-W host:port] [-w local_tun[:remote_tun]]
           [user@]hostname [command]
ssh_exchange_identification: Connection closed by remote host
Run Code Online (Sandbox Code Playgroud)

在这种情况下,在不编辑 ssh 设置的情况下,正确的内联语法是什么?在这种情况下,密钥存储在哪个服务器上没有区别。

use*_*686 11

\n

据我了解,语法如下:

\n
ssh -J A B\n
Run Code Online (Sandbox Code Playgroud)\n
\n

是的,但这还不是故事的全部。-J不是一个独立的标志 \xe2\x80\x93 它并不只是让您在同一命令行中指定两组独立的连接选项,正如您尝试做的那样。

\n

相反,该-J标志将中间主机的名称作为参数,因此就像-i <keyfile>总是在一起一样,-J <proxy>也必须保持在一起。

\n

即使您使用此选项,整体 'ssh' 语法也不会更改 \xe2\x80\x93 ,仍然没有对哪些选项属于主机 A 和哪些属于主机 B 进行分组。如果您有两个 '-i'像这样的选项,SSH在建立两个连接时只会尝试两个密钥。

\n

然而,后一部分应该不是问题,因为每个服务器只会表明它不接受该密钥,并且 SSH 将尝试另一个。所以以下应该有效:

\n
ssh -J user@proxy_host -i /path/proxy.pem -i /path/target.pem user@target_host\n    \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x98 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x98 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x98\n
Run Code Online (Sandbox Code Playgroud)\n

但是,如果其中一台主机不喜欢尝试多个密钥的事实,则需要将 -J 转换为长格式的 ProxyCommand:

\n
ssh -o ProxyCommand="ssh -i /path/proxy.pem -W %h:%p user@proxy_host" -i /path/target.pem user@target_host\n
Run Code Online (Sandbox Code Playgroud)\n\n

  • 您的第一个解决方案不起作用,因为第一个密钥被忽略,但第二个解决方案工作得很好,所以谢谢。 (2认同)