環境介紹
技術棧 | 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:既可以數字簽名又可以加密???