浅谈springboot整合ganymed-ssh2远程访问linux

简介: 浅谈springboot整合ganymed-ssh2远程访问linux

环境介绍


技术栈

springboot+mybatis-plus+mysql+ganymed-ssh2

软件

版本

mysql

8

IDEA

IntelliJ IDEA 2022.2.1

JDK

1.8

Spring Boot

2.7.13

mybatis-plus

3.5.3.2


SSH(远程连接工具)连接原理:ssh服务是一个守护进程(demon),系统后台监听客户端的连接,ssh服务端的进程名为sshd,负责实时监听客户端的请求(IP 22端口),包括公共秘钥等交换等信息。


加入依赖

<!-- shell认证支持 -->
        <dependency>
            <groupId>ch.ethz.ganymed</groupId>
            <artifactId>ganymed-ssh2</artifactId>
            <version>262</version>
        </dependency>


测试类

@Test
        void sshdemo() throws IOException {
            InputStream inputStream = null;
            StringBuilder result = new StringBuilder();
            Connection conn=new Connection("192.168.68.133",22); //远程连接的ip 和端口
                conn.connect();
                if (conn.authenticateWithPassword("root", "111111")){
                    System.out.println("登录成功");
                    Session session = conn.openSession();
                    //获取CPU使用率
                    session.execCommand("df -h| awk '$NF==\"/\"{printf \"%d/%dGB 使用率(%s)\",$3,$2,$5}'");
                    inputStream = session.getStdout();
                    result = this.processStdout(inputStream);
                    System.out.println(result.toString());
                    //关闭连接
                    conn.close();
                }else {
                    System.out.println("连接失败");
                }
        }


编写通用实体类

package com.example.domain;
import ch.ethz.ssh2.Connection;
import ch.ethz.ssh2.Session;
import lombok.Data;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.Charset;
@Data
public class SSHConnectionMethod {
    /* 连接器 */
    private Connection connect;
    /* 主机(IP) */
    private String host;
    /* 连接端口 */
    private  int port;
    /* 编码 */
    private Charset charset;
    /* 用户 */
    private String user;
    /* 密码 */
    private String password;
    /**
     * 登录Centos主机方法
     */
    private boolean login() {
        connect = new Connection(host,port);
        try {
            connect.connect();
            return connect.authenticateWithPassword(user, password);
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }
    }
    /**
     * 获取返回信息
     */
    public StringBuilder getBackInfo(InputStream in) {
        byte[] buf = new byte[1024];
        StringBuilder builder = new StringBuilder();
        try {
            int length;
            while ((length = in.read(buf)) != -1) {
                builder.append(new String(buf, 0, length));
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return builder;
    }
    /**
     * 执行shell命令
     */
    public StringBuilder exec(String shell) throws IOException {
        InputStream inputStream = null;
        StringBuilder result = new StringBuilder();
        try {
            // 认证登录信息
            if (this.login()) {
                // 登陆成功
                Session session = connect.openSession();
                session.execCommand(shell);
                inputStream = session.getStdout();
                result = this.getBackInfo(inputStream);
                connect.close();
            }
        } finally {
            if (null != inputStream) {
                inputStream.close();
            }
        }
        return result;
    }
}
@Test
void sshdemo01()throws IOException{
     SSHConnectionMethod sshConnectionMethod = new SSHConnectionMethod();
     sshConnectionMethod.setHost("192.168.68.133");
     sshConnectionMethod.setPort(22);
     sshConnectionMethod.setUser("root");
     sshConnectionMethod.setPassword("111111");
    StringBuilder backResult = sshConnectionMethod.exec("df -h| awk '$NF==\"/\"{printf \"%d/%dGB 使用率(%s)\",$3,$2,$5}'");
    System.out.println(backResult);
}


ssh服务端由2部分组成: openssh(提供ssh服务)    openssl(提供加密的程序)


ssh的客户端可以用 XSHELL,Securecrt, Mobaxterm等工具进行连接


SSH的工作机制


服务器启动时产生一个密钥(768bit公钥),本地的ssh客户端发送连接请求到ssh服务器,服务器检查连接点客户端发送的数据和IP地址,确认合法后发送密钥(768bits)给客户端,此时客户端将本地私钥(256bit)和服务器的公钥(768bit)结合成密钥对key(1024bit),发回给服务器端,建立连接通过key-pair数据传输。


   1.远程Server收到Client端用户TopGun的登录请求,Server把自己的公钥发给用户。

   2.Client使用这个公钥,将密码进行加密。

   3.Client将加密的密码发送给Server端。

   4.远程Server用自己的私钥,解密登录密码,然后验证其合法性。

   5.若验证结果,给Client相应的响应


SSH的加密技术


加密技术:传输过程,数据加密。            


1.SSH1没有对客户端的秘钥进行校验,很容易被植入恶意代码

2.SSH2增加了一个确认联机正确性的Diffe_Hellman机制,每次数据的传输,Server都会检查数据来源的正确性,避免黑客入侵。


 SSH2支持RSA和DSA密钥  

 DSA:digital signature Algorithm  数字签名

 RSA:既可以数字签名又可以加密    


目录
相关文章
|
13天前
|
Java Linux
Springboot 解决linux服务器下获取不到项目Resources下资源
Springboot 解决linux服务器下获取不到项目Resources下资源
|
1月前
|
Java Linux Maven
Linux系统Docker部署Nexus Maven并实现远程访问本地管理界面
Linux系统Docker部署Nexus Maven并实现远程访问本地管理界面
|
1月前
|
安全 Shell Linux
【Shell 命令集合 文件管理】Linux ssh 远程主机之间复制文件 scp 命令使用教程
【Shell 命令集合 文件管理】Linux ssh 远程主机之间复制文件 scp 命令使用教程
35 0
|
3天前
|
网络协议 安全 Linux
IDEA通过内网穿透实现固定公网地址远程SSH连接本地Linux服务器
IDEA通过内网穿透实现固定公网地址远程SSH连接本地Linux服务器
|
18天前
|
安全 Ubuntu Linux
Linux远程访问Windows实现步骤
在Windows上启用远程桌面连接并获取IP地址后,Linux用户需安装SSH客户端( Debian系:`sudo apt-get update; sudo apt-get install openssh-client`,RPM系:`sudo yum install openssh-clients`)。然后使用命令`ssh 用户名@Windows_IP地址`连接,其中`用户名`和`Windows_IP地址`按实际情况填写。
14 4
|
1月前
|
存储 安全 网络安全
Git 安全远程访问:SSH 密钥对生成、添加和连接步骤解析
SSH(Secure Shell)是一种用于安全远程访问的协议,它提供了加密通信和身份验证机制。在使用 SSH 连接到远程 Git 存储库时,您可以使用 SSH 密钥对来确保安全性。以下是关于如何生成和使用 SSH 密钥对的详细步骤: 生成 SSH 密钥对
100 2
|
1月前
|
运维 安全 Linux
如何在Linux部署JumpServer堡垒机并实现远程访问本地服务
如何在Linux部署JumpServer堡垒机并实现远程访问本地服务
|
1月前
|
网络协议 Ubuntu Linux
「远程开发」VSCode使用SSH远程linux服务器 - 公网远程连接
「远程开发」VSCode使用SSH远程linux服务器 - 公网远程连接
121 0
|
1月前
|
安全 Linux Shell
|
2月前
|
安全 网络协议 Linux