Java linux SSH 免密(公钥)连接 并多服务器进行SCP

java调用SCP从文件远程服务器复制到本地 一. 依赖ganymed-ssh2-build210.jar 二.代码 下面是复制整个目录中文件的代码,(也可以复制单个或指定后缀名的文件,需要改动) package zexcel; import java.io.IOException; import java.util.ArrayList; import java.util.Calendar; import java.util.Iterator... 阅读详情

参考博客地址:

Java 实现 SCP 携带密码拷贝文件 - 龙凌云端 - 博客园、

java免密连接SSH_寂寞的博客-优快云博客

背景:项目中需要多台服务器之间进行文件传输,起初,使用的是密码认证的方式,但是服务器的密码会每三个月强制修改一次,这会影响到文件的正常传输,所以后面考虑使用ssh 公钥的认证方式

1、linux 不同服务器scp免密远程传输文件实例 ssh 免密登录 配置

本步骤参考本人博客:linux 不同服务器scp免密远程传输文件实例 ssh 免密登录_chen_lay的博客-优快云博客

2、java 实现 ssh scp 免密(公钥)多服务器间的文件传输

a、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>

b、具体的工具类

import org.apache.sshd.client.SshClient;
import org.apache.sshd.client.keyverifier.DefaultKnownHostsServerKeyVerifier;
import org.apache.sshd.client.keyverifier.KnownHostsServerKeyVerifier;
import org.apache.sshd.client.keyverifier.ServerKeyVerifier;
import org.apache.sshd.client.session.ClientSession;
import org.apache.sshd.scp.client.ScpClient;
import org.apache.sshd.scp.client.ScpClientCreator;

import java.io.*;
import java.net.SocketAddress;
import java.nio.file.Files;
import java.nio.file.InvalidPathException;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.PublicKey;

public class ScpClientUtil {
    private static String host = "10.186.83.100";
    private static String username = "username";
    private static String password = "password";
    private static Integer port = 22;

    private static String local = "/home/mg/data/customer_contract/";
    private static String remote = "/home/mg/data/customer_contract/";
    private static String idRsaPath = "/home/mg/.ssh/id_ras";

