首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >初始化反向隧道时JSch SSH连接抛出NPE

初始化反向隧道时JSch SSH连接抛出NPE
EN

Stack Overflow用户
提问于 2015-05-15 08:03:52
回答 1查看 1.5K关注 0票数 3

当我向com.jcraft.jsch.Session对象添加反向隧道时,连接初始化将通过以下堆栈跟踪失败:

代码语言:javascript
复制
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

完整的代码是

代码语言:javascript
复制
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();
    } 
}

当我删除行时,连接成功地建立w/ publickey身份验证。

代码语言:javascript
复制
sshSession.setPortForwardingR(50000, "127.0.0.1", 22);

SSH用户有权连接到远程计算机上的本地端口50000。这是authorized_keys的一个片段

代码语言:javascript
复制
no-pty,permitopen="localhost:50000",command="/bin/echo not-allowed-to-do-this",no-X11-forwarding ssh-rsa AAAA[...]

我来回切换setPortForwardingR的参数,例如,我在网上找到的一些文档使用远程机器作为第二个参数,有些使用localhost,但没有成功。

监视远程服务器上的auth.log表明连接甚至没有启动。NullPointerException将在setPortForwardingR调用的实际行上抛出。我确保本地SSH服务器在本地端口22上运行,并且可以手动连接到它。我尝试了不同的端口(例如,我的本地MySQL服务器),但是它总是在相同的堆栈跟踪中失败。

我在用jsch-0.1.52.jar

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-15 08:37:28

您必须只在.setPortForwardingR()之后调用.connect()

例如,见:

http://www.jcraft.com/jsch/examples/Daemon.java.html

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30254508

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档