问题
因故需要在win系统上调试分析一个C++问题,在使用CLion配置Toolchains选择WSL时遇到了困扰,虽然使用password和Key-Pair可以建立连接, 但想用OpenSSH config and authentication agent却不得其法。
在排除了Win10自带的openssh客户端、mingw openssh客户端、git-for-windows捆绑的openssh之后,还是翻了下jar包。
解决方法
两种方法:
-
在SystemProperties.getUserHome()/.ssh/config文件中,将密钥文件写上
- 这个文件可以从其他系统的ssh_config复制过来,把Host和IdentityFile取消注释使其成效
-
使用 Pageant 开启 ssh-agent 服务,这个程序可以在putty中找到
- 注意Add key时,可能私钥要从 OpenSSH private key 格式转成 PuTTY private key 格式,可以用PUTTYGEN.exe搞定
历程
在 com.intellij.ssh.impl.SshConnection
中找到 getSshSession
方法,可以得知 Clion Toolchains WSL 建立 ssh 连接的时候使用了 jsch ,
并使用 IdentityRepositoryFactory 创建 localIdentityRepository、RemoteIdentityRepository,
其中后者对于 Windows 选择使用 PageantConnector 。
private final Connector a() {
long var1 = a ^ 124129341420651L;
LOG.debug("Creating authentication agent connector");
if (SystemInfo.isWindows) {
try {
return (Connector)(new PageantConnector());
} catch (AgentProxyException var5) {
this.sshAgentProxyCreationFailed = true;
this.a("Pageant", var5);
this.a("Pageant", var5.getMessage());
}
} else {
String var3 = System.getenv("SSH_AUTH_SOCK");
CharSequence var4 = (CharSequence)var3;
if (var4 == null || var4.length() == 0) {
this.sshAgentProxyCreationFailed = true;
LOG.info("SSH_AUTH_SOCK environment variable is not defined");
this.a("ssh-agent", "SSH_AUTH_SOCK environment variable is not defined");
return null;
}
LOG.debug("UNIX-domain socket " + var3
+ " defined in environment variable SSH_AUTH_SOCK will be used to connect to "
+ "authentication agent");
try {
return (Connector)(new SSHAgentConnector(
(USocketFactory)(new JNAUSocketFactory()), var3)
);
} catch (AgentProxyException var6) {
this.sshAgentProxyCreationFailed = true;
this.a("ssh-agent", var6);
this.a("ssh-agent", var6.getMessage());
}
}
return null;
}