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万+

Stata实战入门:从数据导入到基础分析的全流程指南

本文提供了Stata实战入门的全流程指南,从数据导入、清洗到基础分析和可视化,帮助初学者快速掌握Stata的核心功能。通过详细的步骤和实用技巧,读者可以高效完成数据处理、变量操作、描述性统计和回归分析等任务,提升数据分析效率。

weixin_28327051的博客 384

离线AI实战指南:本地部署大模型处理PDF/Word/Excel

离线AI是指在无网络、不上传数据前提下,于个人设备运行大语言模型并完成文档理解、多轮对话与代码辅助等任务的技术方案。其核心依赖本地模型推理、文档解析向量化和轻量级对话调度三大能力。随着Phi-3、Qwen2、Llama3等轻量化开源模型普及,以及Ollama、LM Studio等易用工具成熟,普通用户已可在主流笔记本上实现PDF摘要、合同比对、代码注释等真实办公场景。本文聚焦离线AI的硬件适配、模型选型、文件处理链路与知识库构建,尤其强调中文OCR支持、结构化文档提取与CPU/GPU混合推理优化,助力非开发

weixin_31968639的博客 497

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

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

Linux运维老纪的博客 1342

Jetson Orin NX 单目标跟踪算法实战

本文对比了NanoTrack和MixFormerV2两种目标跟踪算法在Jetson Orin NX边缘设备上的实际表现。通过天空小目标跟踪场景测试发现,NanoTrack虽然表征能力较弱,但具有目标身份一致性强、失败模式可控、计算负担小等优势,更适合作为边缘端默认算法。MixFormerV2则适用于高速运动等特定场景。实验数据显示NanoTrack在Orin NX上可达200FPS,远高于MixFormerV2的38-120FPS。建议先采用NanoTrack构建稳定系统,后续再评估复杂算法的适用性。

karmueo46的博客 625

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

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

sun0322 4万+

小米万兆路由器里的Docker安装可道云(Kodexplorer)私有网盘

小米2022年12月份发布了万兆路由器,里面可以使用Docker。 今天尝试在小米的万兆路由器里安装[可道云](http://kodcloud.com/)(Kodexplorer)私有网盘。

engchina的专栏 1万+

Android车载应用开发与分析(11)- 车载Android应用开发入门指南

将时间回退到2017年我大学刚毕业时,彼时移动互联网就已经开始退潮,各大个培训机构也纷纷停止了Android相关的培训,曾经热火朝天的应用开发从那时起,就开始走向下坡路,小程序以及众多跨平台框架也让市场对Android原生开发的需求逐年降低,市场需求的降低也造就了Android开发的面试变得史无前例的“卷”。 终于我在2019年选择离开了互联网,投身当时还不是非常火热的车载Android领域继续从事Android原生开发。而这一年中国首个外商独资的整车制造项目,“...

linkwj的博客 1万+

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

U-net复现pytorch版本 以及制作自己的数据集并训练

GitHub链接: https://github.com/milesial/Pytorch-UNet 论文链接:

candice5566的博客 3万+

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

TI Sitara系列AM64x开发板(双核ARM Cortex-A53)软硬件规格书

创龙科技TL64x-EVM是一款基于TI Sitara系列AM64x双核ARM Cortex-A53 + 单/四核Cortex-R5F + 单核Cortex-M4F多核处理器设计的高性能评估板,由核心板和评估底板组成。评估板接口资源丰富,引出5x Ethernet(两路支持TSN)、2x CAN-FD、多路UART、多路DI/DO、GPMC、PCIe、USB等接口,板载WIFI模块,支持4G/5G模块、NVME硬盘,可选配外壳直接应用于工业现场,方便用户快速进行产品方案评估与技术预研。

创龙,嵌入式一体化解决方案商 727

按照CANoe模板制作seed&&key.dll

在canoe进行诊断测试的时候,在0x27服务中需要制作一个dll文件。可在canoe的诊断中进行加载,也可用于diva的自动化测试。 本文按照canoe提供的KeyGenDll_GenerateKeyEx模板制作。 KEYGENALGO_API VKeyGenResultEx GenerateKeyEx( const unsigned char* iSeedArray, /* Array for the seed [in] */ unsigned int

天赐好车的博客 6522

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

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

weixin_36240219的博客 341

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

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

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

luozyzyzy的博客 443

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

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

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

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、付费专栏及课程。

余额充值