1. 程式人生 > >java連線sftp工具類

java連線sftp工具類

本工具類支援遠端連線sftp,上傳下載檔案
需要用到是jar是jsch-0.1.29.jar

import java.io.BufferedReader;
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
import java.net.SocketTimeoutException;
import
java.util.Properties; import java.util.Vector; import org.apache.log4j.Logger; import com.jcraft.jsch.Channel; import com.jcraft.jsch.ChannelExec; 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; /** * * @author
matianyu * */
public class JSchUtils { private static final Logger logger = Logger.getLogger(JSchUtils.class); private static JSch jsch; private static Session session = null; private static Channel channel = null; /** * 連線到指定的IP * * @throws JSchException */
public static ChannelSftp connect(String ftpUserName, String ftpPassword, String ftpHost, int ftpPort) throws Exception { jsch = new JSch();// 建立JSch物件 session = jsch.getSession(ftpUserName, ftpHost, ftpPort);// 根據使用者名稱、主機ip、埠號獲取一個Session物件 session.setPassword(ftpPassword);// 設定密碼 Properties config = new Properties(); config.put("StrictHostKeyChecking", "no"); session.setConfig(config);// 為Session物件設定properties session.setTimeout(1000*30);// 設定超時 session.connect();// 通過Session建立連線 logger.info("Session connected."); channel = session.openChannel("sftp"); // 開啟SFTP通道 channel.connect(); // 建立SFTP通道的連線 logger.info("Connected successfully to ftpHost = " + ftpHost + ",as ftpUserName = " + ftpUserName); return (ChannelSftp) channel; } /** * 關閉連線 */ public static void close() { if (channel != null) { channel.disconnect(); logger.info("關閉channel成功"); } if (session != null) { session.disconnect(); logger.info("關閉session成功"); } } /** * 執行相關的命令, * 但是部分情況不可用 * * @throws JSchException */ public static void execCmd(String command) throws JSchException { BufferedReader reader = null; try { if (command != null) { channel = session.openChannel("exec"); ((ChannelExec) channel).setCommand(command); // ((ChannelExec) channel).setErrStream(System.err); channel.connect(); InputStream in = channel.getInputStream(); reader = new BufferedReader(new InputStreamReader(in)); String buf = null; while ((buf = reader.readLine()) != null) { logger.info(buf); } } } catch (IOException e) { e.printStackTrace(); } catch (JSchException e) { e.printStackTrace(); } finally { try { reader.close(); } catch (IOException e) { e.printStackTrace(); } channel.disconnect(); } } /** * 上傳檔案 * * @param directory * 上傳的目錄 * @param uploadFile * 要上傳的檔案 * @param sftp * @throws JSchException * @throws SftpException * @throws FileNotFoundException */ public static void upload(String directory, String uploadFile) throws Exception { ChannelSftp channelSftp = (ChannelSftp) session.openChannel("sftp"); channelSftp.cd(directory); File file = new File(uploadFile); channelSftp.put(new FileInputStream(file), file.getName()); logger.info("上傳: " +uploadFile + "成功!"); } /** * 下載檔案 * * @param src * @param dst * @throws JSchException * @throws SftpException */ public static void download(String src, String dst) throws Exception { // src linux伺服器檔案地址,dst 本地存放地址 ChannelSftp channelSftp = (ChannelSftp) session.openChannel("sftp"); channelSftp.connect(); channelSftp.get(src, dst); logger.info("下載檔案:"+src+"成功"); channelSftp.quit(); } /** * 刪除檔案 * * @param directory * 要刪除檔案所在目錄 * @param deleteFile * 要刪除的檔案 * @param sftp * @throws SftpException * @throws JSchException */ public void delete(String directory, String deleteFile) throws Exception { ChannelSftp channelSftp = (ChannelSftp) session.openChannel("sftp"); channelSftp.cd(directory); channelSftp.rm(deleteFile); logger.info("刪除成功"); } /** * 列出目錄下的檔案 * * @param directory * 要列出的目錄 * @param sftp * @return * @throws SftpException * @throws JSchException */ @SuppressWarnings("rawtypes") public Vector listFiles(String directory) throws Exception { ChannelSftp channelSftp = (ChannelSftp) session.openChannel("sftp"); return channelSftp.ls(directory); } public static void main(String[] args) { try { // 1.連線到指定的伺服器 connect("root", "root", "127.0.0.1", 22); // 2.執行相關的命令 execCmd("grep '160622150549943666' /data/apps/2017-07-07.log >> /data/20170707.txt"); // 3.下載檔案 download("/data/nginx_log.20170707.txt", "D:\\temp"); // 4.關閉連線 close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }

使用例項:
注意程式碼僅供參考:具體細節不列出
上傳檔案:


/************************上傳資料到sftp開始*************************************/
                            //連線sftp
                            ChannelSftp sftp = JSchUtils.connect(ftpUserName, ftpPassword, ftpHost, Integer.valueOf(ftpPort));
                            String path = ftpPath+ "/repayPlan/" + df.format(new Date());//sftp路徑
                            logger.info("sftp路徑" + path);
                            String uploadFile = outPath + "/" + newFileName + ".zip";//上傳的檔案
                            logger.info("上傳的檔案" + uploadFile);
                            FileInputStream in = null;
                            try{
                                 in = new FileInputStream(new File(uploadFile));
                                //sftp.cd(path);
                                sftp.put(in,path + "/" + newFileName + ".zip");
                                logger.info("上傳到sftp成功");
                            }catch(Exception e){
                                logger.info("sftp無該資料夾,新建資料夾");
                                sftp.mkdir(path);
                                //sftp.cd(path);
                                sftp.put(in,path + "/" + newFileName + ".zip");
                                logger.info("上傳到sftp成功");
                                //e.printStackTrace();
                            }
                            /**************************上傳資料到sftp結束************************************/

下載檔案:

/************************從遠端獲sftp取資料開始*************************************/
        //連線sftp
        ChannelSftp sftp = JSchUtils.connect(ftpUserName, ftpPassword, ftpHost, Integer.valueOf(ftpPort));
        String path = ftpPath+ "/completed/" + df.format(rightNow.getTime());//sftp路徑
        logger.info("path:" + path);
        Vector<LsEntry> v = sftp.ls(path);//獲取sftp對應目錄下的檔案列表
        //遍歷檔案列表獲取檔案
        if (v != null && v.size() > 0) {
            for (int i = 0; i < v.size(); i++) {
                String name = v.get(i).getFilename();//檔案目錄下的每個檔案的名字

                if (name.indexOf(".") == 0) {//去掉多餘的檔案
                    System.out.println("開頭是.");
                } else {
                    logger.info(name);
                    //引數1,遠端檔案地址,引數2,本地目錄
                    sftp.get(path+"/"+name, trueName);
                }
            }
        }
        /**************************從遠端獲sftp取資料結束************************************/