Java从现有的ssh连接中打开新的ssh连接

标签 java ssh connection sftp jsch

我是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);}
}

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

有人知道如何强制应用程序使用已创建的连接吗?

谢谢。

最佳答案

您可以在第一个 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);}

关于Java从现有的ssh连接中打开新的ssh连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31726204/

相关文章:

Java 性能 64 位

java - 使用 Jetty(编程设置)的服务器发送事件 (SSE)

java - 将数据库连接迁移到数据源时有任何问题吗?

sql - 等待操作超时。均价

java - ORA-00911 : invalid character error while executing a query

java - 无法找到或加载主类 cmd,它在 Eclipse 中工作正常,构建路径似乎没问题

perl - 使用ssh在另一个脚本中运行perl脚本

java - 通过它连接 Java 到 MySQL 需要代理、用户名和密码

macos - 如何在 OS X 10.6.7 中打开端口 22

mercurial - 使用 Mercurial 为现有项目创建新的远程存储库