Linux ssh localhost 免密登录(基于JSch实现webssh场景)

article/2025/1/11 15:10:35

背景

看到这个标题,你可能很奇怪,已经登录到Linux上了,为什么还要 ssh localhost,这个问题要从一个需求说起。

需求是这样的:
某一个springboot开发的带有界面的管理后台,有一个功能需求叫 “SSH控制台”,要求点击这个功能的时候,呈现一个黑色的和我们日常使用其他 shell 工具看到的界面一样的界面,并且要自动连接到这个 springboot 所在的 Linux 控制台,要点是自动进入,不需要输入任何host和账号密码。

效果如下截图:

在这里插入图片描述

浏览器前端这个效果,是通过 xterm.js 实现的。

  • 如果springboot运行在普通的Linux服务器上,那么这个控制台就是自动连接到这个服务器上,对应的用户就是启动 springboot 的 Linux 用户。

  • 如果这个springboot运行在docker容器里,那么这个控制台就是自动连接到这个docker容器的控制台上,对应的用户也是docker中默认启动这个服务的用户(docker一般默认不带ssh,你如果有这个需求,你需要在制作docker镜像的时候内置ssh服务)。

对于实现这个场景的功能,我画了一个草图(示意一下,大家将就看),如下:

在这里插入图片描述

对这个图解释一下:
1、浏览器和springboot服务建立websocket连接,用来实时传输数据。
2、springboot使用ssh localhost 的方式与所在Linux系统的ssh建立连接(使用JSch库)。
3、websocket 和 JSch 合作完成这个工作。

综上所述,我们就回到主题了。就是本文为什么要实现 ssh localhost 免密连接的原因了。

实现

如上,背景内容有点多,下面轮到实现了,总结了一下,实现本机 ssh 免密连接比较简单,就是生成本地密钥即可,细节不多说,看下面操作:

首先,springboot 在收到 websocket 建立连接的时候需要检测本机是否已经存在ssh免密登录的key

  • 先判断文件 ~/.ssh/id_dsa 是否存在
  • 然后判断文件 ~/.ssh/authorized_keys 是否存在
  • 再使用命令 whoami (查看当前用户) 和 文件 /etc/hostname 的内容(当前主机hostname)分别获取当前用户和当前主机hostname
  • 判断~/.ssh/authorized_keys中是否存在 用户@hostname 结尾的记录

然后,根据以上每个步骤的判断情况,对应执行如下命令(Java 执行 shell 命令不难吧?这个自己找个库解决)

ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

或者

ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

dsa 和 rsa 的方式为加密实现方式不同,均可以实现本文需求

最后,就可以执行命令 ssh localhost 验证结果了(对应在 springboot 中使用 JSch 免密连接 localhost 即可)。

因为登录可能会出现提示你输入yes/no 的确认提示,所以在使用 JSch 的时候,记得连接时设置属性 StrictHostKeyChecking 为 no
后者一劳永逸直接修改 ssh 配置文件 /etc/ssh/ssh_config 将其中的 # StrictHostKeyChecking ask 改成 StrictHostKeyChecking no

总结:本文的核心逻辑就是将生成的公钥放到 ssh 目标机器的 authorized_keys 文件中,因为我们是需要连接自己,所以就是将公钥放到自己系统的 authorized_keys 文件里,从而实现了 ssh localhost 的逻辑。


(END)


http://chatgpt.dhexx.cn/article/ehA2otWT.shtml

相关文章

java知识点汇总

文章目录 面试前的工作自我介绍充足的知识储备 javaSEJMM内存模型jdk1.8新特性java语言的特征如何实现跨平台谈谈你对面向对象的认识理解聊聊面向对象的特征,封装,继承,多态访问权限对象创建过程? 从jvm的角度出发,延伸到对象在内存中的存储空间Java类初始化顺序java中创建对象…

boos里的AHCI RAID_不重装系统也能把硬盘模式IDE改AHCI

相信大家都知道开启AHCI模式可以发挥SATA硬盘的潜在性能,尤其是现在新型系统和固态硬盘逐渐普及,几乎所有新电脑都是ahci模式,不过有些人系统是很早就安装好,之前默认是IDE模式,那么可不可以不重装系统将硬盘模式改成A…

SATA工作模式咋选?揭秘AHCI和IDE区别(全文)

转载自:http://digi.163.com/13/0504/07/8U111CSB00163HE9_all.html 第1页:AHCI模式与Win7、SSD的不解之缘 AHCI这个注定和SATA接口结下不解之缘的接口模式,它担负着淘汰IDE模式的重任,从诞生开始就充满争议,它经历了…

计算机主板提示ahci,映泰主板设置硬盘模式AHCI或IDE的教程

映泰品牌主板是一款性价比极高的电脑主板,具有非常不错的兼容性和稳定性,不少的网吧使用的正是这一款主板,唯一需要注意的是在电脑重装win7或xp时,必须正确的设置硬盘模式,以免重装过程中出现蓝屏现象,那么…

ide模式ahci模式_IDE的完整形式是什么?

ide模式ahci模式 IDE:集成开发环境/集成驱动电子 (IDE: Integrated Development Environment/ Integrated Drive Electronics) 1)IDE:集成开发环境 (1) IDE: Integrated Development Environment) IDE is an abbreviation of the Integrated Development…

