如何在.ssh / confg中将JSch与ProxyJump一起使用

时间:2019-03-20 00:11:45

标签: java ssh jsch

我在〜/ .ssh / config 下的配置文件包含:

Host jumbHost
   HostName x.domain.com

Host host1
   HostName y1.domain.com
   ProxyJump  jumbHost

我如何使用JSch通过 host1 隧道传输到 x.domain.com 服务器,以便执行命令?

注意: y1.domain.com 没有公共IP

我尝试使用jsch.setConfigRepository(config_file_path),但似乎还需要设置更多配置或使用方法。

如果使用示例进行描述,它将非常有用。

编辑: 因此,当我使用jsch.getSession(user,"host1");或类似的内容

进行会话时,可以将服务器连接到 x.domain.com 服务器

预先感谢

1 个答案:

答案 0 :(得分:0)

感谢KevinOMartin Prikryl的价值提示和帮助

根据您的描述和链接,我能够应用所需的配置,以允许使用 host1 访问 x.domain.com > 名称,然后在 y1.domain.com

上执行命令

记录下来,这就是我最终得到的结果

public class Main {
public static void main(String args[]) throws Exception {
    try {
        String user = "user_name";
        String host = "host1";
        String command = "hostname";

        JSch jsch = new JSch();
        ConfigRepository configRepository = OpenSSHConfig.parseFile(System.getProperty("user.home") + "/.ssh/config");
        jsch.setConfigRepository(configRepository);
        jsch.addIdentity(new File(System.getProperty("user.home") + "/.ssh/id_rsa").getAbsolutePath());

        Session sessionProxy = jsch.getSession(user,configRepository.getConfig(host).getValue("ProxyJump"),22);
        Properties config = new Properties();
        config.put("StrictHostKeyChecking", "no");
        sessionProxy.setConfig(config);
        sessionProxy.connect();

        int assignedPort = sessionProxy.setPortForwardingL(0, configRepository.getConfig(host).getHostname(), 22);

        Session sessionTunnel = jsch.getSession(user, "127.0.0.1", assignedPort);
        sessionTunnel.connect();

        Channel channel = sessionTunnel.openChannel("exec");
        ((ChannelExec) channel).setCommand(command);
        channel.setInputStream(null);
        ((ChannelExec) channel).setErrStream(System.err);
        InputStream input = channel.getInputStream();
        channel.connect();

        try {
            InputStreamReader inputReader = new InputStreamReader(input);
            BufferedReader bufferedReader = new BufferedReader(inputReader);
            String line = null;
            while ((line = bufferedReader.readLine()) != null) {
                System.out.println(">>> output: " + line);
            }
            bufferedReader.close();
            inputReader.close();
        } catch (IOException ex) {
            ex.printStackTrace();
        }

        channel.disconnect();
        sessionTunnel.disconnect();
        sessionProxy.disconnect();
    } catch (Exception ex) {
        ex.printStackTrace();
    }
} 
}