评论由:manderson202
我在发现这个解决方案之前遇到了这个问题,并为它提交了一个补丁。如 gist 中所述,JSCH 不了解 jsch-agent-proxy,因此它会像平时一样尝试解析密钥。在正常执行过程中,它在遇到加密(受密码保护)的私钥时会期望一个 UserInfo
实现。如果没有找到 UserInfo
实现,它将抛出异常,不给 jsch-agent-proxy 拉取密钥的机会。以下是来自 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;
}
String _passphrase=userinfo.getPassphrase();
如果(_passphrase!=null){
passphrase=Util.str2byte(_passphrase);
}
}
`
解决方案是在Session
上设置一个占位符UserInfo
实现,这样就不会抛出上述异常,并且ssh-agent可以处理向JSCH返回密钥。有了这个补丁,您不需要执行从~/.ssh/config
文件中删除IdentityFile
属性的解决方案。
补丁已附带(今天:2018-11-27)并称为tdeps-49-fix.patch
。如果您有任何问题,请告知。