当前位置: 首页 > news >正文

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、端口和用户名,连接主机,获取SessionClientSession 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,可以将子文件夹和子文件遍历copyscpClient.upload(local, remote, ScpClient.Option.Recursive);System.out.println("Scp finished.");// 释放 SCP客户端if (scpClient != null) {scpClient = null;}// 关闭 Sessionif (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等)


http://www.lryc.cn/news/111136.html

相关文章:

  • Flink CEP(三)pattern动态更新
  • 抽象工厂模式(C++)
  • 程序员面试金典17.*
  • 【瑞吉外卖项目复写】基本部分复写笔记
  • 用html+javascript打造公文一键排版系统15:一键删除所有空格
  • 苍穹外卖day12(完结撒花)——工作台+Spring_Apche_POI+导出运营数据Excel报表
  • SQL与NoSQL概念(详细介绍!!)
  • node debian 镜像 new Date 获取时间少 8 小时问题
  • 【N32L40X】学习笔记13-软件IIC读写EEPROM AT24C02
  • JVM 调优
  • DP-GAN剩余代码
  • 在word的文本框内使用Endnote引用文献,如何保证引文编号按照上下文排序
  • SpringBoot项目上传至服务器
  • C++中实现多线程的三种方式
  • 程序员副业指南:怎样实现年入10w+的目标?
  • excel 计算 分位值
  • mongodb-windows-x86_64-4.4.23-signed.msi
  • 一个SpringBoot 项目能处理多少请求?
  • Shell编程基础(十)读取多行文本到数组 写入多行文本到文件
  • MyBatis学习笔记2
  • spring总结
  • 记录--说一说css的font-size: 0
  • Matlab实现支持向量机算法(附上多个完整仿真源码)
  • AIGC大模型ChatGLM2-6B:国产版chatgpt本地部署及体验
  • [国产MCU]-BL602开发实例-开发环境搭建
  • 春秋云镜 CVE-2020-26048
  • 使用Golang实现一套流程可配置,适用于广告、推荐系统的业务性框架——简单应用
  • 一个.NET开发的Web版Redis管理工具
  • javaAPI(四):jdk8中的日期时间API
  • 解决在mybatis中出现的org.apache.ibatis.exceptions.PersistenceException~