淺談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>

測試類

@Testvoid 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:既可以數字簽名又可以加密???

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/370064.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/370064.shtml
英文地址,請注明出處:http://en.pswp.cn/news/370064.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

優化Neo4j Cypher查詢

上周&#xff0c;我花了很多時間嘗試使用實時系統中的數據來優化大約20個執行失敗的Cypher查詢&#xff08;36866ms至155575ms&#xff09;。 經過一番嘗試和錯誤&#xff0c;以及來自Michael的大量投入&#xff0c;我能夠大致確定對查詢進行哪些操作才能使它們性能更好-最后&a…

python 多文件知識

對于一個大型的項目&#xff0c;會存在很多個py文件&#xff0c;本文記錄與多文件有關的內容。 1. python 如何在一個.py文件中調用另一個.py文件的類 如果是在同一個 module中(也就是同一個py 文件里),直接用就可以如果在不同的module里,例如a.py里有 class A:b.py 里有 class…

android pick file,LFilePicker---文件選擇利器,各種樣式有它就夠了

LFilePicker在 Android 開發中如果需要選擇某個文件&#xff0c;可以直接調取系統的文件管理器進行選擇&#xff0c;但是無法保證各個廠商的手機界面一致&#xff0c;而且解析Uri 還比較繁瑣&#xff0c;如果還需要多選呢&#xff1f;需要文件類型過濾呢&#xff1f;老板說界面…

老筆記整理二:網頁小問題匯總

最近有一些小問題。想在這里寫出來。一是方便大家排錯&#xff0c;再是自己也整理一下。 1。很傻的小問題。。。參數提交方式有一個應該是form而不是from。&#xff08;英語老師&#xff0c;我對不起你。。。&#xff09; 2。用超鏈接傳參數&#xff0c;在&#xff1f;后面不能…

在JVM之下–類加載器

在許多開發人員中&#xff0c;類加載器是Java語言的底層&#xff0c;并且經常被忽略。 在ZeroTurnaround上 &#xff0c;我們的開發人員必須生活&#xff0c;呼吸&#xff0c;飲食&#xff0c;喝酒&#xff0c;并且幾乎與類加載器保持親密關系&#xff0c;才能生產JRebel技術&a…

matplotlib繪制餅狀圖

源自http://blog.csdn.net/skyli114/article/details/77508430?ticketST-41707-PzNbUDGt6R5KYl3TkWDg-passport.csdn.net pyplot使用plt.pie()來繪制餅圖 1 import matplotlib.pyplot as plt 2 labels frogs, hogs, dogs, logs 3 sizes 15, 20, 45, 10 # [15,20,45,10…

自適應寬度元素單行文本省略用法探究

單行文本省略是現代網頁設計中非常常用的技術&#xff0c;幾乎每個站點都會用到。單行文本省略適用于顯示摘要信息的場景&#xff0c;如列表標題、文章摘要等。在響應式開發中&#xff0c;自適應寬度元素單行文本省略容易失效不起作用&#xff0c;對網頁開發這造成困擾。因此&a…

P3390 【模板】矩陣快速冪

題目背景 矩陣快速冪 題目描述 給定n*n的矩陣A&#xff0c;求A^k 輸入輸出格式 輸入格式&#xff1a; 第一行&#xff0c;n,k 第2至n1行&#xff0c;每行n個數&#xff0c;第i1行第j個數表示矩陣第i行第j列的元素 輸出格式&#xff1a; 輸出A^k 共n行&#xff0c;每行n個數&…

c#精彩編程200例百度云_永安市教育局被授予“人工智能編程教育試驗區”

11月28日&#xff0c;“第二屆人工智能與機器人教育大會青少年人工智能與編程教育主題論壇”在廈門召開。永安市教育局被中國教育發展戰略學會人工智能與機器人教育專委會授予“人工智能編程教育試驗區”牌匾&#xff0c;巴溪灣小學、西門小學、三中、一中附屬學校、實驗小學等…

python中+=和=+的區別

本文原創&#xff0c;版權屬作者個人所有&#xff0c;如需轉載請聯系作者本人。Q&微&#xff1a;155122733 -------------------------------------------------------------------------------------------------------- a1 代表在原值上更改 aa1相當于先定義一個變量&…

Spring Data JPA和分頁

