JSch SSH连接在初始化反向隧道时抛出NPE异常

3

当我向一个com.jcraft.jsch.Session对象添加反向隧道时,连接初始化会失败,并输出以下错误信息:

com.jcraft.jsch.JSchException: java.lang.NullPointerException
        at com.jcraft.jsch.Session._setPortForwardingR(Session.java:2165)
        at com.jcraft.jsch.Session.setPortForwardingR(Session.java:1937)
        at com.jcraft.jsch.Session.setPortForwardingR(Session.java:1883)
        at com.project.client.handlers.SshClientHandler.<init>(SshClientHandler.java:41)
        at com.project.client.pcConnection.init(SdConnection.java:30)
        at Sdclient.main(Unknown Source)
Caused by: java.lang.NullPointerException
        at com.jcraft.jsch.Packet.padding(Packet.java:58)
        at com.jcraft.jsch.Session.encode(Session.java:892)
        at com.jcraft.jsch.Session._write(Session.java:1362)
        at com.jcraft.jsch.Session.write(Session.java:1357)
        at com.jcraft.jsch.Session._setPortForwardingR(Session.java:2160)
        ... 5 more

完整的代码如下:
private static JSch sshConn = null;
private Session sshSession;
public SshClientHandler(int _sshLocalSp, int _sshRemoteSp) {

    JSch.setLogger(new JSCHLogger());
     sshConn = new JSch();
    try {
        createTemporarySshFiles();

        sshConn.setKnownHosts(GeneralMethods.getPreference(PcPreferencesEnum.SSH_KNOWN_HOSTS_FILE));
        sshConn.addIdentity(GeneralMethods.getPreference(PcPreferencesEnum.SSHC_PRIVATE_KEY_FILE), GeneralMethods.getPreference(PcPreferencesEnum.SSHC_PUBLIC_KEY_FILE), "".getBytes());

        sshSession = sshConn.getSession(GeneralMethods.getPropValue("pcclient.id"), "sshserver.project.com", 22);
        java.util.Properties config = new java.util.Properties();
        config.put("StrictHostKeyChecking", "no");
        sshSession.setConfig(config);

        sshSession.setTimeout(15000);
        sshSession.setPassword("");
        //sshSession.setPortForwardingR("50000:localhost:22");
        sshSession.setPortForwardingR(50000, "127.0.0.1", 22);
        sshSession.connect();
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } 
}

当我删除该行时,公钥验证成功建立连接。
sshSession.setPortForwardingR(50000, "127.0.0.1", 22);

SSH用户可以连接远程机器上的本地端口50000,以下是它的authorized_keys文件的一部分:

no-pty,permitopen="localhost:50000",command="/bin/echo not-allowed-to-do-this",no-X11-forwarding ssh-rsa AAAA[...]

我曾反复尝试改变setPortForwardingR方法的参数,例如一些在线文档使用远程机器作为第二个参数,而另一些则使用localhost,但都没有成功。通过观察远程服务器上的auth.log可以发现,连接甚至没有被初始化。在实际调用setPortForwardingR时,会抛出NullPointerException异常。我确保本地SSH服务器运行在本地端口22上,并且可以手动连接到它。我尝试使用不同的端口(例如到本地MySQL服务器),但总是以相同的堆栈跟踪失败。我使用的是jsch-0.1.52.jar
1个回答

3

几个小时啊!我已经花了好几个小时在这个问题上了!非常感谢!:D - Dennis Winter
2
下次请检查源代码。虽然我不懂Java和JSch,但我只用了一分钟就找到了。 - Martin Prikryl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接