Java中使用jcraft进行SFTP的上传下载

来源:互联网 发布:手机java游戏模拟器 编辑:程序博客网 时间:2024/04/20 06:06

如果大家熟悉Linux的话,一定对ssh,sftp,scp等命令非常熟悉。ssh是一个安全协议,用来在不同系统或者服务

器之间进行安全连接。ssh 在连接和传送的过程中会加密所有的数据。具体的解释,大家可以参考百度百科的文

档。地址为:http://baike.baidu.com/view/16184.htm

    但是SSH一般是基于客户端的或者Linux命令行的。比如客户端的工具:OpenSSH,putty,SSH 

Tectia;在linux上大家可以通过ssh username@host连接到所要想连接的主机。但是如果在J2EE中,如何实

现SSH呢?进而可以实现SCP,SFTP的功能呢?下面介绍的JSCH就可以实现下边的功能。

    JSCH是一个纯粹的用java实现SSH功能的java  library. 官方地址为:

http://www.jcraft.com/jsch/

GitHub 地址为:https://github.com/vngx/vngx-jsch

maven配置如下:

<!-- 加入sftp依赖包 --><dependency>    <groupId>com.jcraft</groupId>    <artifactId>jsch</artifactId>    <version>0.1.51</version></dependency>

下面简单介绍下JSCH的特点:

1.基于DSA和RSA加密。

2.可以实现4中认证机制。分别是:

  •      password
  •      publickey(DSA,RSA)
  •      keyboard-interactive
  •      gss-api-with-mic

3.生成public/private key pair.

4.执行bash script 等脚本

5.可以通过HTTP/SOCK5 proxy

6.支持常见SSH1协议和SSH2协议

我们日常用到的JSCH主要是基于是密码认证和private key 认证。

基于密码认证的比较简单。简单代码如下:

