JCraft实现远程服务器的登录和文件上传下载删除

JCraft实现远程服务器的登录和文件上传下载删除

0.准备

  • 官网地址:http://www.jcraft.com/

JCraft是一个Java实现的SSH、SFTP、SCP等协议的库,它提供了多个工具类,用于在Java应用程序中实现与远程服务器的安全通信和文件传输。这些工具类包括:

  1. JSch: 这是JCraft库的核心部分,用于建立SSH连接。它允许用户通过SSH协议连接到远程主机,进行远程命令执行、文件传输等操作。

  2. Channel: JCraft提供了不同类型的通道,如Shell、Exec、SFTP等,用于在SSH连接上执行不同类型的操作。比如,Shell通道允许用户执行远程命令,而SFTP通道允许进行安全的文件传输。

  3. Session: 这个类用于创建和管理SSH会话。它是与远程主机建立连接的入口点,提供了对连接参数的设置和控制。

  4. UserInfo: 用于处理用户身份验证信息的接口。可以通过实现这个接口来提供自定义的用户身份验证逻辑。

  5. JSchException: 用于处理JCraft库中可能出现的异常情况。

这些工具类使开发者能够使用Java语言轻松地实现SSH、SFTP等协议的功能,建立安全的远程连接并执行各种操作,如执行远程命令、传输文件等。

1.Maven依赖

<dependency>
    <groupId>com.jcraft</groupId>
    <artifactId>jsch</artifactId>
    <version>0.1.51</version>
</dependency>

2-1.SSH远程登录

代码流程

  1. 通过初始JschUtil设置连接参数,用户名、密码、ip、端口
  2. 通过Connection连接获取会话Session
  3. 打开Channel执行命令–>executeCmd–>channel 关闭
  4. 关闭远程连接
/**
 * ClassName:JschUtil
 *
 * @author: Lee
 * Description:
 * @date:2020/11/17 20:45
 */
import com.jcraft.jsch.*;

import java.io.*;
import java.nio.charset.Charset;

public class JschUtil {
   

    private int SSH_PORT;
    private String username;
    private String password;
    private String hostip;
    private String charset = "UTF-8";
    private Session session;

    public JschUtil(String user, String password, String hostip, int port) {
   
        this.username = user;
        this.password = password;
        this.hostip = hostip;
        this.SSH_PORT = port;
    }

    /**
     * 连接到远程机器
     *
     * @throws JSchException
     */
    public void Connection() throws JSchException {
   
        JSch js = new JSch();
        session = js.getSession(username, hostip, SSH_PORT);
        session.setPassword(password);
        session.setConfig("StrictHostKeyChecking", "no");
        session.connect();
    }

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

    /**
     * 执行ssh命令
     *
     * @param command
     * @throws JSchException
     * @throws IOException
     */
    public void executeCmd(String command) throws JSchException, IOException {
   
        BufferedReader reader = null;
        Channel channel = null;
        System.out.println("**********************************");
        System.out.println("InputCommand:" + "【" + command + "】");
        System.out.println("**********************************");
        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;
        System.out.println("OutPutResult:" + "\n");
        StringBuffer buffer = new StringBuffer();
        while ((buf = reader.readLine()) != null) {
   
            System.out.println(buf);
            buffer.append(buf);
            buffer.append("\n");
        }
        System.out.println("**********************************");
        System.out.println("ReturnResult:" + "\n" + buffer.toString());
        channel.disconnect();
    }

    public static void main(String[] args) {
   
        String cmd = "ls -l /";
        JschUtil js = new JschUtil("root", "123456", "192.168.0.99", 22);
        try {
   
            js.Connection();
            try {
   
                js.executeCmd(cmd);
            } catch (Exception e) {
   
                Thread.sleep(1000 * 60 * 10);
                System.out.println("命令执行错误" + e.toString());
            } finally {
   
                js.disconnection();
            }
        } catch (JSchException e) {
   
            // 处理连接异常
            System.out.println(e.toString());
        } catch (InterruptedException ex) {
   
            // 处理线程中断异常
            ex.printStackTrace();
        }
    }
}

2-2.SFTP

代码流程

  1. 通过初始JschUtil设置连接参数,用户名、密码、ip、端口
  2. 通过Connection连接获取会话Session -->获取ftp通信通道
  3. upload\download\rm 文件
  4. 关闭Session
import com.jcraft.jsch.*;
import java.io.*;
import java.util.Properties;

/**
 * sftp工具类
 * 下载文件
 * 上传文件
 * 删除文件
 */
public class SftpUtil {

    /**
     * 创建一个sftp Session
     *
     * @param host     服务器ip
     * @param port     端口
     * @param username 用户名
     * @param password 密码
     * @return 返回ChannelSftp
     * @throws Exception 获取通道时的异常
     */
    public static ChannelSftp getSftpChannel(String host, Integer port, String username, String password) throws Exception {
        Session session;
        Channel channel = null;
        JSch jSch = new JSch();
        try {
            session = jSch.getSession(username, host, port);
            session.setPassword(password);
            // 配置链接的属性
            Properties properties = new Properties();
            properties.setProperty("StrictHostKeyChecking", "no");
            session.setConfig(properties);
            // 打开会话连接
            session.connect();
            // 获取ftp通道
            channel = session.openChannel("sftp");
            channel.connect();
        } catch (JSchException e) {
            e.printStackTrace();
            throw e;
        }
        return (ChannelSftp) channel;
    }

