S SH туннелирование 2 шлюзов через JSch - PullRequest
0 голосов
/ 30 мая 2020

Интересно, можно ли расширить ответ в S SH туннелировании через JSch на случай, когда у меня есть два шлюза (две точки) перед конечным хостом.

Что Я пробовал:

import com.jcraft.jsch.*;

import java.io.InputStream;

public class Main {
    public static void main(String[] args){
        Main t=new Main();
        try{
            t.go();
        } catch(Exception ex){
            ex.printStackTrace();
        }
    }

    public void go() throws Exception{

        StringBuilder outputBuffer = new StringBuilder();

        String Gateway1="192.168.0.101"; // First level target
        String user1="root";
        String password="12qwaszx";
        String Gateway2="192.168.0.102"; // The host of the second target
        String user2 = "root";
        String secondPassword="12qwaszx";
        String endpoint = "10.81.77.52";
        String finaluser="admin";
        String finaluserpass="admin";

        JSch jsch=new JSch();
        Session session=jsch.getSession(user1, Gateway1, 22);
        session.setPassword(password);
        localUserInfo lui=new localUserInfo();
        session.setUserInfo(lui);
        session.setConfig("StrictHostKeyChecking", "no");
        // create port from 2233 on local system to port 22 on tunnelRemoteHost
        session.setPortForwardingL(2233, Gateway2, 22);
        session.connect();
        session.openChannel("direct-tcpip");

        // create a session connected to port 2233 on the local host.
        Session secondSession = jsch.getSession(user2, "localhost", 2233);
        secondSession.setPassword(secondPassword);
        secondSession.setUserInfo(lui);
        secondSession.setConfig("StrictHostKeyChecking", "no");
        secondSession.setPortForwardingL(2233, endpoint, 22);
        secondSession.connect(); // now we're connected to the secondary system
        secondSession.openChannel("direct-tcpip");

        Session finalSession = jsch.getSession(finaluser, "localhost", 2233);
        finalSession.setPassword(finaluserpass);
        finalSession.setUserInfo(lui);
        finalSession.setConfig("StrictHostKeyChecking", "no");
        finalSession.connect();

        Channel channel=secondSession.openChannel("exec");
        ((ChannelExec)channel).setCommand("show system information | match \"System Name\"");

        channel.setInputStream(null);

        InputStream stdout=channel.getInputStream();

        channel.connect();
        if (channel.isConnected()){
            System.out.println("connected");
        }

        while (true) {
            byte[] tmpArray=new byte[1024];
            while(stdout.available() > 0){
                int i=stdout.read(tmpArray, 0, 1024);
                if(i<0)break;
                outputBuffer.append(new String(tmpArray, 0, i));
            }
            if(channel.isClosed()){
                System.out.println("exit-status: "+channel.getExitStatus());
                break;
            }
        }
        stdout.close();

        channel.disconnect();

        secondSession.disconnect();
        session.disconnect();

        System.out.print(outputBuffer.toString());
    }

    class localUserInfo implements UserInfo {
        String passwd;
        public String getPassword(){ return passwd; }
        public boolean promptYesNo(String str){return true;}
        public String getPassphrase(){ return null; }
        public boolean promptPassphrase(String message){return true; }
        public boolean promptPassword(String message){return true;}
        public void showMessage(String message){}
    }
}

Но, несмотря на мои усилия, мне не удается подключиться к конечной точке. Получение

com.jcraft.jsch.JSchException: PortForwardingL: local port 127.0.0.1:2233 cannot be bound.
    at com.jcraft.jsch.PortWatcher.<init>(PortWatcher.java:158)
    at com.jcraft.jsch.PortWatcher.addPort(PortWatcher.java:110)
    at com.jcraft.jsch.Session.setPortForwardingL(Session.java:1847)
    at com.jcraft.jsch.Session.setPortForwardingL(Session.java:1828)
    at com.jcraft.jsch.Session.setPortForwardingL(Session.java:1809)
    at com.jcraft.jsch.Session.setPortForwardingL(Session.java:1792)
    at Main.go(Main.java:36)
    at Main.main(Main.java:9)
Caused by: java.net.BindException: Address already in use: JVM_Bind
    at java.net.DualStackPlainSocketImpl.bind0(Native Method)
    at java.net.DualStackPlainSocketImpl.socketBind(DualStackPlainSocketImpl.java:106)
    at java.net.AbstractPlainSocketImpl.bind(AbstractPlainSocketImpl.java:387)
    at java.net.PlainSocketImpl.bind(PlainSocketImpl.java:190)
    at java.net.ServerSocket.bind(ServerSocket.java:375)
    at java.net.ServerSocket.<init>(ServerSocket.java:237)
    at com.jcraft.jsch.PortWatcher.<init>(PortWatcher.java:150)
    ... 7 more

Process finished with exit code 0

Пожалуйста, если кто-нибудь может мне помочь. Мне нужно добраться до конечной точки с помощью s sh туннелирования двух шлюзов.

1 Ответ

0 голосов
/ 30 мая 2020

Клянусь, я не это имел в виду,

, но проблема заключалась в том, что первый lport был равен второму.

он работал как показано ниже:

  session.setPortForwardingL(2222, Gateway2, 22);
  session.connect();
  session.openChannel("direct-tcpip");

  Session secondSession = jsch.getSession(user2, "localhost", 2222);
...