【问题标题】:Connect using SSH to a server through another server in Java使用 SSH 通过 Java 中的另一台服务器连接到服务器
【发布时间】:2017-03-30 17:01:32
【问题描述】:

目前我们有 2 台 Unix 服务器 A 和 B。为了连接到 B 服务器,最初我们先连接服务器 A,然后在 Unix 提示符下使用 SSH 登录 JumpHost B。

现在我正在开发一个简单的 Java 工具,它必须从服务器 B 下载文件。

在我从下面链接得到的示例代码中,如果我传递了 B 服务器的主机详细信息,则主机连接失败。

当我传递 A 服务器的主机详细信息时,连接成功并且能够下载服务器 A 中存在的文件。

我需要有关如何通过 Java 连接到服务器 A 和服务器 B 并从服务器 B 下载文件的指针。

SSH Connection Java

【问题讨论】:

    标签: java ssh connection


    【解决方案1】:

    您可以使用overthere 库。首先导入依赖:

    <dependency>
        <groupId>com.xebialabs.overthere</groupId>
        <artifactId>overthere</artifactId>
        <version>4.4.2</version>
    </dependency>
    

    ...然后连接到您的服务器(A、B 等):

    ConnectionOptions options = new ConnectionOptions();
    options.set(ConnectionOptions.PASSWORD, passwd);
    options.set(ConnectionOptions.CONNECTION_TIMEOUT_MILLIS, connectionTimeout);
    options.set(ConnectionOptions.USERNAME, login);
    options.set(ConnectionOptions.ADDRESS, host);
    options.set(ConnectionOptions.OPERATING_SYSTEM, OperatingSystemFamily.UNIX);
    options.set(SshConnectionBuilder.CONNECTION_TYPE, SshConnectionType.SCP);
    OverthereConnection connection = Overthere.getConnection(SshConnectionBuilder.SSH_PROTOCOL, options);
    

    【讨论】:

    • 不可以通过JSch实现多个SSH连接吗?
    • 有可能。只需在您需要的每个 SSH 连接之前重复 sn-p。
    • 通过jsch setportforwarding方法可以实现多个jumphost连接。
    【解决方案2】:

    您真正要寻找的是 Overthere 中所谓的 Jumpstation。

    你想这样连接:客户端 -> 服务器 A -> 服务器 B

    使用那边,您可以按如下方式设置该连接:

    ConnectionOptions jumpStationOptions = new ConnectionOptions();
    jumpStationOptions.set(ConnectionOptions.ADDRESS, "Server A");
    jumpStationOptions.set(ConnectionOptions.USERNAME, "Username A");
    jumpStationOptions.set(ConnectionOptions.PASSWORD, "Password A");
    jumpStationOptions.set(ConnectionOptions.PROTOCOL, "ssh-jumpstation");
    jumpStationOptions.set(ConnectionOptions.OPERATING_SYSTEM, OperatingSystemFamily.UNIX);
    ConnectionOptions options = new ConnectionOptions();
    options.set(ConnectionOptions.PASSWORD, "Password B");
    options.set(ConnectionOptions.USERNAME, "Username B");
    options.set(ConnectionOptions.ADDRESS, "Server B");
    options.set(ConnectionOptions.OPERATING_SYSTEM, OperatingSystemFamily.UNIX);
    options.set(SshConnectionBuilder.CONNECTION_TYPE, SshConnectionType.SCP);
    options.set(ConnectionOptions.JUMPSTATION, jumpStationOptions);
    OverthereConnection connection = Overthere.getConnection(SshConnectionBuilder.SSH_PROTOCOL, options);
    

    此设置会将“服务器 A”配置为用作到达“服务器 B”的跳转站。

    【讨论】:

      最近更新 更多