    public static void scpFile(String local, String remote, boolean strictHostKey) throws Exception {
        long startTime = System.currentTimeMillis();

        // 创建 SSH客户端
        SshClient client = SshClient.setUpDefaultClient();
        KnownHostsServerKeyVerifier verifier = new DefaultKnownHostsServerKeyVerifier(new ServerKeyVerifier() {
            @Override
            public boolean verifyServerKey(ClientSession clientSession, SocketAddress remoteAddress,
                                           PublicKey serverKey) {
                return !strictHostKey;
            }
        }, true);

        client.setServerKeyVerifier(verifier);
        // 启动 SSH客户端
        client.start();
        // 通过主机IP、端口和用户名,连接主机,获取Session
        ClientSession session = client.connect(username, host, port).verify().getSession();
        // 给Session添加密码
        // session.addPasswordIdentity(password);
        // publicKey方式认证
        session.addPublicKeyIdentity(getKeyPairFromString(readPemFile(new File(idRsaPath))));
        // 校验用户名和密码的有效性
        boolean isSuccess = session.auth().verify(10000L).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.download(remote, local);
            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 String readPemFile(File f) throws IOException {
        try (InputStream is = Files.newInputStream(f.toPath());
             DataInputStream dis = new DataInputStream(is)) {
            byte[] bytes = new byte[(int) f.length()];
            dis.readFully(bytes);
            return new String(bytes);
        } catch (InvalidPathException e) {
            throw new IOException(e);
        }
    }

    /**
     * 获取密钥对
     */
    static KeyPair getKeyPairFromString(String pk) throws IOException, NoSuchAlgorithmException {
        final KeyPairGenerator rsa = KeyPairGenerator.getInstance("RSA");
        final KeyPair keyPair = rsa.generateKeyPair();
        final ByteArrayOutputStream stream = new ByteArrayOutputStream();
        stream.write(pk.getBytes());
        final ObjectOutputStream o = new ObjectOutputStream(stream);
        o.writeObject(keyPair);
        return keyPair;
    }

    public static void main(String[] args) throws Exception {
        scpFile(local, remote, false);
    }
}

c、执行结果:

Connect host cost time: 3.533s.
Scp beginning.
Scp finished.
Total Cost time: 4.545s.
java 利用sshd-core 远程执行Linux shell命令 前面一篇文章写道利用jsch 包远程执行linux 命令,但是该包已经很久没有更新, 后期linux 的open-ssh 升级,可能部分协议不支持,发现mina-sshd 里面有一个还在维护的远程执行 linux shell 命令的包 代码demo 如下 import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.EnumSet; import java.util.Set; import java.u 阅读详情

相关推荐

用java代码实现两个linux服务器文件的互相拷贝,两台linux服务器之间免密scp,在A机器上向B远程拷贝文件...

两台linux服务器之间免密scp,在A机器上向B远程拷贝文件操作步骤:1、在A机器上,执行ssh-keygen -t rsa,一路按Enter,不需要输入任何内容。(如有提示是否覆盖,可输入y后按回车)2、到/root/.ssh/目录下,查看是否有id_rsa.pub文件生成3、将A机器生成的id_rsa.pub文件拷贝到B机器的/root/.ssh/下,并将id_rsa.pub改名为autho...

weixin_32008105的博客 1484

Java实现远程文件复制(基于SCP命令)

SCP是secure copy的简写,用于在Linux下进行远程拷贝文件的命令。它的主要优点是它可以在不泄露敏感信息的情况下在远程服务器计算机之间传输文件。它是基于SSH协议的,因此具有很强的安全性。

霁晨晨晨的博客 3万+

java scp实现方式

java scp实现方式

java实现ssh登录linux并执行命令的三种方法

Java 实现ssh连接远程服务器的方法

小李的专栏 1万+

ROS学习【11】-----基于ubuntu16.04上Gazebo机器人环境搭建的传感器仿真(camera、kinect、Lidar),并通过Rviz进行数据显示

ROS学习-----基于ubuntu16.04上Gazebo机器人环境搭建的传感器仿真目录一、Gazebo环境搭建前的准备1、将搭建模型下载到我们的gazebo环境下2、升级我们的gazebo版本二、创建配置launch文件参数的world文件1、进入工程包mbot_gazebo2、创建文件夹worlds3、进入该文件夹4、创建playground.world文件5、创建room.world文件三...

qq_42451251的博客 3610

计算机视觉——多视图几何

多视图几何1.前言1.1 多视图几何概念2. 基本原理2.1 对极几何2.2 基础矩阵2.2.1 基础矩阵推导2.2.2 求解基础矩阵3. 实验过程3.1 实验数据准备3.2 实验代码3.3 实验结果及分析4. 实验中遇到的问题 1.前言 1.1 多视图几何概念 多视图几何是利用在不同视点所拍摄图像间的关系,来研究照相机之间或者特征之间关系的一门科学。 多视图几何(Multiple View ...

RuiMa的博客 7715

Linux之ssh和scp(SSH and SCP in Linux)

SSH(Secure Shell)是一种网络协议,用于在两个网络设备之间建立加密的、安全的连接。它被广泛用于远程管理、文件传输、VPN(Virtual Private Network)和数据存储等领域。

Linux运维老纪的博客 1342

从Excel到Power Pivot:构建你的第一个商业智能分析模型

本文详细介绍了如何从Excel升级到Power Pivot,构建你的第一个商业智能分析模型。通过激活Power Pivot功能、导入数据、建立表关系、创建智能度量值以及打造交互式仪表盘,帮助用户高效处理百万行级别的数据,实现数据自动关联和动态分析,大幅提升商业决策效率。

weixin_30629653的博客 256

ssh-keygen(linux 命令) 创建 private key(私钥) , public key (公钥),实现ssh,scp,sftp命令无密码连接

通过,使用公钥 和私钥 , ServerA 无密码 访问 ServerB 。 原理说明: 可以把密钥 理解成一把钥匙, 公钥 理解成这把钥匙对应的锁头, 把锁头(公钥)放到想要控制的serverB上, 锁住serverB, 只有拥有钥匙(密钥)的人, 才能打开锁头, 进入serverB并控制,.................................

sun0322 4万+

如何创建 SAP ABAP CDS View 的 Association

所以本文我们虽然学习了如何创建 SAP CDS View 的 association,知道了 association 是用来在 CDS View 里将两张数据库表关联起来,但根本不知道怎么使用这个 association. 而且从 association 的写法来看,似乎和本教程之前介绍 inner join,left join 这些数据库表的连接操作没什么区别,都是根据两张表的 carrid 和 connid 字段相同进行的连接。只看到了我们在 CDS View 源代码实现里,放出来的四个字段。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 904

Agentic AI为教育行业赋能,提示工程架构师解析应用潜力

然而,即便是最先进的 LLMs,在面对复杂、动态、需要持续规划和调整的教育场景时,也常常显得力不从心,它们更像是强大的“问答机器”,而非真正意义上的“学习伙伴”或“教学助手”。在教育场景中,传统的 AI 工具可能只能回答学生提出的特定问题,或者根据预设的规则推送一些学习材料。无论您是教育技术领域的开发者、产品经理,还是一线的教育工作者、教育管理者,抑或是对 AI 教育应用充满好奇的研究者,本文都将为您提供宝贵的 insights,助您把握 Agentic AI 时代教育创新的脉搏。

架构师的AI之路,分享AI应用开发架构的学习与实践。 466

Linux 之间 scp免密传文件

A、B两台linux机器 A机器scp文件到B机器 A机器上: ssh-keygen -t rsa cat .ssh/id_rsa.pub 将内容追加到B机器上的.ssh/authorized_keys 里面

Knowledge Archiving and Sharing 2763

《电磁兼容设计》专栏说明

本专栏自2024年1月起开始更新,仅设此一个电磁兼容相关知识专栏,并将一直持续更新下去,无期限

linkking27的博客 792

Linux 命令scp & ssh免密登入

scp & ssh 集群模式下,各节点之间如何方便的拷贝文件? 命令格式: scp file 远程用户名@远程服务器IP:~/ (注意:冒号和目录之间不能有空格) 如果拷贝目录,需要加-r 选项。 使用root用户 eg: scp /etc/profile root@node2:/etc eg: scp -r /usr/jdk1.8 node2:/usr/java eg:scp ...

风逍遥-ygq 455

[QMT量化交易小白入门]-五十、十年基本保证每年盈利,全天ETF候稳稳的幸福

全局参数raise_rate = -1 # 触发rebalance的上涨比例period: 设定为22,表示每22个交易日执行一次调仓(即大约每月一次)。这是策略的时间框架基础。raise_rate: 初始值设为-1,意味着默认情况下不会因为资产的涨幅而触发调仓。这一参数用于控制是否基于资产表现动态调整仓位。run_count: 用于记录策略运行的次数,帮助判断何时执行定期调仓。1、为了简便计算,回撤时将调仓再平衡是先卖出再买入,没有比较持仓,实盘时是需要计算的,减少交易费用。

木头大左的博客 807

AIGC实战——多模态模型DALL.E 2

DALL.E 2 是 OpenAI 提出的一个大规模文本生成图像模型,可以根据文本提示生成各种风格的逼真图像。它通过将预训练模型 CLIP 与 GLIDE 中的扩散模型架构相结合完成任务。它还具有其他应用,例如通过文本提示编辑图像和提供给定图像的变体。虽然它也有一些局限性,例如不一致的文本渲染和属性绑定,但 DALL.E 2 是仍然一个非常强大的AI模型,推动了生成模型的发展。

盼小辉丶的博客 1万+

java 调用 scp 需要密码_Linux scp复制文件,不需要输入密码的技巧

当两台LINUX主机之间要互传文件时可使用SCP命令来实现,建立信任关系之后可不输入密码。 把你的本地主机用户的ssh公匙文件复制到远程主机用户的~/.ssh/authorized_keys文件中 假设本地主机linux100,远程主机linux200 一,在linux100主机里的用户 运行 #ssh-k当两台LINUX主机之间要互传文件时可使用SCP命令来实现,建立信任关系之后可不输入密码。把...

weixin_36240219的博客 341

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

linux服务之ssh(免密登录)和scp . rsync

一、scp文件传输命令 scp命令:实现远程文件传输(文件的上传与文件的下载) 但是在实际的工作环境中,我们经常需要Linux操作系统与Linux操作系统之间实现文件的传输。这个功能主要就是通过scp命令来实现的。 scp实现文件上传 :# scp [选项] 本地文件路径 远程服务器的用户名@远程服务器的IP地址:远程文件的存储路径 -r:递归,针对文件夹 scp实现文件下载 基本语法:# scp [选项] 远程服务器的用户名@远程服务器的IP地址:远程文件的地址 本地文件存储路径 -r:递归针对文件夹 注

luozyzyzy的博客 443

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

linux指令scp需要密码吗,linux下 scp命令不需要输入用户密码

linux下 scp命令不需要输入用户密码在两台机器的两个用户之间建立安全的信任关系后,可实现执行scp命令时不需要输入用户密码。1. 在机器Client上root用户执行ssh-keygen命令,生成建立安全信任关系的证书。[root@Client root]# ssh-keygen -b 1024 -t rsaGenerating public/private rsa key pair.Ent...

weixin_29863401的博客 2786

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

ganymed ssh-2 for java,用于java连接问题的Ganymed SSH(Ganymed SSH for java connect issue)

用于java连接问题的Ganymed SSH(Ganymed SSH for java connect issue)我们正在使用Ganymed-SSH库并在与另一台机器进行SSH时遇到此错误。[root@XXXX test]# java -classpath .:ganymed-ssh2-build210.jar BasicERROR:java.io.IOException: There was ...

weixin_32185607的博客 1026

java的ssh获取id,使用SSH公钥(id_dsa.pub)实现免密码登录

首先,在本地机器上产生公钥:Java代码[root@localhost .ssh]# ssh-keygen -d 一直按回车键Generating public/private dsa key pair.Enter file in which to save the key (/root/.ssh/id_dsa):/root/.ssh/id_dsa already exist...

weixin_39966922的博客 565

使用ssh远程登陆linux

SSH是linux中,远程登录会话的一种安全协议 linux服务器上,一般都已经集成了ssh的服务端软件,并自启; 如果需要在linux上用ssh客户端去登录别的linux服务器,则需要安装ssh的客户端, 我的linux安装了openssh-client,所以在这里就不安装了,如果你的系统没有安装的话 yum -y install openssh-clients.x86_64 (-y 自动选择...

weixin_43683017的博客 450

【Linux进阶篇】SSH密钥认证保姆级实操:告别密码登录,远程连接更安全高效

SSH密钥认证与远程文件传输指南 本文详解SSH密钥认证原理与实操,帮助用户实现安全高效的服务器远程连接与文件传输。 核心内容 SSH加密机制 对称加密:单密钥加密,速度快但密钥传输风险高。 非对称加密:公钥加密、私钥解密,安全性更高,SSH密钥认证基于此实现。 免密登录配置 客户端通过ssh-keygen生成密钥对,公钥通过ssh-copy-id上传至服务器,实现免密登录。 文件传输工具 scp:简单直接,适合少量文件传输。 rsync:支持增量同步与断点续传,适合大文件或定期同步场景。 关键词:SSH密

m0_58782205的博客 1532

Windows SSH连接Linux服务器:从工具选型到密钥配置与排错全指南

SSH(Secure Shell)是一种网络协议,用于在不安全的网络中建立加密通道,实现安全的远程登录、命令执行和文件传输。其核心原理基于非对称加密和密钥交换,确保通信的机密性与完整性。在工程实践中,SSH是连接和管理远程Linux服务器的标准方式,广泛应用于运维、开发和系统管理场景。在Windows环境下,由于缺乏原生SSH客户端支持,开发者常面临工具选型、环境适配和连接故障等挑战。本文聚焦于**SSH密钥认证**和**VSCode Remote-SSH**两大核心实践,系统梳理了从客户端工具选择、密钥对

weixin_34220179的博客 386

java ssh linux 文件_Linux SSH免密码登录与拷贝文件(SCP)

在工作当中经常会登录远程服务器安装软件、部署应用或者拷贝文件到远程服务器上,都会提示输入密码才能完成相关的操作。工作中如果要频繁登录服务器和拷贝文件的情况下,经常输入密码难免会觉得麻烦,且效率低下。而且在持续集成的场景下,自动部署应用时是没有人工干预的,这种情况如果要输入密码才能拷贝文件至远程服务器,就不能实现自动部署的功能了。下面以A服务器与B服务器双向实现免密码登录和拷贝文件为例,介绍相关的配...

weixin_40001309的博客 273

linux通过ssh登录其他服务器,不用输入密码

由于使用java ganymed-ssh2.jar来操作集群中的节点服务器,ssh -tt userName@ip,遇到要输入密码,ganymed-ssh2没找到输入密码的方法,所以只能从ssh服务器解决。 其实方法很简单,就是通过配置ssh来达到不用输入密码。 下面来说说方法: 假设有A(ip:192.168.52.1)、B(ip:192.168.52.2)两台服务器,都是Linux系统,...

fengbin2005的专栏 1972
上一篇: linux 编译java文件 执行class文件
下一篇: No operations allowed after connection closed数据库连接关闭后不允许操作 HikariDataSource 数据库连接池相关配置
chen_lay
博客等级 码龄12年 44粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值