package com.somnus.connect;import java.io.ByteArrayInputStream;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.UnsupportedEncodingException;import java.util.Arrays;import java.util.Properties;import java.util.Vector;import org.apache.commons.io.IOUtils;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import com.jcraft.jsch.Channel;import com.jcraft.jsch.ChannelSftp;import com.jcraft.jsch.JSch;import com.jcraft.jsch.JSchException;import com.jcraft.jsch.Session;import com.jcraft.jsch.SftpException;import com.somnus.exception.BizException;/** * sftp工具。注意:构造方法有两个:分别是基于密码认证、基于秘钥认证。 *  * @see http://xliangwu.iteye.com/blog/1499764 * @author Somnus */public class SFTPUtil {    private transient Logger log = LoggerFactory.getLogger(this.getClass());        private ChannelSftp sftp;        private Session session;    /** FTP 登录用户名*/    private String username;     /** FTP 登录密码*/    private String password;    /** 私钥文件的路径*/    private String keyFilePath;    /** FTP 服务器地址IP地址*/    private String host;    /** FTP 端口*/    private int port;        /**     * 构造基于密码认证的sftp对象     * @param userName     * @param password     * @param host     * @param port     */    public SFTPUtil(String username, String password, String host, int port) {        this.username = username;        this.password = password;        this.host = host;        this.port = port;    }    /**     * 构造基于秘钥认证的sftp对象     * @param userName     * @param host     * @param port     * @param keyFilePath     */    public SFTPUtil(String username, String host, int port, String keyFilePath) {        this.username = username;        this.host = host;        this.port = port;        this.keyFilePath = keyFilePath;    }    public SFTPUtil(){}    /**     * 连接sftp服务器     *      * @throws Exception     */    public void login(){        try {            JSch jsch = new JSch();            if (keyFilePath != null) {                jsch.addIdentity(keyFilePath);// 设置私钥                log.info("sftp connect,path of private key file:{}" , keyFilePath);            }            log.info("sftp connect by host:{} username:{}",host,username);            session = jsch.getSession(username, host, port);            log.info("Session is build");            if (password != null) {                session.setPassword(password);            }            Properties config = new Properties();            config.put("StrictHostKeyChecking", "no");                        session.setConfig(config);            session.connect();            log.info("Session is connected");                        Channel channel = session.openChannel("sftp");            channel.connect();            log.info("channel is connected");            sftp = (ChannelSftp) channel;            log.info(String.format("sftp server host:[%s] port:[%s] is connect successfull", host, port));        } catch (JSchException e) {            log.error("Cannot connect to specified sftp server : {}:{} \n Exception message is: {}", new Object[]{host, port, e.getMessage()});            throw new BizException(e.getMessage(),e);        }    }    /**     * 关闭连接 server     */    public void logout(){        if (sftp != null) {            if (sftp.isConnected()) {                sftp.disconnect();                log.info("sftp is closed already");            }        }        if (session != null) {            if (session.isConnected()) {                session.disconnect();                log.info("sshSession is closed already");            }        }    }    /**     * 将输入流的数据上传到sftp作为文件     *      * @param directory     *            上传到该目录     * @param sftpFileName     *            sftp端文件名     * @param in     *            输入流     * @throws SftpException      * @throws Exception     */    public void upload(String directory, String sftpFileName, InputStream input) throws SftpException{        try {            sftp.cd(directory);        } catch (SftpException e) {            log.warn("directory is not exist");            sftp.mkdir(directory);            sftp.cd(directory);        }        sftp.put(input, sftpFileName);        log.info("file:{} is upload successful" , sftpFileName);    }    /**     * 上传单个文件     *      * @param directory     *            上传到sftp目录     * @param uploadFile     *            要上传的文件,包括路径     * @throws FileNotFoundException      * @throws SftpException      * @throws Exception     */    public void upload(String directory, String uploadFile) throws FileNotFoundException, SftpException{        File file = new File(uploadFile);        upload(directory, file.getName(), new FileInputStream(file));    }    /**     * 将byte[]上传到sftp,作为文件。注意:从String生成byte[]是,要指定字符集。     *      * @param directory     *            上传到sftp目录     * @param sftpFileName     *            文件在sftp端的命名     * @param byteArr     *            要上传的字节数组     * @throws SftpException      * @throws Exception     */    public void upload(String directory, String sftpFileName, byte[] byteArr) throws SftpException{        upload(directory, sftpFileName, new ByteArrayInputStream(byteArr));    }    /**     * 将字符串按照指定的字符编码上传到sftp     *      * @param directory     *            上传到sftp目录     * @param sftpFileName     *            文件在sftp端的命名     * @param dataStr     *            待上传的数据     * @param charsetName     *            sftp上的文件,按该字符编码保存     * @throws UnsupportedEncodingException      * @throws SftpException      * @throws Exception     */    public void upload(String directory, String sftpFileName, String dataStr, String charsetName) throws UnsupportedEncodingException, SftpException{        upload(directory, sftpFileName, new ByteArrayInputStream(dataStr.getBytes(charsetName)));    }    /**     * 下载文件     *      * @param directory     *            下载目录     * @param downloadFile     *            下载的文件     * @param saveFile     *            存在本地的路径     * @throws SftpException      * @throws FileNotFoundException      * @throws Exception     */    public void download(String directory, String downloadFile, String saveFile) throws SftpException, FileNotFoundException{    if (directory != null && !"".equals(directory)) {            sftp.cd(directory);        }        File file = new File(saveFile);        sftp.get(downloadFile, new FileOutputStream(file));        log.info("file:{} is download successful" , downloadFile);    }    /**     * 下载文件     * @param directory 下载目录     * @param downloadFile 下载的文件名     * @return 字节数组     * @throws SftpException      * @throws IOException      * @throws Exception     */    public byte[] download(String directory, String downloadFile) throws SftpException, IOException{        if (directory != null && !"".equals(directory)) {            sftp.cd(directory);        }        InputStream is = sftp.get(downloadFile);                byte[] fileData = IOUtils.toByteArray(is);                log.info("file:{} is download successful" , downloadFile);        return fileData;    }    /**     * 删除文件     *      * @param directory     *            要删除文件所在目录     * @param deleteFile     *            要删除的文件     * @throws SftpException      * @throws Exception     */    public void delete(String directory, String deleteFile) throws SftpException{    sftp.cd(directory);        sftp.rm(deleteFile);    }    /**     * 列出目录下的文件     *      * @param directory     *            要列出的目录     * @param sftp     * @return     * @throws SftpException     */    public Vector<?> listFiles(String directory) throws SftpException {        return sftp.ls(directory);    }        public static void main(String[] args) throws SftpException, IOException {        SFTPUtil sftp = new SFTPUtil("somnus", "passw0rd", "192.168.1.100", 22);        sftp.login();        byte[] buff = sftp.download("./download", "abc.txt");        System.out.println(Arrays.toString(buff));        sftp.logout();    }    }



1 0
原创粉丝点击