首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >仅通过另一个SSH/SFTP服务器将文件上载到SFTP服务器

仅通过另一个SSH/SFTP服务器将文件上载到SFTP服务器
EN

Stack Overflow用户
提问于 2018-04-24 14:48:03
回答 1查看 1.8K关注 0票数 2

有一个用例,我必须:

  1. 在应用程序服务器上生成应用程序中的文件。让我们把这台机器称为A*。(这是我的Java代码运行的地方,用于生成文件)
  2. 从应用程序本身,我希望使用SFTP将这个文件在固定路径(例如,)上传输到一个白色列表的服务器服务器B中。

第1点和第2点是直进的.

现在有一个外部服务器C (它提供了我的凭据)

  1. 现在,应用程序正在服务器A上运行。
  2. 文件现在位于==> /home/fixed/file.xlsx的服务器B中。
  3. 我必须通过SFTP将文件从服务器B传输到服务器C

如何实现这种多跳SFTP传输?

( B上不需要文件,一旦成功发送到C)

编辑:的回答帮助我做到了这一点。

代码语言:javascript
复制
@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();
    }
  }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-25 07:31:13

使用SSH隧道 (又名本地端口转发 )通过B打开到C的SSH/SFTP连接,然后可以从本地计算机(A)直接将文件上传到C,而无需先将文件上传到B:

代码语言:javascript
复制
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");

必须注意:不要使用StrictHostKeyChecking=no__。这样做你就失去了安全感。请参阅https://stackoverflow.com/q/32852906/850848

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50004632

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档