   /**
     * 上传文件
     *
     * @param channelSftp sftp通道
     * @param localFile   本地文件
     * @param remoteFile  远程文件
     */
    public static void upload(ChannelSftp channelSftp, String localFile, String remoteFile) throws Exception {
        try (InputStream inputStream = new FileInputStream(localFile)) {
            channelSftp.put(inputStream, remoteFile);
        } catch (FileNotFoundException e) {
            throw new RuntimeException("上传文件时找不到本地文件: " + e.getMessage(), e);
        } catch (SftpException e) {
            throw new RuntimeException("上传文件出错: " + e.getMessage(), e);
        }
    }

    /**
     * 从sftp服务器上下载文件
     *
     * @param channelSftp sftp通道
     * @param remoteFile  远程文件
     * @param localFile   本地文件
     */
    public static void download(ChannelSftp channelSftp, String remoteFile, String localFile) throws Exception {
        try (OutputStream outputStream = new FileOutputStream(localFile)) {
            channelSftp.get(remoteFile, outputStream);
        } catch (FileNotFoundException e) {
            throw new RuntimeException("下载文件时找不到本地文件: " + e.getMessage(), e);
        } catch (SftpException e) {
            throw new RuntimeException("下载文件出错: " + e.getMessage(), e);
        }
    }

    /**
     * 删除文件
     *
     * @param channelSftp sftp通道
     * @param remoteFile  远程文件
     */
    public static void deleteFile(ChannelSftp channelSftp, String remoteFile) throws Exception {
        try {
            channelSftp.rm(remoteFile);
        } catch (SftpException e) {
            throw new RuntimeException("删除文件出错: " + e.getMessage(), e);
        }
    }

    /**
     * 关闭sftp链接
     *
     * @param channelSftp sftp通道
     * @throws Exception 关闭session的异常
     */
    public static void closeSession(ChannelSftp channelSftp) throws Exception {
        if (channelSftp == null) {
            return;
        }
        Session session = null;
        try {
            session = channelSftp.getSession();
        } catch (JSchException e) {
            e.printStackTrace();
            throw e;
        } finally {
            if (session != null) {
                session.disconnect();
            }
        }
    }

    public static void main(String[] args) {
        try {
            // 获取sftp通道
            ChannelSftp channelSftp = SftpUtil.getSftpChannel("192.168.0.99", 22, "root", "123456");
            try {
                // 上传文件
                String local = "D:\\11.png";
                String remote = "/11.png";
                SftpUtil.upload(channelSftp, local, remote);
            } catch (SftpException e) {
                // 处理上传文件异常
                System.out.println("上传文件出错:" + e.getMessage());
            }

            try {
                // 下载文件
                String remote2 = "/11.png";
                String local2 = "D:\\tech\\11.png";
                SftpUtil.download(channelSftp, remote2, local2);
            } catch (SftpException e) {
                // 处理下载文件异常
                System.out.println("下载文件出错:" + e.getMessage());
            }

            try {
                // 删除文件
                String remote3 = "/11.png";
                SftpUtil.deleteFile(channelSftp, remote3);
            } catch (SftpException e) {
                // 处理删除文件异常
                System.out.println("删除文件出错:" + e.getMessage());
            }

            try {
                // 关闭连接
                SftpUtil.closeSession(channelSftp);
            } catch (Exception e) {
                // 处理关闭连接异常
                System.out.println("关闭连接出错:" + e.getMessage());
            }
        } catch (JSchException e) {
            // 处理获取SFTP通道异常
            System.out.println("获取SFTP通道出错:" + e.getMessage());
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

相关推荐

  1. JCraft实现远程服务器登录文件下载删除

    2024-01-07 22:14:02       40 阅读
  2. 文件下载

    2024-01-07 22:14:02       18 阅读
  3. 如何在服务器/下载文件

    2024-01-07 22:14:02       17 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-01-07 22:14:02       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-07 22:14:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-07 22:14:02       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-07 22:14:02       20 阅读

热门阅读

  1. okhttp网络请求工具

    2024-01-07 22:14:02       39 阅读
  2. Flutter 中的 Stream:异步编程的利器

    2024-01-07 22:14:02       39 阅读
  3. 华为HCIE课堂笔记第十二章 ICMPv6和NDP协议

    2024-01-07 22:14:02       32 阅读
  4. C++中的面向对象重点总结

    2024-01-07 22:14:02       42 阅读
  5. C#VB.net如何增加WinForms中复选框的大小?

    2024-01-07 22:14:02       45 阅读
  6. DOS小白手册(DOS的基本使用)

    2024-01-07 22:14:02       35 阅读
  7. Autosar PNC网络管理配置(1)-基于ETAS软件

    2024-01-07 22:14:02       40 阅读
  8. 微信小程序如何使用天地图的逆地理编码api

    2024-01-07 22:14:02       38 阅读