当前位置: 首页 > 知识库问答 >
问题:

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

丘智志
2023-03-14

有一个用例,我必须:

  1. 在我的应用程序中,在应用程序服务器上生成一个文件。让我们把这称为一台机器。(这是我的Java代码运行的地方,用来生成文件)
  2. 从应用程序本身,我希望使用SFTP将这个文件传输到一个固定路径(比如/home/fixed/file.xlsx)的白名单服务器B

第1点和第2点是直截了当的。

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

  1. 现在,应用程序正在服务器A上运行。
  2. 文件现在位于服务器B中的==

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

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

编辑:Martin Prikryl的回答帮助我实现了这一点。

@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个答案

长孙阳成
2023-03-14

使用SSH隧道,也就是本地端口转发,通过B打开到C的SSH /SFTP连接。然后您可以从本地机器(A)直接将文件上传到C,而无需先上传到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");

必须注意的是:不要使用StrictHostKeyChecking=no。这样做会失去安全性。请参阅如何在使用JSch SFTP库时解决Java未知数HostKey?

 类似资料:
  • 源和目标都是远程的。 是否可以使用JSCH?

  • 我需要将文件从远程服务器复制到本地服务器,然后使用JMETER使用SSH SFTP进行尝试。我提供了登录凭据,并在“文件传输”部分中,选择了操作 - PUT源路径 - 远程路径( /ftp / xxx / yyy)目标 - 本地路径。 收到错误为` Java . io . file not found exception:C:\ Apache-jmeter-5 . 1 . 1 \ bin \ FT

  • 我正在从sftp服务器读取文件,并使用Spring Batch Framework将该文件加载到数据库中。下面是我的代码,但我遇到了一个错误 代码: 错误:

  • 问题内容: 我正在尝试使用Java从使用SFTP(而不是FTPS)的服务器检索文件。我怎样才能做到这一点? 问题答案: 另一个选择是考虑查看JSch库。JSch似乎是一些大型开源项目的首选库,其中包括Eclipse,Ant和Apache Commons HttpClient。 它很好地支持用户/通过和基于证书的登录,以及所有其他许多美味的SSH2功能。 这是通过SFTP检索的简单远程文件。错误处理

  • 问题内容: 我正在使用jsch从服务器下载文件,下面是我的代码。 com.jcraft.jsch.ChannelSftp.throwStatusError(ChannelSftp.java:2629) at com.jcraft.jsch.ChannelSftp._get(ChannelSftp.java:977) at com.jcraft.jsch.ChannelSftp.get(Channe

  • 问题内容: 是否有一个Java库可用于实现SFTP服务器? 我正在尝试通过SFTP接收文件,但似乎找不到SFTP服务器的任何实现。我找到了FTP / SFTP / FTPS 客户端 库和FTP / FTPS服务器库,但没有找到用于SFTP的服务器。 为了澄清,我正在尝试通过SFTP 接收 文件。不能将应用程序中的文件“获取”或“放置”到其他现有服务器上。 现在,我的应用程序允许用户连接到本地lin