共计 3096 个字符,预计需要花费 8 分钟才能阅读完成。
本文介绍在 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>
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);
- “/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");
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)
欢送关注我的博客,外面有很多精品合集
本文转载注明出处(必须带连贯,不能只转文字):字母哥博客 – zimug.com
感觉对您有帮忙的话,帮我点赞、分享!您的反对是我不竭的创作能源!。另外,笔者最近一段时间输入了如下的精品内容,期待您的关注。
- 《手摸手教你学 Spring Boot2.0》
- 《Spring Security-JWT-OAuth2 一本通》
- 《实战前后端拆散 RBAC 权限管理系统》
- 《实战 SpringCloud 微服务从青铜到王者》
- 《VUE 深入浅出系列》
正文完