使用psftp从PowerShell连接SFTP服务器时遇主机密钥未缓存问题求助
这问题我经手过好几个类似的案例,核心原因就是psftp没找到已有的主机密钥缓存,或者运行环境的权限/上下文导致它读不到PuTTY已经存好的密钥。结合你说的PuTTY和WinSCP都能正常连接的情况,给你几个实用的解决办法:
办法一:手动触发密钥缓存
直接在PowerShell里(和你运行脚本相同的权限下)执行:
psftp.exe 你的用户名@目标SFTP服务器地址
这时候会弹出提示问你是否接受服务器的密钥,输入y确认就行。之后这个密钥会被存在当前用户的注册表中,后续再运行脚本就不会再报这个错了。
注意:如果你的脚本是用管理员权限运行的,那手动确认的时候也要用管理员打开PowerShell,不然缓存的密钥会存在普通用户的注册表分支,管理员权限的脚本还是读不到。
办法二:直接在命令里指定主机密钥
既然报错里已经给出了服务器的密钥指纹ssh-rsa 2048 41289438190410491,你可以在psftp的命令里直接加上-hostkey参数跳过缓存检查,比如:
psftp.exe -hostkey "ssh-rsa 2048 41289438190410491" 你的用户名@目标SFTP服务器地址
这种方式不需要依赖注册表缓存,适合自动化脚本场景,避免手动操作的步骤。
办法三:确认psftp与PuTTY版本匹配
虽然你把psftp放在了c:\windows\system32,但要确保它和你正在用的PuTTY是同一个版本的。不同版本的PuTTY工具对密钥的存储格式可能有细微差异,版本不匹配也可能导致psftp读不到PuTTY缓存的密钥。
为什么PuTTY/WinSCP没问题?
PuTTY的主机密钥是存在当前用户的注册表HKEY_CURRENT_USER\Software\SimonTatham\PuTTY\SshHostKeys里的,WinSCP要么共享这个缓存,要么有自己的存储机制。但psftp如果运行时的用户上下文和你手动用PuTTY的不一样(比如脚本用系统账户执行),就会访问不到这个用户分支下的密钥,从而报错。
内容的提问来源于stack exchange,提问作者curtcab

