我正在通过主机 a 连接到主机 b
Host host-a
HostName 10.8.0.1
Port 333
User host_admin
IdentityFile ~/.ssh/id-ecdsa-admin
Host host-b
HostName 1.1.1.1
Port 567
ProxyCommand ssh -q -W %h:%p host-a
User host_user
在我的托管服务器对于 /home/host_admin/.ssh/config 中的 host_admin 我有:
Host *
IdentityFile ~/.ssh/id-ecdsa-admin
User host_user
Port 567
我确实希望代理命令在连接到其他 ssh 时考虑那些用户/端口/身份文件,但它们似乎被忽略了。
我知道它们被忽略了,因为当我删除港口和用户从 host-b 配置我无法连接。难道不应该考虑来自 host-b 用户 ssh 配置的那些吗?
Host host-b
HostName 1.1.1.1
ProxyCommand ssh -q -W %h host-a
这里有什么陷阱?
答案1
不应该考虑来自主机 b 用户 ssh 配置的那些吗?
不,来自主机 a 和主机 b 的连接都来自您的客户端。中间系统上从未调用过 ssh 客户端。该中间系统上没有打开任何 shell,也没有文件传输到/从它传输。
当使用 ProxyJump/ProxyCommand 时,您的密钥需要直接位于客户端上。
根据您的配置,您的计算机将建立连接host-a
并基本上构建一个端口转发到 1.1.1.1:567 作为套接字,这将作为后台进程运行。然后,您的计算机将启动第二个 ssh 进程,该进程将直接连接到该套接字并进行端口转发。
ProxyCommand/ProxyJump 不会做类似的事情ssh host-a bash -c "ssh host-b"
或者换句话说,ProxyJump 基本上就是在做这样的事情。只是有点自动化而已。
# build tunnel in background
ssh -N -L 2200:1.1.1.1:567 10.8.0.1 -p 333 &
# connect to host-b through the tunnel
ssh 127.0.0.1 -p 2200