讓我們從支持分頁的經典JPA方法開始。 考慮一個簡單的域類–一個具有名字&#xff0c;姓氏的“成員”。 為了支持在成員列表上進行分頁&#xff0c;JPA方法是支持一種查找器&#xff0c;該查找器將獲取第一個結果&#xff08;firstResult&#xff09;的偏移量和要檢索的結果&am…

南陽理工 題目63 小猴子下落

小猴子下落 時間限制&#xff1a;3000 ms | 內存限制&#xff1a;65535 KB 難度&#xff1a;3 描述 有一顆二叉樹&#xff0c;最大深度為D,且所有葉子的深度都相同。所有結點從左到右從上到下的編號為1,2,3&#xff0c;&#xff0c;2的D次方減1。在結點1處放一個小猴子&#…

vue 方法獲取返回值_vue.js - vuex異步提交,怎么獲取返回數據

問 題 做登錄頁面時,在vuex中的action異步提交后獲取的數據在mutations中存儲在state里面,但是總感覺不對,沒有返回數據,我前端頁面怎么獲取數據,用mapgetter獲取不到數據,是不是他不是實時更新的,而且輸出的mapgetter輸出的數據還在action的前面。下面是我前端部分代碼…

Windows環境下安裝、卸載Apache

安裝Apache 服務 打開 Apcahe的目錄 &#xff0c;打開bin目錄&#xff0c; 如&#xff1a;E:\wamp\Apache24\bin &#xff0c;打開目錄&#xff0c;Shift鍵 鼠標右鍵 &#xff0c; 點擊 在此處打開命令窗口或者W快捷鍵直接到此處&#xff0c; 也可以Window鍵r&#xff0c;輸入…

css清浮動

我們在平常做項目的時候&#xff0c;float這個css屬性經常會用到。元素浮動會讓元素脫離文檔流&#xff0c;從而不能撐開父級的內容。今天我將展示常見的清除浮動的方法。 什么是浮動 浮動元素脫離文檔流并且向左或者向右移動&#xff0c;直到浮動元素的邊緣碰到父級框或者另…

小心緩存管理器

如果使用spring和JPA&#xff0c;則很有可能利用ehcache&#xff08;或其他緩存提供程序&#xff09;。 您可以在兩種不同的情況下進行此操作&#xff1a;JPA 2級緩存和spring方法緩存。 在配置應用程序時&#xff0c;通常會設置JPA提供程序的二級緩存提供程序&#xff08;在我…

DirectX11 學習筆記7 - 支持自由移動的攝像機

如今將又一次制定一個camera攝像機。能夠自由移動。比方前進 后退&#xff0c;上游 下潛。 各個方向渲染之類的。 首先設置按鍵。 這個時候須要在 XWindow.h 里面 bool XWindow::frame() {//推斷是否按下ESC鍵if(x_input->isKeyDown(VK_ESCAPE))return false;//假設A,S,D,W,…

騰訊吃雞 android,騰訊吃雞手游《光榮使命》正式上線:安卓/iOS不限號測試

IT之家11月29日消息 今天下午&#xff0c;騰訊首款百人戰術競技手游《光榮使命》在安卓、iOS雙平臺正式上線&#xff0c;開啟全面測試。(官網下載&#xff1a;點此鏈接&#xff0c;雙平臺已開放下載。)該游戲采用第三人稱射擊視角&#xff0c;玩家化身參與“使命行動”軍事演習…

lazada鋪貨模式的選品_lazada小白的運營難點→鋪貨與精細化運營的優劣勢詳解

lazada是鋪貨還是精細化經營第一種鋪貨鋪貨作為平臺早期都是比較受歡迎的&#xff0c;平臺的蠻荒期&#xff0c;成長期當中&#xff0c;鋪貨的商家是非常受歡迎的&#xff0c;因為平臺需要更多SKU產品&#xff0c;去吸引買家&#xff0c;鋪貨這個時候是最好的也是能最快的成長起…

ife 零基礎學院 day 2

第二天&#xff1a;給自己做一個在線簡歷吧 最后的驗證&#xff0c;提出了幾個問題&#xff0c;嘗試解答一下 HTML是什么&#xff0c;HTML5是什么 HTML的定義摘抄自w3school的HTML 簡介 HTML 是用來描述網頁的一種語言。 HTML 指的是超文本標記語言 (Hyper Text Markup Langua…