• Java 实现 SCP 携带密码拷贝文件


    Java 实现 SCP 携带密码拷贝文件


    背景说明

    涉及通过程序进行机器间的文件Copy的场景,我们一般会使用ssh连接机器,通过scp命令进行文件copy。

    此种方案的前提是:机器间事先要配置免密码互通

    但是,如果客户现场机器数量过多,配置免密操作比较麻烦;或者处于安全考虑,客户不允许机器之间免密访问

    此时,需要另辟蹊径,找其他方案实现。

    需求场景:提供机器的IP,登录用户名、登录密码,但是不配置机器间的免密登录,实现机器之间的文件传输。


    Java 实现

    1、工具类

    ScpUtil.java

    package com.miracle.luna.scp;
    
    import org.apache.sshd.client.SshClient;
    import org.apache.sshd.client.session.ClientSession;
    import org.apache.sshd.scp.client.ScpClient;
    import org.apache.sshd.scp.client.ScpClientCreator;
    
    /**
     * @author Miracle Luna
     * @date 2021/7/19
     */
    public class ScpUtil {
    
    //    private static String host = "192.168.67.48";
        private static String host = "192.168.67.39";
    //    private static String host = "192.168.71.29";
        private static String username = "root";
        private static String password = "password";
        private static Integer port = 22;
    
    //    private static String local = "F:\miracle\*";
        private static String local = "/home/miracle/*";
        private static String remote = "/home/luna/";
    //    private static String remote = "F:\luna\";
    
        public static void scpFile(String local, String remote) throws Exception {
            long startTime = System.currentTimeMillis();
    
            // 创建 SSH客户端
            SshClient client = SshClient.setUpDefaultClient();
            // 启动 SSH客户端
            client.start();
            // 通过主机IP、端口和用户名,连接主机,获取Session
            ClientSession session = client.connect(username, host, port).verify().getSession();
            // 给Session添加密码
            session.addPasswordIdentity(password);
            // 校验用户名和密码的有效性
            boolean isSuccess = session.auth().verify().isSuccess();
    
            // 认证成功
            if (isSuccess) {
                long middleTime = System.currentTimeMillis();
                System.out.println("Connect host cost time: " + (middleTime - startTime) / 1000.0 + "s.");
    
                ScpClientCreator creator = ScpClientCreator.instance();
                // 创建 SCP 客户端
                ScpClient scpClient = creator.createScpClient(session);
    
                System.out.println("Scp beginning.");
                // ScpClient.Option.Recursive:递归copy,可以将子文件夹和子文件遍历copy
                scpClient.upload(local, remote, ScpClient.Option.Recursive);
                System.out.println("Scp finished.");
    
                // 释放 SCP客户端
                if (scpClient != null) {
                    scpClient = null;
                }
    
                // 关闭 Session
                if (session != null && session.isOpen()) {
                    session.close();
                }
    
                // 关闭 SSH客户端
                if (client != null && client.isOpen()) {
                    client.stop();
                    client.close();
                }
            }
    
            long endTime = System.currentTimeMillis();
            System.out.println("Total Cost time: " + (endTime - startTime) / 1000.0 + "s.");
        }
    
        public static void main(String[] args) throws Exception {
            scpFile(local, remote);
        }
    }

    2、运行结果

    Connect host cost time: 6.519s.
    Scp beginning.
    Scp finished.
    Total Cost time: 9.569s.

    3、Maven依赖

    <!-- https://mvnrepository.com/artifact/org.apache.sshd/sshd-common -->
    <dependency>
        <groupId>org.apache.sshd</groupId>
        <artifactId>sshd-common</artifactId>
        <version>2.7.0</version>
    </dependency>
    
    <!-- https://mvnrepository.com/artifact/org.apache.sshd/sshd-core -->
    <dependency>
        <groupId>org.apache.sshd</groupId>
        <artifactId>sshd-core</artifactId>
        <version>2.7.0</version>
    </dependency>
    
    <!-- https://mvnrepository.com/artifact/org.apache.sshd/sshd-scp -->
    <dependency>
        <groupId>org.apache.sshd</groupId>
        <artifactId>sshd-scp</artifactId>
        <version>2.7.0</version>
    </dependency>

    补充说明

    该方式适用于Linux到Linux、Linux到Windows、Windows到Linux、Windows到Windows间的文件拷贝。

    (和Windows进行文件交互的前提是:Windows安装了SSH服务端,如OpenSSH,FreeSSHd,Bitvise SSH Server等)

  • 相关阅读:
    1202诗人基本介绍&诗人画像
    1205人物关系优化&诗人轨迹
    把SQL Server 2000 表中的自动编号Id重新开始排列
    一个一直都不明白的东西今天知道了。关于sqlserver2000自动执行。
    服装打版界的扛把子ET自定义操作
    手把手教你搭建集中式版本控制系统SVN服务器
    分享一次实用的爬虫经验
    盘点CSV文件在Excel中打开后乱码问题的两种处理方法
    盘点服装设计所经常性使用的软件ET(下篇)
    sql 每个企业选择一条产品
  • 原文地址:https://www.cnblogs.com/miracle-luna/p/15037782.html
Copyright © 2020-2023  润新知