我需要通过代理跳转建立与远程服务器的连接。我尝试使用 -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 设置,正确的内联语法是什么?在这种情况下,密钥存储在哪个服务器上没有区别。
答案1
我理解语法如下:
ssh -J A B
是的,但这不是全部。-J
不是一个独立的标志——它不会像您尝试做的那样,简单地让您在同一个命令行中指定两组独立的连接选项。
相反,该-J
标志采用中间宿主的名称作为参数所以就像-i <keyfile>
永远一起走一样,-J <proxy>
也必须一直在一起。
即使你使用这个选项,整体的“ssh”语法也不会改变——仍然没有分组哪些选项属于主机 A,哪些属于主机 B。如果你有两个这样的“-i”选项,SSH 只会尝试两个都建立两个连接时,请分别按下 键。
不过,后一部分应该不是问题,因为每个服务器只会表明它不接受密钥,而 SSH 会尝试另一个。因此,下面的操作应该有效:
ssh -J user@proxy_host -i /path/proxy.pem -i /path/target.pem user@target_host
└────────────────┘ └────────────────┘ └─────────────────┘
但是如果其中一个主机不喜欢尝试多个密钥,则需要将 -J 转换为长格式的 ProxyCommand:
ssh -o ProxyCommand="ssh -i /path/proxy.pem -W %h:%p user@proxy_host" -i /path/target.pem user@target_host