如何通过需认证的代理使用ssh-keyscan获取SFTP服务器的主机密钥
如何通过需认证的代理使用ssh-keyscan获取SFTP服务器的主机密钥
我来帮你解决这个问题!既然你已经有OpenSSH客户端和netcat,而且不想用额外工具,咱们可以直接通过OpenSSH的ProxyCommand结合netcat来绕过带认证的代理,获取SFTP服务器的主机密钥,具体步骤如下:
一、生成代理认证的Base64编码
HTTP代理的Basic认证需要把用户名和密码转换成Base64格式,你可以在终端里执行以下命令生成(替换成你的代理用户名和密码):
echo -n "proxy_user:proxy_password" | base64
注意一定要加-n参数,避免输出额外的换行符,否则认证会失败。执行后得到的字符串就是咱们后面要用的认证凭证。
二、直接用ssh-keyscan结合ProxyCommand获取密钥
把下面的命令中的占位符替换成实际信息,直接在终端执行即可:
ssh-keyscan -p 22 sftp_host -o ProxyCommand='printf "CONNECT %h:%p HTTP/1.1\r\nHost: %h:%p\r\nProxy-Authorization: Basic YOUR_BASE64_STRING\r\n\r\n" | nc proxy_host proxy_port'
需要替换的内容:
22:如果你的SFTP服务器用的不是默认22端口,改成实际端口sftp_host:目标SFTP服务器的主机名或IP地址YOUR_BASE64_STRING:第一步生成的Base64编码字符串proxy_host和proxy_port:你的代理服务器地址和端口
这个命令的原理是:用printf构造符合HTTP规范的CONNECT请求(包含代理认证信息),通过netcat发送给代理服务器;代理验证通过后,会帮你建立一条到SFTP服务器的隧道,ssh-keyscan就通过这条隧道去获取目标服务器的主机密钥。
三、配置到SSH配置文件(可选,更方便)
如果后续还要频繁访问这个SFTP服务器,你可以把代理配置写到~/.ssh/config里,这样不用每次输入长命令:
Host sftp-target HostName sftp_host Port 22 ProxyCommand printf "CONNECT %%h:%%p HTTP/1.1\r\nHost: %%h:%%p\r\nProxy-Authorization: Basic YOUR_BASE64_STRING\r\n\r\n" | nc proxy_host proxy_port
保存后,直接执行ssh-keyscan sftp-target就能获取主机密钥了,非常方便。
额外注意事项
- 确保你的代理服务器允许
CONNECT请求访问SFTP服务器的端口(默认22),有些代理会限制可连接的端口范围; - 如果你的代理是SOCKS5类型带认证的,可以尝试用netcat的SOCKS选项(Oracle Linux 8的nmap-ncat通常支持),命令类似:
ssh-keyscan -p 22 sftp_host -o ProxyCommand='nc -X 5 -x proxy_host:proxy_port -U proxy_user -P proxy_password %h %p'
备注:内容来源于stack exchange,提问作者c_anirudh
相关产品推荐
相关产品推荐

