我需要通过代理跳转建立到远程服务器的连接。我正在尝试使用 -J 标志来做到这一点。我知道语法如下所示:
ssh -J A B
但是我需要对两个连接都使用密钥文件。所以我试过这个:
ssh -J -i /path/proxy.pem user@proxy_host -i /path/target.pem user@target_host
显然它不起作用,我得到
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
在这种情况下,不编辑 ssh 设置的正确内联语法是什么?在这种情况下,密钥存储在哪个服务器上没有区别。
是的,但这还不是全部。
-J
不是一个独立的标志——它不只是让您在同一命令行中指定两组独立的连接选项,就像您尝试做的那样。相反,该
-J
标志将中间主机的名称作为参数,因此就像-i <keyfile>
总是在一起一样,-J <proxy>
也必须保持在一起。即使你使用这个选项,整体的“ssh”语法也不会改变——仍然没有分组哪些选项属于主机A,哪些属于主机B。如果你有两个这样的“-i”选项,SSH在进行两个连接中的每一个时都会尝试两个键。
但是,后一部分应该不是问题,因为每个服务器只会指示它不接受密钥,而 SSH 会尝试另一个。所以以下应该工作:
但是,如果其中一个主机不喜欢尝试多个键的事实,则需要将 -J 转换为长格式 ProxyCommand: