评论由: manderson202 提出
我在找到这个解决方案之前遇到了这个问题,所以我想提交一个补丁。如 gist 中所述,JSCH 并不知道 jsch-agent-proxy,因此它会像通常那样尝试解析密钥。在正常执行过程中,它会期望一个 UserInfo
实现,当它遇到加密(受密码保护的)私钥时。如果不存在 UserInfo
实现,代码会直接抛出一个异常,不给 jsch-agent-proxy 从 ssh-agent 中提取密钥的机会。以下是从 com.jcraft.jsch.UserAuthPublicKey#start
方法第 118-130 行的代码片段:
`
java
if((identity.isEncrypted() && passphrase==null)){
if(userinfo==null) throw new JSchException("USERAUTH fail");
if(identity.isEncrypted() &&
!userinfo.promptPassphrase("Passphrase for "+identity.getName())){
throw new JSchAuthCancelException("publickey");
//throw new JSchException("USERAUTH cancel");
//break;
}
字符串 _passphrase = userinfo.getPassphrase();
if(_passphrase != null){
passphrase=Util.str2byte(_passphrase);
}
}
`
修复方法是设置一个占位符 UserInfo
实现到 Session
上,这样上述异常就不会抛出,而 ssh-agent 可以处理返回 JSCH 密钥。补丁后,无需从您的 ~/.ssh/config
文件中删除 IdentityFile
属性的 workaround。
补丁已附加(今天:2018-11-27)并命名为 tdeps-49-fix.patch
。如有疑问,请告知。