当前位置: 首页 > 工具软件 > JSch > 使用案例 >

Jsch

朱炳
2023-12-01

                                       Jsch


一、什么是Jsch


       Jsch 是SSH2的一个纯Java实现。它允许你连接到一个sshd 服务器,使用端口转发,X11转发,文件传输等等。你可以将它的功能集成到你自己的 程序中。
 

二、 实现原理

        1. 根据远程主机的IP地址,用户名和端口,建立会话(Session);

        2. 设置用户信息(包括密码和Userinfo),然后连接session;
            getSession()只是创建一个session,需要设置必要的认证信息之后,调用connect()才能建立连接。

        3. 在session上建立指定类型的通道(Channel);

        4. 设置channel上需要远程执行的Shell脚本,连接channel,就可以远程执行该Shell脚本;
            调用openChannel(String type) 可以在session上打开指定类型的channel。该channel只是被初始化,使用前需要先调用                connect()进行连接。

        5. 可以读取远程执行Shell脚本的输出,然后依次断开channel和session的连接;

 

三、Channel的类型可以为如下类型:

1)shell - ChannelShell 

2)exec - ChannelExec 

3)direct-tcpip - ChannelDirectTCPIP 

4)sftp - ChannelSftp 

5)subsystem - ChannelSubsystem


四、上传和下载文件实例​

相关依赖:

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


SFTPClient.Java

import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.Properties;

public class SFTPClient {

    private static final Logger LOGGER = LoggerFactory.getLogger(SFTPClient.class);

    private String host;
    private int port;
    private String username;
    private String password;
    private static int SESSION_TIMEOUT = 30000;
    private static int CHANNEL_TIMEOUT = 3000;

    private ChannelSftp sftp;

    public String getHost() {
        return host;
    }

    public void setHost(String host) {
        this.host = host;
    }

    public int getPort() {
        return port;
    }

    public void setPort(int port) {
        this.port = port;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public SFTPClient() {}

    public SFTPClient(String host, int port, String username, String password) {
        this.host = host;
        this.port = port;
        this.username = username;
        this.password = password;
    }

    /**
     * 连接sftp服务器
     * @param host      主机
     * @param port      端口
     * @param username  用户名
     * @param password  密码
     */
    public boolean connect(String host, int port, String username, String password) {
        try {
            JSch jsch = new JSch();
            Session sshSession = jsch.getSession(username, host, port);
            sshSession.setPassword(password);
            Properties sshConfig = new Properties();
            sshConfig.put("StrictHostKeyChecking", "no");  // 跳过检测
            sshSession.setConfig(sshConfig);
            sshSession.connect();
            //sshSession.connetc(SESSION_TIMEOUT);
            LOGGER.info("SFTPClient SFTP Session connected.");
            Channel channel = sshSession.openChannel("sftp");
            channel.connect();
            //channel.connect(CHANNEL_TIMEOUT); 
            this.sftp = (ChannelSftp) channel;
            LOGGER.info("SFTPClient Connected to " + host);
            return true;
        } catch (Exception e) {
            LOGGER.error("SFTPClient Connect failed, {}", e.getMessage());
            return false;
        }
    }

    /**
     * 上传文件
     * @param directory     上传的目录
     * @param fileName      上传的文件名
     * @param uploadFile    要上传的文件
     */
    public boolean upload(String directory, String fileName, File uploadFile) {
        try {
            sftp.cd(directory);
            FileInputStream fileInputStream = new FileInputStream(uploadFile);
            sftp.put(fileInputStream, fileName);
            fileInputStream.close();
            return true;
        } catch (Exception e) {
            LOGGER.error("SFTPClient upload file failed, {}", e.getMessage(), e);
            return false;
        }
    }

    /**
     * 下载文件
     * @param directory     下载目录
     * @param fileName      下载的文件名
     * @param saveFile      存在本地的路径
     */
    public File download(String directory, String fileName, String saveFile) {
        try {
            sftp.cd(directory);
            File file = new File(saveFile);
            if (file.exists()) {
                file.delete();
            }
            FileOutputStream fileOutputStream = new FileOutputStream(file);
            sftp.get(fileName, fileOutputStream);
            fileOutputStream.close();
            return file;
        } catch (Exception e) {
            LOGGER.error("SFTPClient download file failed, {}", e.getMessage(), e);
            return null;
        }
    }

    /**
     * 断开连接
     */
    public void disconnect() {
        try {
            sftp.getSession().disconnect();
        } catch (JSchException e) {
            LOGGER.error("SFTPClient disconnect error, {}", e.getMessage(), e);
        }
        sftp.quit();
        sftp.disconnect();
    }

}


更多资料请参考官网api

 

 类似资料: