【问题标题】:Java open new ssh connection from already existingJava 从已经存在的打开新的 ssh 连接
【发布时间】:2015-10-21 22:54:08
【问题描述】:

我是 JAVA 新手。 我试图编写一个将执行下一步的应用程序 - 打开与 UNIX 服务器的 ssh 连接,并使用私钥从该服务器连接到另一台服务器。

要连接到第一台服务器,我使用的程序如下:

public static void main(String args[])
{
String user = "john";
String password = "mypassword";
String host = "192.168.100.23";
int port=22;

try
    {
    JSch jsch = new JSch();
    Session session = jsch.getSession(user, host, port);
        session.setPassword(password);
        session.setConfig("StrictHostKeyChecking", "no");
    System.out.println("Establishing Connection...");
    session.connect();
        System.out.println("Connection established.");
    System.out.println("Crating SFTP Channel.");
    ChannelSftp sftpChannel = (ChannelSftp) session.openChannel("sftp");
    sftpChannel.connect();
    System.out.println("SFTP Channel created.");


    InputStream out= null;
    out= sftpChannel.get(remoteFile);
    BufferedReader br = new BufferedReader(new InputStreamReader(out));
    String line;
    while ((line = br.readLine()) != null)
        System.out.println(line);
    br.close();
    }
catch(Exception e){System.err.print(e);}
}

而且效果很好。但是当我尝试使用相同的代码连接到第二个时,这不起作用,因为应用程序尝试创建一个全新的连接而不使用已经创建的连接。

有人知道我怎样才能让应用程序使用已经创建的连接吗?

谢谢。

【问题讨论】:

    标签: java ssh connection sftp jsch


    【解决方案1】:

    您可以在第一个session 中使用端口转发,然后在转发的本地端口中创建另一个连接到主机的session。示例JumpHosts.java 正是这样做的。公钥认证参考UserAuthPubKey.java

    这是基于这些示例对您的代码进行的修改:

    String user = "john";
    String password = "mypassword";
    String host = "127.0.0.1";
    String host2 = "192.168.100.23";
    int port=22;
    
    try{
        JSch jsch = new JSch();
        Session session1 = jsch.getSession(user, host, port);
        session1.setPassword(password);
        session1.setConfig("StrictHostKeyChecking", "no");
        System.out.println("Establishing Connection...");
        session1.connect();
        System.out.println("Connection established.");
    
        //Here we do port forwarding to the second host
        int assinged_port = session1.setPortForwardingL(0, host2, 22);
        System.out.println("portforwarding: "+
                "localhost:"+assinged_port+" -> "+host+":"+22);
    
        //And here we connect to the first host to the forwarded port, not 22
        Session session2 = jsch.getSession(user, host, assinged_port);
    
        //This is your public key file 
        jsch.addIdentity("~/.ssh/id_rsa");
        session2.setConfig("StrictHostKeyChecking", "no");
        session2.connect();
        System.out.println("The session has been established to "+
                user+"@"+host);
    
        System.out.println("Crating SFTP Channel.");
        ChannelSftp sftpChannel = (ChannelSftp) session2.openChannel("sftp");
        sftpChannel.connect();
        System.out.println("SFTP Channel created.");
    
    
        InputStream out= null;
        out= sftpChannel.get(remoteFile);
        BufferedReader br = new BufferedReader(new InputStreamReader(out));
        String line;
        while ((line = br.readLine()) != null)
            System.out.println(line);
        br.close();
    }
    catch(Exception e){System.err.print(e);}
    

    【讨论】:

      猜你喜欢
      • 2012-08-06
      • 1970-01-01
      • 2011-07-28
      • 1970-01-01
      • 1970-01-01
      • 2017-09-08
      • 1970-01-01
      • 2014-05-15
      • 1970-01-01
      相关资源
      最近更新 更多