WSL Ubuntu 22.04中Git SSH克隆失败:手动连接正常但无法触发DuoConnect浏览器认证
看起来你遇到了挺棘手的问题——手动跑DuoConnect和ssh -v都能正常唤起浏览器认证,偏偏Git克隆的时候就掉链子,连日志都没输出,最后还超时。我帮你梳理几个大概率能解决问题的方向,咱们一步步排查:
1. 先修复SSH配置的重复Host条目
你当前的~/.ssh/config里有两个完全一样的Host <server>条目,SSH会自动忽略前面的,只应用最后一个的配置。这就导致你的IdentityFile密钥配置根本没生效,等于Git克隆时用的SSH连接没带密钥,自然没法正常触发认证流程。
把两个Host块合并成一个:
Host <server> HostName <server> IdentityFile ~/.ssh/id_ed25519 ProxyCommand duoconnect -host=%h:%p -relay=<server> -log ~/duoconnect.log
保存配置后先试试ssh <server>能不能正常连接,没问题再跑Git克隆。
2. 强制Git使用WSL原生的SSH客户端
有时候WSL里的Git会偷偷调用Windows端的SSH(比如你装了Git for Windows),这会导致环境变量、配置路径不匹配,DuoConnect没法正常唤起浏览器。咱们手动指定Git用WSL系统的SSH:
git config --global core.sshCommand "/usr/bin/ssh"
设置完再测试克隆,确保Git用的是WSL里的SSH,能读取到你刚才修复的.ssh/config。
3. 确保Git运行时能拿到正确的DISPLAY环境变量
手动在终端跑命令时,你的DISPLAY变量是正常的(不然浏览器也打不开),但Git执行SSH时可能在非交互式shell下,没加载这个变量,导致DuoConnect没法唤起图形界面。
先确认当前终端的DISPLAY值:
echo $DISPLAY
然后把这个值加到Git的环境配置里:
git config --global core.env "DISPLAY=$DISPLAY"
如果每次启动WSL都需要重新设置DISPLAY,也可以把下面的命令加到~/.profile里(非交互式shell会加载这个文件):
export DISPLAY=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}'):0.0
4. 检查DuoConnect日志的权限和路径
你设置的日志路径是~/duoconnect.log,手动运行时没问题,但Git运行时的用户上下文可能没权限写入这个文件,或者路径解析有问题。改成绝对路径试试,同时确保文件可写:
touch /home/你的用户名/duoconnect.log chmod 644 /home/你的用户名/duoconnect.log
然后把SSH配置里的日志路径改成绝对路径:
ProxyCommand duoconnect -host=%h:%p -relay=<server> -log /home/你的用户名/duoconnect.log
这样如果Git克隆时触发了DuoConnect,日志会被正确写入,方便你排查具体哪里出问题。
最后再试一次
先重启WSL终端,确保所有配置生效,然后执行:
git clone git@<server>:<你的仓库路径>.git
如果还是不行,看看~/duoconnect.log里有没有新的日志内容,或者再跑GIT_SSH_COMMAND="ssh -v" git clone ...,这样能看到Git调用SSH的详细日志,更容易定位问题。
备注:内容来源于stack exchange,提问作者zerotwo




