Загрузить файл на SFTP-сервер, доступный только через другой SSH / SFTP-сервер - PullRequest
0 голосов
/ 24 апреля 2018

Есть вариант использования, где я должен:

  1. Создайте файл в моем приложении на сервере приложений. Давайте назовем это машиной как A *. (Здесь запускается мой Java-код для генерации файлов)
  2. Из самого приложения я хочу передать этот файл с использованием SFTP на Сервер B , занесенный в белый список, по фиксированному пути (скажем, /home/fixed/file.xlsx)

Точка 1 и 2 прямолинейны.

Теперь есть внешний Сервер C (чьи учетные данные мне предоставлены)

  1. Теперь приложение работает на сервере A.
  2. Файл теперь находится на Сервер B на ==> /home/fixed/file.xlsx.
  3. Я должен передать файл с Сервер B на Сервер C , через SFTP.

Как я могу добиться этой многократной пересылки SFTP?

(Файл не нужен на B, после успешной отправки на C)

РЕДАКТИРОВАТЬ: Ответ Мартин Прикрил помог мне достичь этого.

@Override
  public void createOurChannel(Path lastModifiedBankFile) {
    LOG.info("Initiating SFTP for white-listed Server B for file: {}",
        lastModifiedBankFile);
    String host = properties.getServerBSftpHost();
    String port = properties.getServerBSftpPort();
    String password = properties.getServerBSftpPassword();
    String username = properties.getServerBSftpUsername();

    Session session = null;
    try {
      JSch ssh = new JSch();
      JSch.setConfig("StrictHostKeyChecking", "no");
      session = ssh.getSession(username, host, Integer.parseInt(port));
      session.setPassword(password);
      session.connect();

      this.sendFileToBank(lastModifiedBankFile, session, ssh);
    } catch (JSchException e) {
      LOG.error("Jsch Exception occurred while SFTP.", e);
    } finally {
      if (session != null && session.isConnected())
        session.disconnect();
      LOG.info("Successfully disconnected from SFTP. {}");
    }
  }

  @Override
  public void sendFileToBank(Path lastModifiedBankFile, Session session, JSch ssh) {

    Session sessionBank = null;
    Channel channelBank = null;
    ChannelSftp channelSftp = null;
    String host = properties.getBankSftpHost();
    String port = properties.getBankSftpPort();
    String password = properties.getBankSftpPassword();
    String username = properties.getBankSftpUsername();
    String bankSftpDir = properties.getBankSftpEmiDir();
    try {
      int portForwarded = 2222;
      session.setPortForwardingL(portForwarded, host, Integer.parseInt(port));

      sessionBank = ssh.getSession(username, "localhost", portForwarded);
      sessionBank.setPassword(password);
      sessionBank.connect();

      channelBank = sessionBank.openChannel("sftp");
      channelBank.connect();
      channelSftp = (ChannelSftp) channelBank;

      channelSftp.put(lastModifiedBankFile.toAbsolutePath().toString(),
          bankSftpDir + lastModifiedBankFile.getFileName().toString());
      channelSftp.exit();
    } catch (JSchException e) {
      LOG.error("Jsch Exception occurred while SFTP.", e);
    } catch (SftpException e) {
      LOG.error("SFTP Exception occurred while SFTP.", e);
    } finally {
      if (channelBank != null && channelBank.isConnected())
        channelBank.disconnect();
      if (sessionBank != null && sessionBank.isConnected())
        sessionBank.disconnect();
    }
  }

1 Ответ

0 голосов
/ 25 апреля 2018

Используйте SSH туннель , он же переадресация локального порта , чтобы открыть SSH / SFTP-соединение с C через B. Затем вы можете напрямую загрузить файл в C с вашего локального компьютера. (A), не загружая его сначала в B:

Session sessionB = jsch.getSession("usernameB", "hostB", 22);
// ...
sessionB.connect();

int forwardedPort = 2222; // any port number which is not in use on the local machine
sessionB.setPortForwardingL(forwardedPort, "hostC", 22);

Session sessionC = jsch.getSession("usernameC", "localhost", forwardedPort);
// ...
sessionC.connect();

Channel channel = sessionC.openChannel("sftp");
channel.connect();
ChannelSftp channelSftp = (ChannelSftp)channel;           

channelSftp.put("C:\\local\\path\\file.txt", "/remote/path/on/C/file.txt");
...