上篇文章记录了常用的文件操作,这里记录下通过SSH服务器操作Linux服务器的指定路径下的文件。

这里用到了第三方jar包 jsch-0.1.53.jar, jsch-api

1、删除服务器上指定路径下的所有文件(包括本目录)-经测试,在Linux下运行,没有问题

 1 /**
 2      * 删除
 3     *@param dst
 4     *@param sftpUtil
 5     *@return
 6     *@author qin_hqing
 7     *@date 2015年7月6日 下午4:45:31
 8     *@comment
 9      */
10     protected static boolean removeFileFromSSH(String dst, ChannelSftp chanSftp) {
11         boolean bl = false;
12         
13         try {
14             chanSftp.cd(dst);
15             @SuppressWarnings("unchecked")
16             Vector<LsEntry> v = chanSftp.ls(dst);
17             if (v.size() == 2) { //空文件夹 直接删除
18                 chanSftp.rmdir(dst);
19             }else {
20                 int delSize = 0;
21                 for (Iterator<LsEntry> iterator = v.iterator(); iterator.hasNext();) {
22                     
23                     LsEntry lsEntry = (LsEntry) iterator.next();
24                     String ffName = lsEntry.getFilename();
25                     if (ffName.indexOf(".")>0) { // file 
26                         chanSftp.rm(ffName); //删除文件
27                     }else if(ffName.indexOf(".") == -1) {
28                         removeFileFromSSH(dst+ffName+File.separator, chanSftp); //如果路径有问题可以试着把 File.separator 改成 "/"试试
29                         chanSftp.cd(dst);
30                     }
31                     
32                     if (delSize == v.size()-1) { //当前文件夹下还存在文件夹
33                         removeFileFromSSH(dst, chanSftp);
34                     }
35                     delSize ++;
36                 }
37             }
38             
39             bl = true;
40         } catch (SftpException e) {
41             e.printStackTrace();
42         }
43         
44         return bl;
45     }

 2、上传文件到服务器

  A)这里我们用到了一个工具类,该工具类主要功能是通过SSH连接到Linux服务器,释放资源,在服务器上创建路径,代码如下:

  1 package fileUtil;
  2 
  3 import java.io.File;
  4 import java.util.ArrayList;
  5 import java.util.List;
  6 import java.util.Map;
  7 import java.util.Properties;
  8 import java.util.Vector;
  9 
 10 import org.apache.log4j.Logger;
 11 
 12 import com.jcraft.jsch.Channel;
 13 import com.jcraft.jsch.ChannelSftp;
 14 import com.jcraft.jsch.JSch;
 15 import com.jcraft.jsch.JSchException;
 16 import com.jcraft.jsch.Session;
 17 import com.jcraft.jsch.SftpException;
 18 
 19 /**
 20  * @包名 util.sftp
 21  * @文件名 SFTPChannelUtil.java
 22  * @作者 Edi_Kai
 23  * @创建日期 2015年7月3日
 24  * @版本 V 1.0
 25  * @描述
 26  */
 27 public class SFTPChannelUtil {
 28 
 29     private static final Logger LOG = Logger.getLogger(SFTPChannelUtil.class);
 30     
 31     Session session = null;
 32     Channel channel = null;
 33     List<File> list = new ArrayList<File>();
 34 
 35     private static SFTPChannelUtil util;
 36 
 37     public static SFTPChannelUtil getSftpChannelUtil() {
 38         if (null == util) {
 39             util = new SFTPChannelUtil();
 40         }
 41         return util;
 42     }
 43 
 44     /**
 45      * 获取ChannelSftp连接
 46     *@param sftpDetails
 47     *@param timeout
 48     *@return
 49     *@throws JSchException
 50     *@author Edi_Kai
 51     *@date 2015年7月3日 下午5:26:41
 52     *@comment
 53      */
 54     public ChannelSftp getChannel(Map<String, String> sftpDetails, int timeout)
 55             throws JSchException {
 56 
 57         String ftpHost = sftpDetails.get(SFTPConstants.SFTP_REQ_HOST);
 58         String ftpPort = sftpDetails.get(SFTPConstants.SFTP_REQ_PORT);
 59         String ftpUserName = sftpDetails.get(SFTPConstants.SFTP_REQ_USERNAME);
 60         String ftpPassword = sftpDetails.get(SFTPConstants.SFTP_REQ_PASSWORD);
 61 
 62         JSch jsch = new JSch(); // 创建JSch对象
 63         session = jsch.getSession(ftpUserName, ftpHost, Integer.parseInt(ftpPort)); // 根据用户名,主机ip,端口获取一个Session对象
 64         LOG.debug("Session created.");
 65         if (ftpPassword != null) {
 66             session.setPassword(ftpPassword); // 设置密码
 67         }
 68         Properties config = new Properties();
 69         config.put("StrictHostKeyChecking", "no");
 70         session.setConfig(config); // 为Session对象设置properties
 71         session.setTimeout(timeout); // 设置timeout时间
 72         session.connect(); // 通过Session建立链接
 73         LOG.debug("Session connected.");
 74 
 75         LOG.debug("Opening Channel.");
 76         channel = session.openChannel("sftp"); // 打开SFTP通道
 77         channel.connect(); // 建立SFTP通道的连接
 78         LOG.debug("Connected successfully to ftpHost = " + ftpHost
 79                 + ",as ftpUserName = " + ftpUserName + ", returning: "
 80                 + channel);
 81         return (ChannelSftp) channel;
 82     }
 83 
 84     /**
 85      * 关闭连接
 86     *@throws Exception
 87     *@author Edi_Kai
 88     *@date 2015年7月3日 下午5:27:02
 89     *@comment
 90      */
 91     public void closeChannel() throws Exception {
 92         if (channel != null) {
 93             channel.disconnect();
 94         }
 95         if (session != null) {
 96             session.disconnect();
 97         }
 98     }
 99 
100     /**
101      * 查看服务器上是否存在该目录,如果不存在则创建
102     *@param dir
103     *@param channelSftp
104     *@author Edi_Kai
105     *@date 2015年7月3日 下午5:07:25
106     *@comment
107      */
108     public void createDir(String dir, ChannelSftp channelSftp) {
109         String parDir = dir.substring(0, dir.lastIndexOf("/"));
110         try {
111             Vector<?> content = channelSftp.ls(dir);
112             
113             if (content == null) {
114                 createDir(parDir, channelSftp);
115                 if (dir.indexOf(".")<0) {
116                     channelSftp.mkdir(dir);
117                 }
118             }
119         } catch (SftpException e) {
120             try {
121                 createDir(parDir, channelSftp);//如果报异常,则说明dir路径不存在,则创建该路径
122                 if (dir.indexOf(".")<0) {
123                     channelSftp.mkdir(dir);
124                 }
125             } catch (SftpException e1) {
126                 e1.printStackTrace();
127             }
128         }
129     }
130 }

  该类中用到了一个存放常量参数的配置类,SFTPConstants.java,代码如下

