在java中使用SFTP协议安全的传输文件
【摘要】
本文介绍在Java中如何使用基于SSH的文件传输协议(SFTP)将文件从本地上传到远程服务器,或者将文件在两个服务器之间安全的传输。我们先来了解一下这几个协议
SSH 是较可靠,专为远程登录会话和其...
本文介绍在Java中如何使用基于SSH的文件传输协议(SFTP)将文件从本地上传到远程服务器,或者将文件在两个服务器之间安全的传输。我们先来了解一下这几个协议
- SSH 是较可靠,专为远程登录会话和其他网络服务提供安全性的协议。比如:我们购买的云服务器登陆的时候使用的协议都是ssh。
- ftp协议通常是用来在两个服务器之间传输文件的,但是它本质上是不安全的。
- 那么SFTP是什么?SFTP可以理解为SSH + FTP,也就是安全的网络文件传输协议。
一般来说,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>
- 1
- 2
- 3
- 4
- 5
2. 文件传输 – JSch例子
2.1 get与put方法
在中JSch
,我们可以使用put
和get
在服务器之间进行文件传输。put
方法用来将文件从本地系统传输到远程服务器。
channelSftp.put(localFile, remoteFile);
- 1
get
方法将文件从远程服务器下载到本地系统。
channelSftp.get(remoteFile, localFile);
- 1
2.2 使用用户名和密码进行认证
JSch jsch = new JSch();
jsch.setKnownHosts("/home/zimug/.ssh/known_hosts");
jschSession = jsch.getSession(USERNAME, REMOTE_HOST, REMOTE_PORT);
jschSession.setPassword(PASSWORD);
- 1
- 2
- 3
- 4
- 5
- "/home/zimug/.ssh/known_hosts"为SSH的known_hosts文件,也就是可信远程主机的公钥保存文件。
- USERNAME 为用户名
- REMOTE_HOST远程主机的Ip
- REMOTE_PORT远程主机端口
- PASSWORD远程主机登录密码
2.3.使用公钥和私钥进行认证
如果读者不能理解公钥和私钥的用法及含义,需要先自行补充一下SSH知识。
- 本地私钥–
/home/登录用户名/.ssh/id_rsa
- 远程公钥默认保存位置–
~/.ssh/authorized_keys
JSch jsch = new JSch();
jsch.setKnownHosts("/home/zimug/.ssh/known_hosts");
jschSession = jsch.getSession(USERNAME, REMOTE_HOST, REMOTE_PORT);
jsch.addIdentity("/home/zimug/.ssh/id_rsa");
- 1
- 2
- 3
- 4
- 5
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("文件传输完成!");
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
3. JSch异常处理
在文件上传的过程中,我们可能会遇到下面的一些异常
3.1UnknownHostKey异常
需要将远程服务器IP地址添加到known_hosts
文件中。
$ ssh-keyscan -t rsa 1.2.3.4 >> ~/.ssh/known_hosts
- 1
3.2对于私钥无效异常
有可能是远程服务器重新生成了私钥,需要把私钥分发复制到本地服务器。
ssh-copy-id -i ~/.ssh/id_rsa.pub <被分发的服务器ip>
- 1
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)
- 1
- 2
- 3
文章来源: zimug.blog.csdn.net,作者:字母哥哥,版权归原作者所有,如需转载,请联系作者。
原文链接:zimug.blog.csdn.net/article/details/109020499
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)