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

JSch - 配置SFTP服务器SSH免密登录

文章目录

    • 1. 什么是SFTP
    • 2. 什么是Jsch以及它的作用
    • 3. Linux中配置SSH密钥登录
    • 4. sftp服务器认证机制
    • 5. publickey和password两种方式登录sftp的API调用
    • 6. 代码可以如下改造:

需求:做一个通过ssh免密登录的需求,是基于原先密码登录sftp服务器的代码上进行改造

1. 什么是SFTP

SFTP是一个安全文件传送协议,可以为传输文件提供一种安全的加密方法。SFTP 为 SSH的一部份,是一种传输文件到服务器的安全方式。SFTP是使用加密传输认证信息和传输的数据,所以,使用SFTP是非常安全的。但是,由于这种传输方式使用了加密/解密技术,所以传输效率比普通的FTP要低得多,如果您对网络安全性要求更高时,可以使用SFTP代替FTP。

2. 什么是Jsch以及它的作用

Jsch是一个纯粹的用java实现SSH功能的java library。如果要知道Jsch的功能需先了解一下SSH。SSH是一个安全协议,用来在不同系统或者服务器之间进行安全连接,在连接和传送数据的过程中会进行加密。SSH一般是基于客户端的或者Linux命令行,比如window同过OpenSSH、putty等客户端的工具,在linux上可以通过ssh username@host命令进行连接。但是如果在Java中如何实现SSH呢?这时候便是通过JSCH来实现此的功能。

3. Linux中配置SSH密钥登录

SSH 免密登录可以让用户在不输入密码的情况下登录远程服务器,提高登录效率和安全性

步骤:

  1. 在本机中生成秘钥,SSH有专门创建SSH密钥的工具ssh-keygen 🚩

    - 生成旧版密钥的命令:ssh-keygen -m PEM -t rsa
    - 生成新版密钥命令:ssh-keygen -t rsa
    
    • passphrase:生成密钥时的密码
    • 执行结束后,~/.ssh/目录下会多两个文件:id_rsa(私钥)、id_rsa.pub(公钥)
    id_rsa:私钥
    id_rsa.pub:公钥
    
  2. 给目标服务器添加公钥

    ssh-copy-id 用户名@主机

    公钥将被复制到目标服务器的~/.ssh/authorized_keys文件中。

    ssh-copy-id -p 19222 lihw@10.1.61.118
    

    将公钥ftp到目标服务器的.ssh后,cd ~/.ssh,手动将公钥导入到authorized_keys信任列表:

    cat 公钥 >> authorized_keys
    
  3. 更新权限公钥权限

    # 自此SSH免密登录配置完成。
    chmod 644 authorized_keys
    
  4. 配置服务器

    在目标服务器上使用文本编辑器打开SSH服务器的配置文件(通常为/etc/ssh/sshd_config):

    sudo nano /etc/ssh/sshd_config
    

    确保以下配置选项的值为"yes",如果不是,请进行相应修改:

    RSAAuthentication yes
    PubkeyAuthentication yes
    

    保存修改并关闭配置文件。
    重新启动SSH服务器以应用更改:

    sudo service ssh restart
    
  5. 测试使用密钥登录

    ssh -p 19222 lihw@10.1.61.118
    

4. sftp服务器认证机制

Jsch提供了四种认证机制:

  • password 密码方式
  • publickey(DSA,RSA) 公私钥方式
  • keyboard-interactive
  • gss-api-with-mic

其中publickey方式通过配置公私钥实现SSH免密登录,这里也只是简单讲一下它的使用。

5. publickey和password两种方式登录sftp的API调用

SSH公钥检查机制:

公钥检查机制是一个安全机制,可以防范中间人劫持等黑客攻击。SSH连接远程主机时,会检查主机的公钥。如果是第一次该主机,会显示该主机的公钥摘要,提示用户是否信任该主机。当选择接受,就会将该主机的公钥追加到文件 ~/.ssh/known_hosts 中。当再次连接该主机时,就不会再提示该问题了。 但是在某些特殊的情况下,严格的SSH公钥检查可能会破坏一些依赖SSH协议的自动化任务如Java的Jsch免密登录sftp程序。解决方式为调整StrictHostKeyChecking配置指令。StrictHostKeyChecking选项如下3种:

session.setConfig("StrictHostKeyChecking", "no/ask/yes👇");
  • no 最不安全的级别,当然也没有那么多烦人的提示了,相对安全的内网测试时建议使用。如果连接server的key在本地不存在,那么就自动添加到文件中(默认是known_hosts),并且给出一个警告。
  • ask 默认的级别,就是出现刚才的提示了。如果连接和key不匹配,给出提示,并拒绝登录。
  • yes 最安全的级别,如果连接与key不匹配,就拒绝连接,不会提示详细信息。

