You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过需认证的代理使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.15 11:34:36