gpt4 book ai didi

java - 将文件上传到只能通过另一个SSH/SFTP服务器访问的SFTP服务器

转载 作者:行者123 更新时间:2023-12-02 13:54:32 26 4
gpt4 key购买 nike

有一个用例,我必须:

  • 在应用程序服务器上的应用程序中生成文件。让我们称它为 A * 机器。 (这是我的Java代码运行的位置,用于生成文件)
  • 从应用程序本身,我希望使用SFTP将此文件传输到白名单中的服务器 B ,位于固定路径(例如/home/fixed/file.xlsx)

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

    现在有一个外部服务器 C (提供我的凭据)
  • 现在,应用程序正在服务器A上运行。
  • 文件现在位于服务器B中,==> /home/fixed/file.xlsx
  • 我必须通过SFTP将文件从Server B 传输到Server C

  • 如何实现多次SFTP传输?

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

    编辑:马丁·普里克里(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();
    }
    }

    最佳答案

    使用SSH tunnel,也称为local port forwarding,通过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");

    关于java - 将文件上传到只能通过另一个SSH/SFTP服务器访问的SFTP服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50004632/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com