下面根据password来分析publickey方式与其区别:

  • 原来password方式需要这样一段代码来设置密码:session.setPassword (properties.getPassword ()); ,但是ssh key的方式就没有password了,所以这段要删掉。
  • publickey需要设置我们的ssh私钥文件的全路径(privateKeyFile):jsch.addIdentity (properties.getPrivateKeyFile ());
  • 一般私钥文件需要口令(passphrase)才能读取,这需要设置一个配置类对象,在jsch里其实需要自己搞一个简单的接口实现(如下:SftpAuthKeyUserInfo类 ),然后增加:session.setUserInfo(new SftpAuthKeyUserInfo (properties.getPassphrase ()));

6. 代码可以如下改造:

  1. 设置配置类对象

    SftpAuthKeyUserInfo.java

import com.jcraft.jsch.UserInfo;
import lombok.extern.slf4j.Slf4j;/*** ssh private key passphrase info*/
@Slf4j
public class UserInfoImpl implements UserInfo {/*** ssh private key passphrase*/private String passphrase;public UserInfoImpl (String passphrase) {this.passphrase = passphrase;}@Overridepublic String getPassphrase() {return passphrase;}@Overridepublic String getPassword() {return null;}@Overridepublic boolean promptPassphrase(String s) {return true;}@Overridepublic boolean promptPassword(String s) {return false;}@Overridepublic boolean promptYesNo(String s) {return true;}@Overridepublic void showMessage(String message) {log.info ("SSH Message:{}", message);}
}
  1. 改造以适配publickey登录方式
   try {JSch jsch = new JSch();session = jsch.getSession(sftpProperties.getUsername(),sftpProperties.getHost(), sftpProperties.getPort());if (sftpProperties.isCheckToHostKey()) {session.setConfig("PreferredAuthentications", "publickey");session.setConfig("userauth.gssapi-with-mic", "no");session.setConfig("StrictHostKeyChecking", "ask");session.setUserInfo(new SftpAuthKeyUserInfo(sftpProperties.getPassword()));jsch.addIdentity(sftpProperties.getKeyPath());} else {session.setConfig("PreferredAuthentications", "password");session.setConfig("StrictHostKeyChecking", "no");session.setPassword(sftpProperties.getPassword());}session.setConfig("UseDNS", "no");session.setConfig("kex", "diffie-hellman-group1-sha1,"+ "diffie-hellman-group-exchange-sha1,"+ "diffie-hellman-group-exchange-sha256");session.connect(sftpProperties.getConnectTimeout());channelSftp = (ChannelSftp) session.openChannel("sftp");channelSftp.connect();originalDir = channelSftp.pwd();} catch (Exception e) {disconnect();throw new IllegalStateException("failed to create sftp Client", e);}
  1. properties为自定义sftp服务端配置:
