评论由: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;
}
String _passphrase=userinfo.getPassphrase();
if(_passphrase!=null){
passphrase=Util.str2byte(_passphrase);
}
}
`
修复方法是将一个占位符UserInfo
实现设置到Session
中,以避免抛出上述异常并使ssh-agent能够处理返回给JSCH的密钥。有了这个补丁,您无需从您的~/.ssh/config
文件中移除IdentityFile
属性的解决方案。
补丁已附上(日期:2018-11-27)并命名为tdeps-49-fix.patch
。如果您有任何疑问,请告知。