大数据学习之路-----JSch

JSch是Java Secure Channel的缩写。JSch是一个SSH2的纯Java实现。它允许你连接到一个SSH服务器,并且可以使用端口转发,X11转发,文件传输等,当然你也可以集成它的功能到你自己的应用程序。
本文只介绍如何使用JSch实现的SFTP功能。
SFTP是Secure File Transfer Protocol的缩写,安全文件传送协议。可以为传输文件提供一种安全的加密方法。SFTP 为 SSH的一部份,是一种传输文件到服务器的安全方式。SFTP是使用加密传输认证信息和传输的数据,所以,使用SFTP是非常安全的。但是,由于这种传输方式使用了加密/解密技术,所以传输效率比普通的FTP要低得多,如果您对网络安全性要求更高时,可以使用SFTP代替FTP。

ChannelSftp类是JSch实现SFTP核心类,它包含了所有SFTP的方法,如:
put(): 文件上传
get(): 文件下载
cd(): 进入指定目录
ls(): 得到指定目录下的文件列表
rename(): 重命名指定文件或目录
rm(): 删除指定文件
mkdir(): 创建目录
rmdir(): 删除目录
等等(这里省略了方法的参数,put和get都有多个重载方法,具体请看源代码,这里不一一列出。)
JSch支持三种文件传输模式:
传输模式名 描述
OVERWRITE 完全覆盖模式,这是JSch的默认文件传输模式,即如果目标文件已经存在,传输的文件将完全覆盖目标文件,产生新的文件。
RESUME 恢复模式,如果文件已经传输一部分,这时由于网络或其他任何原因导致文件传输中断,如果下一次传输相同的文件,则会从上一次中断的地方续传。
APPEND 追加模式,如果目标文件已存在,传输的文件将在目标文件后追加
具体代码:
package com.zng.jsch;

import com.jcraft.jsch.;
import java.io.
;
import java.nio.charset.Charset;