package io.github.lihewei7.easysftp.config;import org.springframework.boot.context.properties.ConfigurationProperties;
import java.util.LinkedHashMap;/*** @explain: SFTP client configuration information* @author: lihewei
*/
@ConfigurationProperties("sftp")
public class SftpProperties {private String host = "localhost";private int port = 22;private String username;private String password = "";/*** Connection timeout.*/private int connectTimeout = 0;/*** Enable jsch log, Cannot be individually turned on or off for one of multiple hosts.*/private boolean enabledLog = false;/*** Whether to use a key to log in*/private Boolean isCheckToHostKey = false;/*** SSH kex algorithms.*/private String kex;/*** host key.*/private String keyPath;/*** Configuring multiple hosts.*/private LinkedHashMap<String,SftpProperties> hosts;public LinkedHashMap<String, SftpProperties> getHosts() {return hosts;}public void setHosts(LinkedHashMap<String, SftpProperties> hosts) {this.hosts = hosts;}public String getHost() {return host;}public void setHost(String host) {this.host = host;}public int getPort() {return port;}public void setPort(int port) {this.port = port;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public boolean isEnabledLog() {return enabledLog;}public void setEnabledLog(boolean enabledLog) {this.enabledLog = enabledLog;}public int getConnectTimeout() {return connectTimeout;}public void setConnectTimeout(int connectTimeout) {this.connectTimeout = connectTimeout;}public Boolean isCheckToHostKey() {return isCheckToHostKey;}public void setCheckToHostKey(Boolean checkToHostKey) {isCheckToHostKey = checkToHostKey;}public String getKex() {return kex;}public void setKex(String kex) {this.kex = kex;}public String getKeyPath() {return keyPath;}public void setKeyPath(String keyPath) {this.keyPath = keyPath;}
}

相关文章:

JSch - 配置SFTP服务器SSH免密登录

文章目录 1. 什么是SFTP2. 什么是Jsch以及它的作用3. Linux中配置SSH密钥登录4. sftp服务器认证机制5. publickey和password两种方式登录sftp的API调用6. 代码可以如下改造&#xff1a; 需求&#xff1a;做一个通过ssh免密登录的需求&#xff0c;是基于原先密码登录sftp服务器的…...

RISC-V指令格式

RISC-V指令格式 1 RISC-V指令集命名规范2 RISC-V指令集组成2.1 基础整数指令集2.2 扩展指令集 3 RISC-V指令格式3.1 指令表述3.2 指令格式 本文属于《 RISC-V指令集基础系列教程》之一&#xff0c;欢迎查看其它文章。 1 RISC-V指令集命名规范 前面提到过RV32I&#xff0c;这是…...

Linux 文件比较工具

在Linux系统中&#xff0c;文件比较是一种常见的任务&#xff0c;用于比较两个文件之间的差异。文件比较可以帮助我们找出两个文件的不同之处&#xff0c;或者确定它们是否完全相同。在Linux中&#xff0c;有多种方法可以进行文件比较。 1. diff 在Linux中&#xff0c;diff命…...

【GAMES101】Lecture 17 材质

目录 材质 漫反射 镜面反射 折射-Snell’s Law Fresnel Reflection / Term&#xff08;菲涅耳项&#xff09; 微表面模型 各向同性与各向异性 BRDF的性质 测量BRDF 材质 渲染方程中的BRDF描述了物体是如何与光线作用的&#xff0c;而物体的材质决定了它看起来是怎么样…...

数模.matlab画图

一、mesh函数 上图是平常用到的方式 例题&#xff1a; 上图的meshgrid函数相当于上上图的前三个指令&#xff08;temp&#xff0c;x,y&#xff09; mash函数&#xff1a; mashc函数&#xff1a; mashz函数&#xff1a; 上图subplot函数的作用是将下标为index的图片放到对应的x&…...

[word] word表格表头怎么取消重复出现? #媒体#笔记#职场发展

word表格表头怎么取消重复出现&#xff1f; word表格表头怎么取消重复出现&#xff1f;在Word中的表格如果过长的话&#xff0c;会跨行显示在另一页&#xff0c;如果想要在其它页面上也显示表头&#xff0c;更直观的查看数据。难道要一个个复制表头吗&#xff1f;当然不是&…...

vue项目开发vscode配置

配置代码片段 步骤如下&#xff1a; 文件->首选项->配置用户代码片段新增全局代码片段起全局代码片段文件名“xxx.code-snippets” 这里以配置vue2初始代码片段为例&#xff0c;配置具体代码片段 {"name": "vue-sph","version": "…...

BUUCTF-Real-[Tomcat]CVE-2017-12615

目录 漏洞描述 一、漏洞编号&#xff1a;CVE-2017-12615 二、漏洞复现 get flag 漏洞描述 CVE-2017-12615&#xff1a;远程代码执行漏洞 影响范围&#xff1a;Apache Tomcat 7.0.0 - 7.0.79 (windows环境) 当 Tomcat 运行在 Windows 操作系统时&#xff0c;且启用了 HTTP P…...

Qt应用软件【协议篇】http协议get、post示例

文章目录 QT Http的APIHTTP GET 请求示例HTTP POST 请求示例伪装chrome浏览器get请求QT Http的API QNetworkAccessManager 作用:管理所有的网络请求,是发送请求和接收响应的中心点。主要功能: 发送HTTP请求(GET, POST, PUT, DELETE等)。处理网络请求的异步回调。管理网络…...

如何选择Centos的替代者

开篇废话&#xff1a;许久许久没有更新博客了。寒假回到故土&#xff0c;大雪虽然没有封路&#xff0c;还是增加了不出门的决心&#xff0c;虽然年岁已高&#xff0c;但是不学习还是不踏实&#xff0c;那就借着写作再继续前行。 背景&#xff1a;信息化部门&#xff0c;掌管着…...

【Java数据结构】ArrayList和LinkedList的遍历

一&#xff1a;ArrayList的遍历 import java.util.ArrayList; import java.util.Iterator; import java.util.List;/*** ArrayList的遍历*/ public class Test {public static void main(String[] args) {List<Integer> list new ArrayList<>();list.add(5);list…...

springboot163美食推荐商城的设计与实现

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的 适用于计算机类毕业设计&#xff0c;课程设计参考与学习用途。仅供学习参考&#xff0c; 不得用于商业或者非法用途&#xff0c;否则&#xff0c;一切后果请用户自负。 看运行截图看 第五章 第四章 获取资料方式 **项…...

[机器学习]K-means——聚类算法

一.K-means算法概念 二.代码实现 # 0. 引入依赖 import numpy as np import matplotlib.pyplot as plt # 画图依赖 from sklearn.datasets import make_blobs # 从sklearn中直接生成聚类数据# 1. 数据加载 # 生成&#xff08;n_samples&#xff1a;样本点&#xff0c;centers&…...

并发编程 java锁机制

1、什么是锁&#xff0c;为什么需要锁&#xff1f; 并发环境下&#xff0c;会存在多个线程对同一个资源进行争抢的情况&#xff0c;假设线程A对资源正在进行修改&#xff0c;此时线程B又对同一资源进行了修改&#xff0c;就会导致数据不一致的问题。为了解决这个问题&#xff…...

Onerugged三防平板厂家丨三年质保承诺丨三防平板PAD

行业领先产品——Onerugged三防平板。凭借着十年的经验&#xff0c;我们深知终端设备在各个行业中的重要性&#xff0c;因此致力于为用户提供高可靠性的解决方案。 Onerugged三防平板以其卓越的性能和全方位的保护功能&#xff0c;在市场上脱颖而出。首先&#xff0c;它拥有IP…...

Android 系统启动流程

一.Android系统启动流程基本框架 Android系统完整的启动过程&#xff0c;从系统层次角度可分为 Linux 系统层、Android 系统服务层、Zygote进程模型三个阶段&#xff1b;从开机到启动 Home Launcher 完成具体的任务细节可分为七个步骤&#xff0c;下面就从具体的细节来解读 And…...

鸿蒙学习-app.json5配置文件

官网文档参考&#xff1a;https://developer.harmonyos.com/cn/docs/documentation/doc-guides-V3/app-configuration-file-0000001427584584-V3 位于AppScope下的app.json5配置文件 一、基础属性 {"app": {/*包名*/"bundleName": "com.example.dem…...

华为OD机试 - 智能成绩表( Python C C++ JavaGo JS PHP)

题目描述 小明是一名新老师&#xff0c;他需要将学生按考试总分或单科分数进行排名。学生的信息包括姓名、科目和对应的分数。帮助小明完成这个任务吧&#xff01; 输入描述 第一行包含两个整数 n 和 m&#xff0c;分别代表学生人数和科目数量。 0 < n < 1000 < m &…...

训练集,验证集,测试集比例

三者的区别 训练集&#xff08;train set&#xff09; —— 用于模型拟合的数据样本。验证集&#xff08;validation set&#xff09;—— 是模型训练过程中单独留出的样本集&#xff0c;它可以用于调整模型的超参数和用于对模型的能力进行初步评估。 通常用来在模型迭代训练时…...

Altium Designer(AD)加载常用元器件库到工程图文教程及视频演示

🏡《专栏目录》 目录 视频演示1,概述2,加载方法3,总结视频演示 Altium Designer(AD)加载常用元器件库到工程 欢迎点击浏览更多高清视频演示 1,概述...

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性&#xff0c;不同版本的Docker对内核版本有不同要求。例如&#xff0c;Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本&#xff0c;Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

【WiFi帧结构】

文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成&#xff1a;MAC头部frame bodyFCS&#xff0c;其中MAC是固定格式的&#xff0c;frame body是可变长度。 MAC头部有frame control&#xff0c;duration&#xff0c;address1&#xff0c;address2&#xff0c;addre…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件

今天呢&#xff0c;博主的学习进度也是步入了Java Mybatis 框架&#xff0c;目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学&#xff0c;希望能对大家有所帮助&#xff0c;也特别欢迎大家指点不足之处&#xff0c;小生很乐意接受正确的建议&…...

家政维修平台实战20:权限设计

目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系&#xff0c;主要是分成几个表&#xff0c;用户表我们是记录用户的基础信息&#xff0c;包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题&#xff0c;不同的角色&#xf…...

Cinnamon修改面板小工具图标

Cinnamon开始菜单-CSDN博客 设置模块都是做好的&#xff0c;比GNOME简单得多&#xff01; 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

Nginx server_name 配置说明

Nginx 是一个高性能的反向代理和负载均衡服务器&#xff0c;其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机&#xff08;Virtual Host&#xff09;。 1. 简介 Nginx 使用 server_name 指令来确定…...

【C语言练习】080. 使用C语言实现简单的数据库操作

080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

Web后端基础(基础知识)

BS架构&#xff1a;Browser/Server&#xff0c;浏览器/服务器架构模式。客户端只需要浏览器&#xff0c;应用程序的逻辑和数据都存储在服务端。 优点&#xff1a;维护方便缺点&#xff1a;体验一般 CS架构&#xff1a;Client/Server&#xff0c;客户端/服务器架构模式。需要单独…...

Oracle11g安装包

Oracle 11g安装包 适用于windows系统&#xff0c;64位 下载路径 oracle 11g 安装包...