我正在尝试使用 ssh 登录远程服务器,我在 ~/.ssh/config 中设置了一个 ProxyCommand 来使用代理(通过 PuTTY 设置连接到 VPN)。ProxyCommand 使用 nc 通过代理进行连接(如对如何使用带有 SOCKS 5 代理的 SSH?),但 nc 似乎无法在将主机名发送到代理之前通过 /etc/hosts 将其解析为 IP,而代理也不知道如何解析主机名。
例如:
$ cat /etc/hosts
127.0.0.1 localhost
12.34.56.78 hostname1
12.34.56.79 hostname2
$ cat ~/.ssh/config
ProxyCommand /usr/bin/nc -x 127.0.0.1:7777 %h %p
请注意,端口 7777 在 PuTTY 中配置为动态端口。
$ cat /etc/resolv.conf
lookup file bind
$ cat /etc/nsswitch.conf
hosts: files dns
如果我使用 ssh[电子邮件保护]然后连接成功,但如果我使用 ssh user@hostname1,则 hostname1 会被传递给代理,而不是解析为 12.34.56.78,连接就会失败。有谁知道需要进行哪些配置才能使 netcat 主机名解析通过 /etc/hosts 在 cygwin 中工作?
谢谢
答案1
那里发生的情况是您正在使用 ssh_config %h 替换,但根据手册,这并不意味着替换的值也将以任何方式进行预处理。
但是,因为命令是通过 shell 传递的,所以您可以使用子 shell 来运行执行名称解析的命令,如下所示:
ProxyCommand /usr/bin/nc -x 127.0.0.1:7777 $(perl -MSocket -le 'print inet_ntoa inet_aton shift' %h) %p
具体命令由https://unix.stackexchange.com/questions/71379/host-lookup-that-respects-etc-hosts
答案2
/etc/hosts 是否以所需的行尾结尾(CR 或 CRNL)正确分隔?
nc 是否会忽略 /etc/hosts 并查看 %windir%\system32\drivers\etc\hosts?