/**

  • author:Mr.zhao

  • date:2019/7/22

  • 知识很简单,学习很快乐
    */
    public class JSchExecutor {
    //private static Logger log = LoggerFactory.getLogger(JSchExecutor.class);
    private String charset = “UTF-8”; // 设置编码格式
    private String user; // 用户名
    private String passwd; // 登录密码
    private String host; // 主机IP
    private int port = 22; //默认端口
    private JSch jsch;
    private Session session;
    private ChannelSftp sftp;

    /**
    *

    • @param user 用户名
    • @param passwd 密码
    • @param host 主机IP
      */
      public JSchExecutor(String user, String passwd, String host ) {
      this.user = user;
      this.passwd = passwd;
      this.host = host;
      }

    /**
    *

    • @param user 用户名
    • @param passwd 密码
    • @param host 主机IP
      */
      public JSchExecutor(String user, String passwd, String host , int port ) {
      this.user = user;
      this.passwd = passwd;
      this.host = host;
      this.port = port;
      }

    /**

    • 连接到指定的IP

    • @throws
      /
      public void connect() throws JSchException {
      jsch = new JSch();
      session = jsch.getSession(user, host, port);
      session.setPassword(passwd);
      java.util.Properties config = new java.util.Properties();
      config.put(“StrictHostKeyChecking”, “no”);
      session.setConfig(config);
      session.connect();
      Channel channel = session.openChannel(“sftp”);
      channel.connect();
      sftp = (ChannelSftp) channel;
      //log.info("连接到SFTP成功。host: " + host);
      }
      /
      *

    • 关闭连接
      /
      public void disconnect(){
      if (sftp != null && sftp.isConnected()) {
      sftp.disconnect();
      }
      if(session != null && session.isConnected()){
      session.disconnect();
      }
      }
      /
      *

    • 执行一条命令
      */
      public int execCmd(String command) throws Exception{
      //XxlJobLogger.log( “开始执行命令:” + command);
      int returnCode = -1;
      BufferedReader reader = null;
      Channel channel = null;

      channel = session.openChannel(“exec”);
      ((ChannelExec) channel).setCommand(command);
      channel.setInputStream(null);
      ((ChannelExec) channel).setErrStream(System.err);
      InputStream in = channel.getInputStream();
      //中文乱码貌似这里不能控制,看连接的服务器的
      reader = new BufferedReader(new InputStreamReader(in));
      channel.connect();
      System.out.println("The remote command is: " + command);
      String buf ;
      while ((buf = reader.readLine()) != null) {
      // XxlJobLogger.log(buf);
      }
      reader.close();
      // Get the return code only after the channel is closed.
      if (channel.isClosed()) {
      returnCode = channel.getExitStatus();
      }

      channel.disconnect();
      return returnCode;
      }

    /**

    • 执行相关的命令
      */
      public void execCmd() {
      BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

      String command = “”;
      BufferedReader reader = null;
      Channel channel = null;

      try {
      while ((command = br.readLine()) != null) {
      channel = session.openChannel(“exec”);
      ((ChannelExec) channel).setCommand(command);
      channel.setInputStream(null);
      ((ChannelExec) channel).setErrStream(System.err);

           channel.connect();
           InputStream in = channel.getInputStream();
           reader = new BufferedReader(new InputStreamReader(in,
                   Charset.forName(charset)));
           String buf = null;
           while ((buf = reader.readLine()) != null) {
               System.out.println(buf);
           }
       }
      

      } catch (Exception e) {
      e.printStackTrace();
      } finally {
      try {
      reader.close();
      } catch (Exception e) {
      e.printStackTrace();
      }
      channel.disconnect();
      }
      }

    /**

    • 上传文件
      */
      public void uploadFile(String local,String remote) throws Exception {
      File file = new File(local);
      if (file.isDirectory()) {
      throw new RuntimeException(local + " is not a file");
      }

      InputStream inputStream = null;
      try {
      String rpath = remote.substring(0,remote.lastIndexOf("/")+1);
      if (!isDirExist(rpath)){
      createDir(rpath);
      }
      inputStream = new FileInputStream(file);
      sftp.setInputStream(inputStream);
      sftp.put(inputStream, remote);
      } catch (Exception e) {
      throw e;
      }finally{
      if(inputStream != null){
      inputStream.close();
      }
      }
      }
      /**

    • 下载文件
      */
      public void downloadFile(String remote,String local) throws Exception{
      OutputStream outputStream = null;
      try {
      sftp.connect(5000);
      outputStream = new FileOutputStream(new File(local));
      sftp.get(remote, outputStream);
      outputStream.flush();
      } catch (Exception e) {
      throw e;
      }finally{
      if(outputStream != null){
      outputStream.close();
      }
      }
      }

    /**

    • 移动到相应的目录下
    • @param pathName 要移动的目录
    • @return
      */
      public boolean changeDir(String pathName){
      if(pathName == null || pathName.trim().equals("")){
      //log.debug(“invalid pathName”);
      return false;
      }
      try {
      sftp.cd(pathName.replaceAll("\\", “/”));
      //log.debug(“directory successfully changed,current dir=” + sftp.pwd());
      return true;
      } catch (SftpException e) {
      //log.error(“failed to change directory”,e);
      return false;
      }
      }

    /**

    • 创建一个文件目录,mkdir每次只能创建一个文件目录
    • 或者可以使用命令mkdir -p 来创建多个文件目录
      */
      public void createDir(String createpath) {
      try {
      if (isDirExist(createpath)) {
      sftp.cd(createpath);
      return;
      }
      String pathArry[] = createpath.split("/");
      StringBuffer filePath = new StringBuffer("/");
      for (String path : pathArry) {
      if (path.equals("")) {
      continue;
      }
      filePath.append(path + “/”);
      if (isDirExist(filePath.toString())) {
      sftp.cd(filePath.toString());
      } else {
      // 建立目录
      sftp.mkdir(filePath.toString());
      // 进入并设置为当前目录
      sftp.cd(filePath.toString());
      }
      }
      sftp.cd(createpath);
      } catch (SftpException e) {
      throw new RuntimeException(“创建路径错误:” + createpath);
      }
      }

    /**

    • 判断目录是否存在
    • @param directory
    • @return
      */
      public boolean isDirExist(String directory) {
      boolean isDirExistFlag = false;
      try {
      SftpATTRS sftpATTRS = sftp.lstat(directory);
      isDirExistFlag = true;
      return sftpATTRS.isDir();
      } catch (Exception e) {
      if (e.getMessage().toLowerCase().equals(“no such file”)) {
      isDirExistFlag = false;
      }
      }
      return isDirExistFlag;
      }

}

具体实现,就需要再写一个类,new一个JSch对象来实现具体方法,并在实现时传入参数

你可能感兴趣的:(大数据学习之路-----JSch)