时间:2021-05-19
本文介绍在Java中如何使用基于SSH的文件传输协议(SFTP)将文件从本地上传到远程服务器,或者将文件在两个服务器之间安全的传输。我们先来了解一下这几个协议
一般来说,SFTP和FTP服务都是使用相应的客户端软件来提供服务。如果你希望在java代码中使用SFTP协议进行安全的文件传输,那么这篇文章非常适合你。
1. 导入JSch 依赖包
在maven项目pom.xml中导入如下的坐标,我们使用JSch,JSch将SFTP协议封装为对应的API供我们调用。
<dependency> <groupId>com.jcraft</groupId> <artifactId>jsch</artifactId> <version>0.1.55</version></dependency>2. 文件传输 – JSch例子
2.1 get与put方法
在JSch,我们可以使用put和get在服务器之间进行文件传输。put方法用来将文件从本地系统传输到远程服务器。
channelSftp.put(localFile, remoteFile);
get方法将文件从远程服务器下载到本地系统。
channelSftp.get(remoteFile, localFile);
2.2 使用用户名和密码进行认证
JSch jsch = new JSch();jsch.setKnownHosts("/home/zimug/.ssh/known_hosts");jschSession = jsch.getSession(USERNAME, REMOTE_HOST, REMOTE_PORT);jschSession.setPassword(PASSWORD);2.3.使用公钥和私钥进行认证
如果读者不能理解公钥和私钥的用法及含义,需要先自行补充一下SSH知识。
2.4 完整JSch文件传输示例
将文件从本地系统传输到远程服务器1.2.3.4,并使用SSH密码登陆方式进行身份验证。
import com.jcraft.jsch.*;public class SFTPFileTransfer { private static final String REMOTE_HOST = "1.2.3.4"; //远程主机ip private static final String USERNAME = ""; //登录用户名 private static final String PASSWORD = ""; //登陆密码 private static final int REMOTE_PORT = 22; //ssh协议默认端口 private static final int SESSION_TIMEOUT = 10000; //session超时时间 private static final int CHANNEL_TIMEOUT = 5000; //管道流超时时间 public static void main(String[] args) { String localFile = "/home/zimug/local/random.txt"; //本地文件路径 String remoteFile = "/home/zimug/remote/targetfile.txt"; //上传到远程的文件路径,要保证登录用户有写权限 Session jschSession = null; try { JSch jsch = new JSch(); jsch.setKnownHosts("/home/zimug/.ssh/known_hosts"); jschSession = jsch.getSession(USERNAME, REMOTE_HOST, REMOTE_PORT); // 通过ssh私钥的方式登录认证 // jsch.addIdentity("/home/zimug/.ssh/id_rsa"); // 通过密码的方式登录认证 jschSession.setPassword(PASSWORD); jschSession.connect(SESSION_TIMEOUT); Channel sftp = jschSession.openChannel("sftp"); //建立sftp文件传输管道 sftp.connect(CHANNEL_TIMEOUT); ChannelSftp channelSftp = (ChannelSftp) sftp; // 传输本地文件到远程主机 channelSftp.put(localFile, remoteFile); channelSftp.exit(); } catch (JSchException | SftpException e) { e.printStackTrace(); } finally { if (jschSession != null) { jschSession.disconnect(); } } System.out.println("文件传输完成!"); }}3. JSch异常处理
在文件上传的过程中,我们可能会遇到下面的一些异常
3.1UnknownHostKey异常
需要将远程服务器IP地址添加到known_hosts文件中。
$ ssh-keyscan -t rsa 1.2.3.4 >> ~/.ssh/known_hosts
3.2对于私钥无效异常
有可能是远程服务器重新生成了私钥,需要把私钥分发复制到本地服务器。
ssh-copy-id -i ~/.ssh/id_rsa.pub <被分发的服务器ip>
3.3对于Auth fail异常
请确保提供的登录密码时正确的
com.jcraft.jsch.JSchException: Auth fail at com.jcraft.jsch.Session.connect(Session.java:519) at com.zimug.io.howto.SFTPFileTransfer.main(SFTPFileTransfer.java:34)作者:字母哥博客
以上就是如何在java中使用SFTP协议安全的传输文件的详细内容,更多关于Java 传输文件的资料请关注其它相关文章!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
前言sFTP(安全文件传输程序)是一种安全的交互式文件传输程序,其工作方式与FTP(文件传输协议)类似。然而,sFTP比FTP更安全;它通过加密SSH传输处理所
设置XlightFTP服务器使用SSH2/SFTP协议XlightFTP服务器现在支持基于SSH2的安全文件传输协议(SFTP).SFTP不是基于SSH2的FT
sftp是SecureFileTransferProtocol的缩写,安全文件传送协议。可以为传输文件提供一种安全的网络的加密方法。sftp与ftp有着几乎一样
linux命令scp和sftp详细介绍1.使用scp命令传输文件:使用scp命令可以用来通过安全、加密的连接在不同主机之间传输文件。(1)把本地文件传输到远程主
基于ssh的sftp服务相比ftp有更好的安全性(非明文帐号密码传输)和方便的权限管理(限制用户的活动目录)。1、开通sftp帐号,使用户只能sftp操作文件,