`
海浪儿
  • 浏览: 274305 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

SFTP信任公钥配置及JSCH库

阅读更多

1、SFTP信用公钥配置

1.1 客户端生成密钥对

以DSA举例: 

ssh-keygen –t dsa

执行该命令后,在home/用户名/.ssh目录下,会生成id_dsa和id_dsa.pub两个文件

1.2 将id_dsa.pub公钥文件上传至服务端的home/用户名/.ssh目录下

scp id_dsa.pub 用户名@服务端IP:/home/用户名/.ssh

此时还需要输入密码

1.3服务端添加信任公钥

登录服务端,进入到/home/用户名/.ssh目录,将刚刚拷贝的id_dsa.pub文件的内容加入到authorized_keys文件中

cat id_dsa.pub >> authorized_keys

1.4 服务端分别修改authorized_key文件和.ssh的权限为600700

chmod 600 authorized_keys

chmod 700 .ssh

1.5 测试

在客户端执行:

sftp –oPort=端口 用户名@服务端IP

如果不需要输入密码就可以连上,则说明配置成功

 

2、基于JSCH库的sftp操作

public class SftpUtil {
    private final static Logger          log       = LoggerFactory.getLogger(SftpUtil.class);

    /** SFTP */
    public static final String           SFTP      = "sftp";
    /** 通道 */
    private ChannelSftp                  channel;
    /** session */
    private Session                      session;

    /** 规避多线程并发 */
    private static ThreadLocal<SftpUtil> sftpLocal = new ThreadLocal<SftpUtil>();

    /**
     * 获取sftpchannel
     * 
     * @param connectConfig 连接配置
     * @return
     * @throws Exception 
     * @throws JSchException
     */
    private void init(ConnectConfig connectConfig) throws Exception {
        String host = connectConfig.getHost();
        int port = connectConfig.getPort();

        String userName = connectConfig.getUserName();

        //创建JSch对象
        JSch jsch = new JSch();

        //添加私钥(信任登录方式)
        if (StringUtils.isNotBlank(connectConfig.getPrivateKey())) {
            jsch.addIdentity(connectConfig.getPrivateKey());
        }

        session = jsch.getSession(userName, host, port);
        if (log.isInfoEnabled()) {
            log.info(" JSCH Session created,sftpHost = {}, sftpUserName={}", host, userName);
        }

        //设置密码
        if (StringUtils.isNotBlank(connectConfig.getPassWord())) {
            session.setPassword(connectConfig.getPassWord());
        }

        Properties config = new Properties();
        config.put("StrictHostKeyChecking", "no");
        session.setConfig(config);
        //设置超时
        session.setTimeout(connectConfig.getTimeout());
        //建立连接
        session.connect();
        if (log.isInfoEnabled()) {
            log.info("JSCH Session connected.sftpHost = {}, sftpUserName={}", host, userName);
        }

        //打开SFTP通道
        channel = (ChannelSftp) session.openChannel(SFTP);
        //建立SFTP通道的连接
        channel.connect();
        if (log.isInfoEnabled()) {
            log.info("Connected successfully to sftpHost = {}, sftpUserName={}", host, userName);
        }
    }

    /**
     * 是否已连接
     * 
     * @return
     */
    private boolean isConnected() {
        return null != channel && channel.isConnected();
    }

    /**
     * 获取本地线程存储的sftp客户端
     * 
     * @return
     * @throws Exception 
     */
    public static SftpUtil getSftpUtil(ConnectConfig connectConfig) throws Exception {
        SftpUtil sftpUtil = sftpLocal.get();
        if (null == sftpUtil || !sftpUtil.isConnected()) {
            sftpLocal.set(new SftpUtil(connectConfig));
        }
        return sftpLocal.get();
    }

    /**
     * 释放本地线程存储的sftp客户端
     */
    public static void release() {
        if (null != sftpLocal.get()) {
            sftpLocal.get().closeChannel();
            sftpLocal.set(null);
        }
    }

    /**
     * 构造函数
     * <p>
     * 非线程安全,故权限为私有
     * </p>
     * 
     * @throws Exception 
     */
    private SftpUtil(ConnectConfig connectConfig) throws Exception {
        super();
        init(connectConfig);
    }

    /**
     * 关闭通道
     * 
     * @throws Exception
     */
    public void closeChannel() {
        if (null != channel) {
            try {
                channel.disconnect();
            } catch (Exception e) {
                log.error("关闭SFTP通道发生异常:", e);
            }
        }
        if (null != session) {
            try {
                session.disconnect();
            } catch (Exception e) {
                log.error("SFTP关闭 session异常:", e);
            }
        }
    }

    /**
     * 下载文件
     * 
     * @param downDir 下载目录
     * @param src 源文件
     * @param dst 保存后的文件名称或目录
     * @throws Exception
     */
    public void downFile(String downDir, String src, String dst) throws Exception {
        channel.cd(downDir);
        channel.get(src, dst);
    }

    /**
     * 删除文件
     * 
     * @param filePath 文件全路径
     * @throws SftpException
     */
    public void deleteFile(String filePath) throws SftpException {
        channel.rm(filePath);
    }

    @SuppressWarnings("unchecked")
    public List<String> listFiles(String dir) throws SftpException {
        Vector<LsEntry> files = channel.ls(dir);
        if (null != files) {
            List<String> fileNames = new ArrayList<String>();
            Iterator<LsEntry> iter = files.iterator();
            while (iter.hasNext()) {
                String fileName = iter.next().getFilename();
                if (StringUtils.equals(".", fileName) || StringUtils.equals("..", fileName)) {
                    continue;
                }
                fileNames.add(fileName);
            }
            return fileNames;
        }
        return null;
    }
}

 说明:

2.1 ConnectConfig包含了建立sftp连接所需要的全部参数信息

2.2 如果按照第一步进行了sftp的信任公钥配置,则需要通过调用jsch的addIdentity方法将密钥对中的私钥id_dsa设置进去
//添加私钥(信任登录方式)
        if (StringUtils.isNotBlank(connectConfig.getPrivateKey())) {
            jsch.addIdentity(connectConfig.getPrivateKey());
        }
2.3 为了避免频繁的进行连接建立和连接释放操作,一般会定义为单例模式,但存在某些业务场景,需要在同一个线程执行完连续几次完整的业务操作后,将连接释放掉。如果采用单例,那么多线程并发的场景下会出现共享资源竞争导致的并发问题,譬如在B线程执行业务的过程中,A线程将连接释放。因此,可以借助ThreadLocal来避免该问题。
/**
     * 获取本地线程存储的sftp客户端
     * 
     * @return
     * @throws Exception 
     */
    public static SftpUtil getSftpUtil(ConnectConfig connectConfig) throws Exception {
        SftpUtil sftpUtil = sftpLocal.get();
        if (null == sftpUtil || !sftpUtil.isConnected()) {
            sftpLocal.set(new SftpUtil(connectConfig));
        }
        return sftpLocal.get();
    }

    /**
     * 释放本地线程存储的sftp客户端
     */
    public static void release() {
        if (null != sftpLocal.get()) {
            sftpLocal.get().closeChannel();
            sftpLocal.set(null);
        }
    }
分享到:
评论

相关推荐

    详解Java使用Jsch与sftp服务器实现ssh免密登录

    4. 在Java中,通过JSch库连接到SFTP服务器时,需要先建立一个JSch对象,然后创建一个Session(会话),并设置Session的配置属性。 5. 接着通过Session对象获取一个Channel(通道),并打开SFTP通道。此时可以利用...

    java版SFTP实现示例(使用jsch)

    在Java中,我们通常会使用第三方库如JSch来实现SFTP功能。 JSch(Java Secure Channel)是一个开源Java库,它允许开发者执行SSH2协议,包括SFTP。通过JSch,我们可以实现连接到远程服务器,创建、上传、下载、删除...

    JSCH免费下载啦

    JSCH(Java Secure Channel)是一个开源的Java库,它允许开发者在Java应用程序中实现SSH(Secure Shell)协议,从而支持SFTP(Secure File Transfer Protocol)。JSCH库提供了对SSH2协议的强大支持,使得用户可以...

    jsch-0.1.42.jar及用java实现SFTP的例子

    在本文中,我们将深入探讨JSch库的核心功能,以及如何使用它来实现SFTP(Secure File Transfer Protocol)。 **SSH协议基础** SSH是一种网络协议,用于加密网络通信,确保数据在传输过程中的安全性。它常用于远程...

    jsch-0.1.55,包含jar和source

    在描述中提到,JSch库可以用于SFTP(Secure File Transfer Protocol)操作。SFTP是一种基于SSH2的安全文件传输协议,它提供了在不安全网络上安全传输文件的能力,包括上传、下载和管理远程文件。通过JSch,开发者...

    com.jcraft.jsch_0.1.31.jar和commons-net-3.2.jar

    JSch库提供了对SSH2协议的完全支持,允许Java开发者在应用程序中实现SSH连接功能。这个版本号0.1.31表明它是该库的一个特定发行版,可能包含了一些修复和改进。JSch库的主要特性包括: 1. **连接和身份验证**:支持...

    jsch.jar及实现代码 SftpUtil.java java使用sftp实现上传下载文件

    在这个场景中,我们将详细讨论如何使用`jsch.jar`库以及提供的`SftpUtil.java`工具类来实现在Java中执行SFTP任务。 首先,`jsch.jar`是Java Secure Channel的缩写,这是一个由JCraft公司开发的开源项目。它提供了对...

    jsch0.1.54

    描述中提到的问题,可能涉及到旧版本JSch库的性能问题,特别是在SFTP(Secure File Transfer Protocol)文件传输方面。SFTP是基于SSH2的安全文件传输子协议,它提供了在不安全网络上安全传输文件的能力。旧版本的...

    jsch实现远程传输

    在本文中,我们将深入探讨JSch库的工作原理、如何配置以及如何使用JSch实现SFTP(Secure File Transfer Protocol)文件传输。 ### JSch库介绍 JSch库提供了全面的SSH2功能,包括公钥认证、密码认证、键盘交互式...

    jsch-0.1.54.zip

    1. **连接建立**:JSch库允许Java应用创建到SSH服务器的连接,进行身份验证,包括基于密码、公钥/私钥对的认证方式。 2. **端口转发**:JSch支持本地和远程端口转发,可以将本地端口上的数据通过SSH隧道转发到远程...

    jsch的jar包

    要使用这个库,开发者需要将"jsch.jar"添加到项目的类路径中,并按照JSCH的API文档编写相应的代码来实现SFTP操作。 总结来说,JSCH是Java平台上的一个强大工具,它使开发人员能够方便地集成SSH2协议,尤其是实现...

    jsch-0.1.54

    **JSCH库详解** JSCH(Java Secure Channel)是一个用Java实现的SSH2库,它允许Java应用程序连接到支持SSH协议的服务器,进行安全的网络通信。版本号"jsch-0.1.54"表示这是一个较新的稳定版本,包含了一些bug修复和...

    java使用JSCH实现SFTP文件管理

    Java使用JSCH库实现SFTP文件管理是一种常见的远程文件传输方式,特别适用于需要与服务器进行交互,例如上传、下载文件的场景。JSCH(Java Secure Channel)是一个纯Java实现的SSH2库,允许用户通过SSH协议连接到远程...

    jsch.jar.zip

    `jsch.jar`是Java实现SFTP的一个强大库,它由JCraft公司提供,支持SSH2协议,允许Java程序安全地执行SFTP操作。 **JSch库的使用** JSch库的核心类是`com.jcraft.jsch.Session`,它是所有SSH连接的基础。创建一个`...

    用java写的SFTP代码.rar

    JCraft的JSch库是Java中广泛使用的SFTP实现库,它提供了SSH2协议的完整实现,包括SFTP。因此,你需要先下载并引入JSch库到你的项目中。 1. 引入JSch库: 在Maven项目中,可以在pom.xml文件中添加以下依赖: ```...

    sftp下载所需jar工具包

    1. **建立SSH连接**:JSch库可以创建到远程服务器的安全连接,使用公钥认证、密码认证或密钥对认证等不同方式进行身份验证。 2. **SFTP会话**:一旦建立了SSH连接,就可以开启一个SFTP会话,通过这个会话,你可以...

    sftp 源代码及例子

    在"jsch-0.1.40"这个压缩包中,包含的是JSch库的源码,这是一个Java实现的SSH2库,支持SFTP、SCP以及命令行会话。JSch库使得Java应用程序能够方便地与远程服务器进行安全通信。 JSch库的主要功能包括: 1. **连接...

    jsch-0.1.53.zip

    JavaScript SSH (JSch) 是一个Java库,它允许开发者在Java应用程序中实现Secure File Transfer Protocol (SFTP)、Secure Copy (SCP) 和 SSH2 (Secure Shell) 的功能。`jsch-0.1.53.zip` 包含的是JSch库的0.1.53版本...

    JSCH0.1.46

    JSCH(Java Simple Connection Handler)是一个Java库,用于在客户端应用程序和远程服务器之间建立SSH(Secure Shell)连接。版本0.1.46是JSCH的最新版,它提供了丰富的功能,使开发者能够通过SSH协议在Java应用中...

    jsch-0.1.53.jar实现SFTP上传下载删除

    在本案例中,我们将关注如何利用JSch库来实现SFTP文件的上传、下载和删除功能。 **SFTP基础** SFTP是基于SSH协议的文件传输协议,它提供了安全的数据传输,确保了文件传输过程中的数据完整性。与FTP不同,SFTP在...

Global site tag (gtag.js) - Google Analytics