评论人:manderson202
我在发现这个解决方案之前遇到了这个问题,并找到了根本原因,所以我想提交一个补丁。如上文中的金丝雀所示,JSCH 不了解 jsch-agent-proxy,因此它试图以常规方式解析密钥。在常规执行时,当它遇到加密(受密码保护的)私钥时,它期望有 UserInfo
实现。如果不存在 UserInfo
实现,则抛出异常,不给 jsch-agent-proxy 机会从 ssh-agent 拖取密钥。以下是 com.jcraft.jsch.UserAuthPublicKey#start
中的 snippet,从第 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;
}
String _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
。如果您有任何疑问,请告知。