WinSCP使用-rawsettings KEX选项无法按预期设置密钥交换算法的问题
嘿,我来帮你梳理下这个困扰你的问题~ 先把你的场景和现象理清楚:
问题背景
- 运行环境:Windows 2022(其他Windows版本也能复现),WinSCP便携版6.3.4(旧版本同样存在这个问题)
- 你执行的连接命令:
open sftp://user1:***@localhost -rawsettings KEX="dh-group14-sha1" - 异常现象:命令能成功连上服务器,但实际用的密钥交换算法(KEX)和你指定的不一样,日志也显示KEX没按预期修改
你提供的日志片段(重点关注KEX相关逻辑):
Script: Retrospectively logging previous script records:
Script: open sftp://user1:***@localhost -rawsettings KEX="dh-group14-sha1"Session name: user1@localhost (Ad-Hoc site)
Host name: localhost (Port: 22)
User name: user1 (Password: Yes, Key file: No, Passphrase: No)
Tunnel: No
Transfer Protocol: SFTP
Ping type: Off, Ping interval: 30 sec; Timeout: 15 sec
Disable Nagle: No
Proxy: None
Send buffer: 262144
Compression: No...
可能的原因&解决办法
我整理了几个常见的触发点和对应的解决思路:
- 命令行参数的转义格式问题
WinSCP的-rawsettings在命令行环境中,引号可能会被系统提前解析,导致KEX参数没被正确识别。你可以试试去掉KEX值的引号,直接写成:
open sftp://user1:***@localhost -rawsettings KEX=dh-group14-sha1
如果需要指定多个备选算法,用分号分隔即可,比如:
open sftp://user1:***@localhost -rawsettings KEX=dh-group14-sha1;ecdh-sha2-nistp256
服务器端的KEX支持或优先级限制
先确认你的SFTP服务器(比如OpenSSH)的配置文件(sshd_config里的KexAlgorithms项)是否包含dh-group14-sha1。如果服务器根本不支持这个算法,WinSCP会自动协商服务器支持的其他算法,自然不会用你指定的那个。另外,如果服务器配置的算法优先级比你指定的高,也会优先选择服务器端的算法。WinSCP的配置缓存干扰
如果你之前保存过localhost这个站点的配置,WinSCP可能会优先加载保存的设置,忽略命令行里的-rawsettings参数。你可以试试删除保存的站点,或者用干净的配置启动WinSCP,比如:
winscp.com -nopreferences -command "open sftp://user1:***@localhost -rawsettings KEX=dh-group14-sha1"
-nopreferences参数会让WinSCP不加载本地保存的偏好设置,确保用的是命令行指定的参数。
- 查看完整日志定位协商过程
建议开启详细日志,看看密钥交换的完整协商流程,这样能明确服务器提供了哪些算法,WinSCP最终选了哪个,以及为啥没选你指定的。可以在命令行里加日志参数:
winscp.com /log=winscp_detailed.log -command "open sftp://user1:***@localhost -rawsettings KEX=dh-group14-sha1"
打开日志文件后,搜索“Key exchange”相关的内容,就能找到协商的细节了。
备注:内容来源于stack exchange,提问作者TestMechanic

