java技術用ssh從linux服務器下載數據


通常需要從linux服務器獲取數據文件,而通常能有的訪問方式只有ssh,所以就可以用ssh進行數據下載。

java連接遠程主機的方式有多種,這里和大家分享的是通過ssh方式連接遠程主機,使用的是jsch這個jar包,資源在這里

 

package com.app.pt.backup.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.util.Iterator;
import java.util.Vector;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.app.common.util.FileUtil;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.ChannelSftp.LsEntry;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.SftpException;

/**
 * SFTP幫助類
 * @author wangbailin
 *
 */
public class SFTPUtil {
    
    private static Log log = LogFactory.getLog(SFTPUtil.class);
    
    /**
     * 連接sftp服務器
     * @param host 遠程主機ip地址
     * @param port sftp連接端口,null 時為默認端口
     * @param user 用戶名
     * @param password 密碼
     * @return
     * @throws JSchException 
     */
    public static Session connect(String host, Integer port, String user, String password) throws JSchException{
        Session session = null;
        try {
            JSch jsch = new JSch();
            if(port != null){
                session = jsch.getSession(user, host, port.intValue());
            }else{
                session = jsch.getSession(user, host);
            }
            session.setPassword(password);
            //設置第一次登陸的時候提示,可選值:(ask | yes | no)
            session.setConfig("StrictHostKeyChecking", "no");
            //30秒連接超時
            session.connect(30000);
        } catch (JSchException e) {
            e.printStackTrace();
            System.out.println("SFTPUitl 獲取連接發生錯誤");
            throw e;
        }
        return session;
    }
    
    /**
     * sftp上傳文件(夾)
     * @param directory
     * @param uploadFile
     * @param sftp
     * @throws Exception 
     */
    public static void upload(String directory, String uploadFile, ChannelSftp sftp) throws Exception{
        System.out.println("sftp upload file [directory] : "+directory);
        System.out.println("sftp upload file [uploadFile] : "+ uploadFile);
        File file = new File(uploadFile);
        if(file.exists()){
            //這里有點投機取巧,因為ChannelSftp無法去判讀遠程linux主機的文件路徑,無奈之舉
            try {
                Vector content = sftp.ls(directory);
                if(content == null){
                    sftp.mkdir(directory);
                }
            } catch (SftpException e) {
                sftp.mkdir(directory);
            }
            //進入目標路徑
            sftp.cd(directory);
            if(file.isFile()){
                InputStream ins = new FileInputStream(file);
                //中文名稱的
                sftp.put(ins, new String(file.getName().getBytes(),"UTF-8"));
                //sftp.setFilenameEncoding("UTF-8");
            }else{
                File[] files = file.listFiles();
                for (File file2 : files) {
                    String dir = file2.getAbsolutePath();
                    if(file2.isDirectory()){
                        String str = dir.substring(dir.lastIndexOf(file2.separator));
                        directory = FileUtil.normalize(directory + str);
                    }
                    upload(directory,dir,sftp);
                }
            }
        }
    }
    
    /**
     * sftp下載文件(夾)
     * @param directory 下載文件上級目錄
     * @param srcFile 下載文件完全路徑
     * @param saveFile 保存文件路徑
     * @param sftp ChannelSftp
     * @throws UnsupportedEncodingException
     */
    public static void download(String directory,String srcFile, String saveFile, ChannelSftp sftp) throws UnsupportedEncodingException {
        Vector conts = null;
        try{
            conts = sftp.ls(srcFile);
        } catch (SftpException e) {
            e.printStackTrace();
            log.debug("ChannelSftp sftp羅列文件發生錯誤",e);
        }
        File file = new File(saveFile);
        if(!file.exists()) file.mkdir();
        //文件
        if(srcFile.indexOf(".") > -1){
            try {
                sftp.get(srcFile, saveFile);
            } catch (SftpException e) {
                e.printStackTrace();
                log.debug("ChannelSftp sftp下載文件發生錯誤",e);
            }
        }else{
        //文件夾(路徑)
            for (Iterator iterator = conts.iterator(); iterator.hasNext();) {
                LsEntry obj =  (LsEntry) iterator.next();
                String filename = new String(obj.getFilename().getBytes(),"UTF-8");
                if(!(filename.indexOf(".") > -1)){
                    directory = FileUtil.normalize(directory + System.getProperty("file.separator") + filename);
                    srcFile = directory;
                    saveFile = FileUtil.normalize(saveFile + System.getProperty("file.separator") + filename);
                }else{
                    //掃描到文件名為".."這樣的直接跳過
                    String[] arrs = filename.split("\\.");
                    if((arrs.length > 0) && (arrs[0].length() > 0)){
                        srcFile = FileUtil.normalize(directory + System.getProperty("file.separator") + filename);
                    }else{
                        continue;
                    }
                }
                download(directory, srcFile, saveFile, sftp);
            }
        }
    }
}

調用方法:

ChannelSftp sftp = null;
Session session = null;
try {
    session = SFTPUtil.connect(host, port, username, password);
    Channel channel = session.openChannel("sftp");
    channel.connect();
    sftp = (ChannelSftp) channel;
    SFTPUtil.upload(destDir, srcfile.getAbsolutePath(), sftp);
} catch (Exception e) {
    e.printStackTrace();
    logger.debug(e);
    return UtilMisc.toMap("flag","failure","msg","備份文件到遠程主機發生錯誤");
}finally{
    if(sftp != null)sftp.disconnect();
    if(session != null)session.disconnect();
}

原文博客地址:http://blog.csdn.net/wangbailin2009/article/details/20232999#L51

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM