JSch使用介绍
JSch 是SSH2的一个纯Java实现。它允许你连接到一个sshd 服务器,使用端口转发,X11转发,文件传输等等。你可以将它的功能集成到你自己的程序中。
1. jar包下载
maven仓库:https://mvnrepository.com/artifact/com.jcraft/jsch/0.1.55
官网:http://www.jcraft.com/jsch/
2. 引入依赖
<dependency>
<groupId>com.jcraft</groupId>
<artifactId>jsch</artifactId>
<version>0.1.55</version>
</dependency>
3. 代码实现
public class SFTPChannelUtils {
Session session = null;
Channel channel = null;
public ChannelSftp getChannelSftp() throws JSchException {
// ssh服务器的IP、用户名、密码和端口
String sftpHost = "101.200.149.*";
String sftpUsername = "root";
String sftpPassword = "******";
int sftpPort = 22;
JSch jsch = new JSch(); // 创建JSch对象
session = jsch.getSession(sftpUsername, sftpHost, sftpPort);// 获取sesson对象
session.setPassword(sftpPassword);// 设置sftp访问密码
Properties config = new Properties();
config.put("StrictHostKeyChecking", "no");
session.setConfig(config);// 为session重新设置参数
session.setTimeout(30000);// 设置超时
session.connect();// 建立连接
channel = session.openChannel("sftp"); // 打开sftp通道
channel.connect();// 建立sftp通道连接
return (ChannelSftp) channel;
}
public static void main(String[] args) {
/*JSch支持三种文件传输模式:
OVERWRITE 完全覆盖模式,这是JSch的 默认文件传输模式,即如果目标文件已经存在,传输的文件将完全覆盖目标文件,产生新的文件。
RESUME 恢复模式,如果文件已经传输一部分,这时由于网络或其他任何原因导致文件传输中断,如果下一次传输相同的文件,则会从上一次中断的地方续传。
APPEND 追加模式,如果目标文件已存在,传输的文件将在目标文件后追加。*/
String srcFile = "E:\\picture.png";
String destFile = "/root/data/picture/picture.png";
try {
SFTPChannelUtils sftpChannel = new SFTPChannelUtils();
ChannelSftp channel = sftpChannel.getChannelSftp();
OutputStream out = channel.put(destFile, ChannelSftp.OVERWRITE); // 这里使用OVERWRITE模式
// 默认使用OVERWRITE模式
byte[] buff = new byte[1024 * 256]; // 设定每次传输的数据块大小为256KB
int read;
if (out != null) {
System.out.println("Start to read input stream");
InputStream is = new FileInputStream(srcFile);
do {
read = is.read(buff, 0, buff.length);
if (read > 0) {
out.write(buff, 0, read);
}
out.flush();
} while (read >= 0);
}
System.out.println("传输完成");
channel.quit();
sftpChannel.closeChannel();
} catch (Exception e) {
e.printStackTrace();
}
}
public void closeChannel() {
if (channel != null) {
channel.disconnect();
}
if (session != null) {
session.disconnect();
}
System.out.println("关闭");
}
}
4. 验证
从代码中可以看出我们将E:\\picture.png
传输到了/root/data/picture/picture.png
成功!
备注:JSch还能实现文件夹的传输,大家可以自行测试。
微信公众号先已开通,搜索 “江小南和他的小伙伴们” 就能找到我哦,各位小伙伴们可以关注一下,文章会进行同步更新,方便查看哦。