所以在我的Java客户端中我将创建一个新文件,我希望通过scp或sftp直接写入远程系统(用户可以选择哪个) - 我不希望将文件写入本地文件系统然后复制(生成的文件可能很大,本地磁盘空间可能有问题)。
谷歌搜索引发了各种各样的选择。 Jsch似乎是最受欢迎的。有关最佳方法的观点吗?我更愿意避免使用开源软件包,除非它们已经成熟并且有很好的文档记录(我对几个开源产品的经验很糟糕,这些产品可能使复杂的工作变得简单,但也使简单的工作成为一种正确的痛苦)。
答案 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。