[英]Can not open ssh session using JSch with JDK 8
我有以下示例代碼嘗試打開ssh連接
package jsch;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;
public class Main {
public static void main(String... args) {
JSch jsch=new JSch();
try {
Session session=jsch.getSession("some_user", "some_host", 22);
session.setPassword("some_password");
session.setConfig("StrictHostKeyChecking", "no");
session.connect();
Thread.sleep(1000);
session.disconnect();
} catch (JSchException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
如果我使用JDK 7一切正常,但如果我使用JDK 8,我會得到這個堆棧跟蹤:
Exception in thread "main" java.lang.IllegalArgumentException: Empty nameStrings not allowed
at sun.security.krb5.PrincipalName.validateNameStrings(PrincipalName.java:167)
at sun.security.krb5.PrincipalName.<init>(PrincipalName.java:277)
at sun.security.krb5.PrincipalName.parse(PrincipalName.java:315)
at sun.security.krb5.internal.KRBError.init(KRBError.java:355)
at sun.security.krb5.internal.KRBError.<init>(KRBError.java:186)
at sun.security.krb5.KrbTgsRep.<init>(KrbTgsRep.java:58)
at sun.security.krb5.KrbTgsReq.getReply(KrbTgsReq.java:259)
at sun.security.krb5.KrbTgsReq.sendAndGetCreds(KrbTgsReq.java:270)
at sun.security.krb5.internal.CredentialsUtil.serviceCreds(CredentialsUtil.java:302)
at sun.security.krb5.internal.CredentialsUtil.acquireServiceCreds(CredentialsUtil.java:120)
at sun.security.krb5.Credentials.acquireServiceCreds(Credentials.java:458)
at sun.security.jgss.krb5.Krb5Context.initSecContext(Krb5Context.java:693)
at sun.security.jgss.GSSContextImpl.initSecContext(GSSContextImpl.java:248)
at sun.security.jgss.GSSContextImpl.initSecContext(GSSContextImpl.java:179)
at com.jcraft.jsch.jgss.GSSContextKrb5.init(GSSContextKrb5.java:129)
at com.jcraft.jsch.UserAuthGSSAPIWithMIC.start(UserAuthGSSAPIWithMIC.java:135)
at com.jcraft.jsch.Session.connect(Session.java:463)
at com.jcraft.jsch.Session.connect(Session.java:183)
at jsch.Main.main(Main.java:15)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)
是否有機會在沒有黑客的情況下修復此問題並使用JSch和JDK8,或者我應該切換到另一個ssh庫?
您的JDK8顯然認為Kerberos已安裝/可用,但要么是錯誤的,要么是在某處無法正常工作。 雖然我自己不使用Kerberos,但如果你的意思是Sun / Oracle JDKs AFAIK,7和8 都沒有默認啟用Kerberos,這表明JDK 8中的某些地方出現了錯誤(可能是配置錯誤)。
它不應該(或除此之外)找到並修復它,它應該告訴JSCH 不要使用Kerberos ,或者至少先嘗試其他方法:
# Q&D -- assumes default as of 0.1.53
session.setConfig ("PreferredAuthentications",
"publickey,keyboard-interactive,password");
# or
session.setConfig ("PreferredAuthentications",
"publickey,keyboard-interactive,password,gssapi-with-mic");
# more robust for future
ArrayList<String> auths = new ArrayList<String>(
Arrays.asList( session.getConfig ("PreferredAuthentications") .split(",")) );
auths.remove ("gssapi-with-mic");
# optional add back to end
auths.add ("gssapi-with-mic");
session.setConfig ("PreferredAuthentications", String.join (",", auths));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.