JSch库入门实战应用,推荐大家学习

发布时间 2023-06-30 14:18:30作者: 子墨老师

JSch是一个用于在Java平台上实现SSH连接的库。它提供了一个Java实现的SSH2协议客户端,可以用于在Java应用程序中进行SSH连接、文件传输和远程命令执行等操作。

JSch库提供了以下关键功能:

1. SSH连接:JSch允许建立到SSH服务器的安全连接。它支持密码认证、公钥认证和密钥交换等多种身份验证方法。

2. 文件传输:JSch可以执行SCP(Secure Copy)和SFTP(SSH File Transfer Protocol)协议,用于在本地计算机和远程服务器之间进行文件传输。通过JSch,可以上传、下载或管理远程服务器上的文件。

3. 远程命令执行:JSch允许在远程服务器上执行命令。你可以使用JSch打开一个远程Shell会话,并执行命令,获取输出或处理错误。

JSch库的使用相对简单,通过创建一个`Session`对象,设置身份验证和连接参数,然后使用`Channel`进行文件传输或执行远程命令。

以下是使用JSch库的一些常见操作:
- 建立SSH会话:使用`Session`类建立到远程服务器的安全连接。
- 传输文件:通过`ChannelSftp`类执行SCP或SFTP协议进行文件传输。
- 执行远程命令:通过`ChannelExec`类在远程Shell会话中执行命令。

除了上述功能,JSch还提供了其他一些选项,如端口转发和SSH代理等。

需要注意的是,使用JSch时需要考虑安全性,并在处理密码、密钥和敏感数据时采取适当的措施。

总之,JSch是一个强大且灵活的SSH连接库,使得在Java应用程序中实现SSH功能变得相对容易。它为开发者提供了无缝访问和操作远程服务器的能力,使得远程服务器管理、文件传输和远程命令执行等操作更加便捷。

入门案例:exec用于执行命令;sftp用于文件处理

package com.wyg.simple;

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.util.Properties;
import java.util.Vector;

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;

public class JSchUtils {
    private static JSch jsch;
    private static Session session;

    /**
     * 连接到指定的IP
     *
     * @throws JSchException
     */
    public static void connect(String user, String passwd, String host, int port) throws JSchException {
        jsch = new JSch();// 创建JSch对象
        session = jsch.getSession(user, host, port);// 根据用户名、主机ip、端口号获取一个Session对象
        session.setPassword(passwd);// 设置密码

        Properties config = new Properties();
        config.put("StrictHostKeyChecking", "no");
        session.setConfig(config);// 为Session对象设置properties
        session.setTimeout(1500);// 设置超时
        session.connect();// 通过Session建立连接
    }

    /**
     * 关闭连接
     */
    public static void close() {
        session.disconnect();
    }

    /**
     * 执行相关的命令
     *
     * @throws JSchException
     */
    public static void execCmd(String command) throws JSchException {
        BufferedReader reader = null;
        Channel channel = 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) {
                    System.out.println(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 void upload(String directory, String uploadFile) throws JSchException, FileNotFoundException, SftpException {
        ChannelSftp channelSftp = (ChannelSftp) session.openChannel("sftp");
        channelSftp.cd(directory);
        File file = new File(uploadFile);
        channelSftp.put(new FileInputStream(file), file.getName());
        System.out.println("Upload Success!");
    }

    /**
     * 下载文件
     *
     * @param src
     * @param dst
     * @throws JSchException
     * @throws SftpException
     */
    public static void download(String src, String dst) throws JSchException, SftpException {
        // src linux服务器文件地址,dst 本地存放地址
        ChannelSftp channelSftp = (ChannelSftp) session.openChannel("sftp");
        channelSftp.connect();
        channelSftp.get(src, dst);
        channelSftp.quit();
    }

    /**
     * 删除文件
     *
     * @param directory
     *            要删除文件所在目录
     * @param deleteFile
     *            要删除的文件
     * @param sftp
     * @throws SftpException
     * @throws JSchException
     */
    public void delete(String directory, String deleteFile) throws SftpException, JSchException {
        ChannelSftp channelSftp = (ChannelSftp) session.openChannel("sftp");
        channelSftp.cd(directory);
        channelSftp.rm(deleteFile);
    }

    /**
     * 列出目录下的文件
     *
     * @param directory
     *            要列出的目录
     * @param sftp
     * @return
     * @throws SftpException
     * @throws JSchException
     */
    @SuppressWarnings("rawtypes")
    public Vector listFiles(String directory) throws JSchException, SftpException {
        ChannelSftp channelSftp = (ChannelSftp) session.openChannel("sftp");
        return channelSftp.ls(directory);
    }

    public static void main(String[] args) {
        try {
            // 1.连接到指定的服务器
            connect("root", "sankairoot", "10.0.0.251", 22);

            // 2.执行相关的命令
            execCmd("grep '160622150549943666' /data/apps/nginx/logs/access_2016-07-07.log >> /data/nginx_log.20160707.txt");

            // 3.下载文件
            download("/data/nginx_log.20160707.txt", "D:\\temp");

            // 4.关闭连接
            close();
        } catch (JSchException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SftpException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}