Java中通过scp和sftp直接将文件写入远程系统的最佳方式

时间:2015-12-02 10:12:08

标签: java sftp scp jsch

所以在我的Java客户端中我将创建一个新文件,我希望通过scp或sftp直接写入远程系统(用户可以选择哪个) - 我不希望将文件写入本地文件系统然后复制(生成的文件可能很大,本地磁盘空间可能有问题)。

谷歌搜索引发了各种各样的选择。 Jsch似乎是最受欢迎的。有关最佳方法的观点吗?

我更愿意避免使用开源软件包,除非它们已经成熟并且有很好的文档记录(我对几个开源产品的经验很糟糕,这些产品可能使复杂的工作变得简单,但也使简单的工作成为一种正确的痛苦)。

2 个答案:

答案 0 :(得分:1)

我建议使用JSch,因为它可靠且易于使用。看看我前段时间为可行性测试做的这个例子。您会看到数据来自FileInputStream。您可以轻松地将其更改为直接发送字节而无需中间文件。

请注意,此示例忽略SSL证书:

/**
 * Uploads a local file to a remote host.
 */
public class Copy {

    /** Session to run commands */
    private Session session;

    /**
     * Creates a session to the remote host with the provided username and password data. Ignores certificates.
     * @param host remote host
     * @param user login name
     * @param pass password
     * @throws JSchException
     */
    public Copy(String host, String user, String pass) throws JSchException {
        this.session = createSession(host, user, pass);
    }

    /**
     * Creates a session from the provided connection data. The certificate is ignored when creating the session!
     * @param host remote host
     * @param user login name
     * @param pass password
     * @return SSH session
     * @throws JSchException
     */
    private Session createSession(String host, String user, String pass) throws JSchException {
        // Ignore certificate
        java.util.Properties config = new java.util.Properties();
        config.put("StrictHostKeyChecking", "no");

        // Create session
        JSch jsch = new JSch();
        Session session = jsch.getSession(user, host, 22);
        session.setConfig(config);
        session.setPassword(pass);
        return session;
    }

    /**
     * Copies the local file to the remote path.
     * @param srcPath path to local file
     * @param dstPath target path
     * @throws JSchException
     * @throws IOException
     * @throws SftpException
     */
    public void cp(Path srcPath, String dstPath) throws JSchException, IOException, SftpException {
        // This basically comes from JSch examples
        session.connect();
        ChannelSftp channel = (ChannelSftp) session.openChannel("sftp");
        channel.connect();
        // Assume the target is a path and the target file name will be the source file name
        String targetPath = dstPath;
        String targetFile = srcPath.getFileName().toString();
        try {
            channel.cd(dstPath);
        } catch (SftpException e) {
            // Target does not exist
            int lastIndexOf = targetPath.lastIndexOf('/');
            // target can also be only a file name
            if (lastIndexOf > -1) {
                targetFile = targetPath.substring(lastIndexOf + 1);
                targetPath = targetPath.substring(0, lastIndexOf + 1);
                channel.cd(targetPath);
            }
        }
        try {
            channel.put(new FileInputStream(srcPath.toFile()), targetFile, ChannelSftp.OVERWRITE);
        } finally {
            channel.exit();
            session.disconnect();
        }
    }
}

答案 1 :(得分:0)

我不会建议使用哪个库,但是您需要的是库为您提供一个可以直接将数据写入的OutputStream。我相信大多数库都提供此API。