package fileUtil;

import java.util.HashMap;
import java.util.Map;

/**
 * @包名 util.sftp
 * @文件名 SFTPConstants.java
 * @作者 Edi_Kai
 * @创建日期 2015年7月3日
 * @版本 V 1.0
 * @描述
 */
public class SFTPConstants {
   public static final String SFTP_REQ_HOST = "host"; public static final String SFTP_REQ_PORT = "port"; public static final String SFTP_REQ_USERNAME = "username"; public static final String SFTP_REQ_PASSWORD = "password"; /** * 获取Linux服务器 登录信息 *@return *@author Edi_Kai *@date 2015年7月3日 下午5:23:37 *@comment */ public static Map<String, String> getConfig() { Map<String, String> cfg = new HashMap<String, String>(); cfg.put(SFTP_REQ_HOST, FileUtil.getPropValue("sshServerHost"));//192.168.1.110 cfg.put(SFTP_REQ_PORT, FileUtil.getPropValue("sshServerPort"));//22 cfg.put(SFTP_REQ_USERNAME, FileUtil.getPropValue("sshServerUN")); cfg.put(SFTP_REQ_PASSWORD, FileUtil.getPropValue("sshServerPwd")); return cfg; } }

  B)、上传文件到服务器

/**
     * 将本服务器上的文件上传到SSH服务器的指定路径下
    *@param src 本地服务器文件路径
    *@param dst SSH服务器路径
    *@return
    *@author Edi_Kai
    *@date 2015年7月6日 上午11:58:30
    *@comment
     */
    public static boolean upFile2SSHServer(String src, String dst) {
        boolean bl = false;
        SFTPChannelUtil util = SFTPChannelUtil.getSftpChannelUtil();
        try {
            ChannelSftp chanSftp = util.getChannel(SFTPConstants.getConfig(), 10000);

            List<File> list = FileUtil.getAllFile(src);
            for (int i = 0; i < list.size(); i++) {
                String path = list.get(i).getPath();

                path = path.replaceAll("\\\\", "/");// E:/ad4/css/ad.css
                if (path.indexOf(":")>-1) {
                    path = path.split(":")[1].substring(1);// ad4/css/ad.css
                }
             
                util.createDir(dst, chanSftp);
                
                chanSftp.put(list.get(i).getPath(), serverPath);
            }

            bl = true;
        } catch (JSchException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            try {
                util.closeChannel();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return bl;
    }

 

 如有遗漏,继续追加....

/**************************************************************/

  每天多学一点....

/**************************************************************/

posted on 2015-08-04 17:35  汉有游女,君子于役  阅读(248)  评论(0编辑  收藏  举报