硬盘的IDE、AHCI和NVMe模式区别

硬盘接口标准——IDE、AHCI和NVMe ★引言 截至2017年,硬盘的接口标准(工作模式)有IDE、AHCI和NVMe。 NVMe最先进,AHCI次之,IDE已被逐渐淘汰。 ★IDE 集成驱动电子设备(英语:Integrated Dri…

SATA接口Raid、AHCI、IDE三种模式

今天这里分享给朋友们关于SATA接口Raid、AHCI、IDE三种模式! 首先说一下,关于主板的SATA接口的工作模式,BIOS中常见的选项有以下三种:RAID(部分技嘉主板叫XHD)、AHCI、IDE。 当然,并不是每一种主…

AHCI和IDE的区别,如何在AHCI模式下安装系统

最近在找工作,面试的时候问到了一个以前没有接触过的问题,就是AHCI和IDE硬盘模式的差别和如何在AHCI模式下安装操作系统?以前从来没有实验过,所以当场没答出来很是尴尬。后来回来查了很多资料,然后做实验终于知道怎么回…

安装win7系统时,硬盘模式为IDE模式时安装成功,硬盘模式为AHCI模式时重启蓝屏或一直启动的问题,以及IDE模式与AHCI模式的区别!

通俗易懂的说法就是,IDE就是ATA模式,是并口传输模式,04年前普及的技术,理论最大133Mb每秒,AHCI就是SATA模式,串口传输模式,新技术,传输速度快,理论最大300Mb每秒,简单点说…

【科普】AHCI模式是什么,与IDE模式有什么区别?

文章来源:https://www.reneelab.com.cn/ahci-vs-ide.html 目录 一、AHCI模式是什么1、AHCI模式2、AHCI 与 IDE 模式的区别 二、如何检测硬盘运行的模式三、如何在BIOS里将IDE模式切换成AHCI模式 一、AHCI模式是什么 在WinXP时代,系统对AHCI模式支持不佳…

字符串比较函数

在c语言的函数库中,有这样两个字符串比较函数,分别是strcmp()和strncmp(),下面简单地介绍下这两个函数的用法。在终端命令行中输入“man 3 strcmp”即可获得下图中的信息。 通过上图,我们可以知道: strcmp的函数原型为…

python中的字符串比较

python中没有直接的方法对字符串进行排序,原因是字符串类型是不允许直接修改元素的。 字符串比较的规则是由左边开始最前面的字符对应ascll码表中的大小决定的,与长度无关,比如下面这个比较: 进阶,如何根据字符串数组…

字符串对比[蓝桥杯]

题目链接:字符串对比 时间限制: 1 Sec 内存限制: 256 MB 题目描述: 给定两个仅由大写字母或小写字母组成的字符串(长度介于1到10之间),它们之间的关系是以下4中情况之一:   1:两个字符串长度不等。比如 Beijing 和 …

C#字符串比较

1、Compare(string s1,string s2)的用法。 该方法的三种返回类型分别是: 如果S1大于S2,结果为1; 如果S1等于S2,结果为0; 如果S1小于S2,结果为-1; 那么如何来判断S1与S2的大小关系呢&#xff…

C# 字符串比较

文章目录 前言一、函数方法二、Compare方法三、CompareTo方法四、Equals方法五、CompareOrdinal方法 前言 此篇文章转载的是书籍《从零开始学C#》的内容,稍加改变并非原创 项目名称为Test,类名为Program ASCII码-百度百科 微软官方C#函数文档 一、函数…

oracle字符串有,Oracle字符串比较

Oracle字符串的比较,是按从左往右,逐一转换成ASCII码比较的,如果比较的两个字符串不一样长,就先用空格补齐长度短的那个字符串,然后再进行比较。因此,比较日期型的数据,也能通过转换成字符再进行…

Linux---如何创建文本文件

Linux创建文本文件 1.在Linux上使用重定向符(>)创建一个文件 标准重定向符允许我们创建一个0KB的空文件。它通常用于重定向一个命令的输出到一个新文件中。在没有命令的情况下使用重定向符时,它会创建一个文件。 2. 在Linux上使用touch…

建文本文档 怎么改成html,文本文档怎么改格式 怎么把文本文档改成CFG格式

怎么改成MP3的格式 急呀 朋友们 企业回文档格式转换可输入的文件格式类型包含如下格式:演示文件:pptx、ppt、pot、potx、ppsx、dps、dpt、pptm、potm、ppsm。表格文件:xls、xlt、et、ett、xlsx、xltx、csv、xlsb、xlsm、xltm。文字文件&#…

linux下怎样创建文本文件,如何使用Linux中的命令行快速创建文本文件 | MOS86

如果你是一个键盘人,很多事情只需使用命令行即可完成。例如,如果您需要这样做,还有一些易于使用的创建文本文件的方法。 NOTE:当我们说在这篇文章中输入一些东西,并且在文本上有引号时,不要输入引号,除非另…

C# 读取文本文件

1.准备工作 引入命名空间System.IO,因为这里面包含了我们要调用的读取文件的类StreamReader 2.举例 (1)待读取文件格式 (2)思路 实例化一个SteamReader,用完后最后记得关闭它创建四个一维数组用来存放…