Java如何遠程登錄到服務器中執行命令

為什么需要遠程登錄執行?

? 我們有時候通過業務代碼會關聯一些東西,那么在這個時候做完操作后有可能需要去其他服務器上執行一些命令,例如我們更換了什么文件,然后需要重啟另一個服務,那么這個時候就需要我們去遠程執行命令了。

如何遠程執行命令?

? 有兩種方式,我們可以使用jsch和ganymed來進行實現,兩個包都是對SSH2的封裝,能夠幫助我們遠程連接服務器,并且執行命令。

jsch

? 引入依賴

<!-- https://mvnrepository.com/artifact/com.jcraft/jsch -->
<dependency><groupId>com.jcraft</groupId><artifactId>jsch</artifactId><version>0.1.55</version>
</dependency>

遠程執行命令

? 首先新建工具類

package com.test.boot.utils;import com.jcraft.jsch.*;
import lombok.Getter;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;/*** @Author BigKang* @Date 2020/12/14 5:45 下午* @Motto 仰天大笑擼碼去, 我輩豈是蓬蒿人* @Summarize Jsch工具類*/
@Slf4j
@Getter
@Setter
public class JschUtil {/*** 主機IP*/private String host;/*** 默認端口*/private int port;/*** 用戶名*/private String username;/*** 密碼*/private String password;/*** 設置編碼格式*/private String charset;/*** JSch對象*/private JSch jsch;/*** 會話Session*/private Session session;/*** 默認端口號*/private static final Integer DEFAULT_PORT = 22;/*** 默認編碼*/private static final String DEFAULT_CHARSET = "UTF-8";/*** 構造方法*/public JschUtil() {}/*** 構造方法** @param host     HostIp地址* @param port     端口號* @param username 用戶名* @param password 密碼* @param charset  編碼*/public JschUtil(String host, int port, String username, String password, String charset) {this.host = host;this.port = port;this.username = username;this.password = password;this.charset = charset;}/*** 構造方法** @param host     HostIp地址* @param port     端口號* @param username 用戶名* @param password 密碼*/public JschUtil(String host, int port, String username, String password) {this.host = host;this.port = port;this.username = username;this.password = password;this.charset = DEFAULT_CHARSET;}/*** 構造方法** @param host     HostIp地址* @param username 用戶名* @param password 密碼*/public JschUtil(String host, String username, String password) {this.host = host;this.port = DEFAULT_PORT;this.username = username;this.password = password;this.charset = DEFAULT_CHARSET;}/*** 連接到指定的IP** @throws JSchException*/private void connect() {// 連接到SSH服務器try {jsch = new JSch();session = jsch.getSession(username, host, port);session.setPassword(password);java.util.Properties config = new java.util.Properties();config.put("StrictHostKeyChecking", "no");session.setConfig(config);session.setTimeout(10000);session.connect();log.debug("SSH2 Client:{} Success", host);} catch (Exception e) {throw new RuntimeException("連接SSH失敗!");}}/*** 關閉連接*/public void close() {// 關閉Session會話,SFTP使用同一個Session會隨之關閉session.disconnect();}/*** 執行Command命令* @param command 命令字符串* @return*/public String execCommand(String command) {connect();ChannelExec exec = null;InputStream in = null;BufferedReader reader = null;StringBuffer result = new StringBuffer();try {exec = (ChannelExec) session.openChannel("exec");exec.setCommand(command);exec.connect();in = exec.getInputStream();reader = new BufferedReader(new InputStreamReader(in));String tmpStr = "";while ((tmpStr = reader.readLine()) != null) {result.append(new String(tmpStr.getBytes("gbk"), "UTF-8")).append("\n");}} catch (IOException | JSchException ioException) {ioException.printStackTrace();}finally {try {reader.close();in.close();exec.disconnect();close();}catch (Exception e){log.error("Close SSH Command Failure!");}}return result.toString();}}

? 然后調用工具類即可

        JschUtil jschUtil = new JschUtil("192.168.1.11",22,"root","root123");String s = jschUtil.execCommand("cd && ls");System.out.println(s);

Java方式打造SSH客戶端

import com.jcraft.jsch.*;import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Arrays;
import java.util.Scanner;
import java.util.concurrent.atomic.AtomicBoolean;public class Test {private static Object object = new Object();public static void main(String[] args) throws IOException, JSchException, InterruptedException {java.util.Properties config = new java.util.Properties();config.put("StrictHostKeyChecking", "no");JSch jsch = new JSch();// 設置用戶名,地址,端口號Session session = jsch.getSession("bigkang", "39.108.158.33", 22);// 設置密碼session.setPassword("Kangbaba666");session.setConfig(config);session.connect();// 設置管道類型為shellChannelShell channel = (ChannelShell) session.openChannel("shell");channel.setPty(true);channel.connect();// 輸入輸出流InputStream inputStream = channel.getInputStream();OutputStream outputStream = channel.getOutputStream();Scanner scanner = new Scanner(System.in);scanner.useDelimiter("\n");AtomicBoolean flag = new AtomicBoolean(true);new Thread(() -> {//如果沒有數據來,線程會一直阻塞在這個地方等待數據。try {byte[] buffer = new byte[1024];int i = 0;//如果沒有數據來,線程會一直阻塞在這個地方等待數據。while ((i = inputStream.read(buffer)) != -1) {String str = new String(Arrays.copyOfRange(buffer, 0, i), "UTF-8");System.out.print(str);}System.out.println("連接斷開");flag.set(false);inputStream.close();outputStream.close();channel.disconnect();session.disconnect();} catch (IOException e) {e.printStackTrace();}}, "ReadThread").start();// 循環向輸入流寫入while (flag.get()) {String next = scanner.next();// 命令加上\r表示回車next += "\r";if(channel.getExitStatus() == -1) {// 寫入outputStream.write(next.getBytes(), 0, next.length());outputStream.flush();}else {System.out.println("退出登錄");}}}

ganymed

本地執行Shell

    public String execShell(String command) throws IOException {Process process = null;BufferedReader br = null;String line = null;String[] cmd;String osName = System.getProperty("os.name");if (osName.startsWith("Windows")) {cmd = new String[3];if (osName.equals("Windows 95")) {cmd[0] = "command.com";} else {cmd[0] = "cmd.exe";}cmd[1] = "/C";cmd[2] = command;} else if (osName.equals("Linux")) {cmd = new String[3];cmd[0] = "/bin/sh";cmd[1] = "-c";cmd[2] = command;} else if (osName.contains("Mac")) {cmd = new String[3];cmd[0] = "/bin/sh";cmd[1] = "-c";cmd[2] = command;} else {cmd = new String[1];cmd[0] = command;}process = Runtime.getRuntime().exec(cmd);br = new BufferedReader(new InputStreamReader(process.getInputStream(), Charset.forName("GBK")));StringBuilder sb = new StringBuilder();while ((line = br.readLine()) != null) {sb.append(line + "\n");}return sb.toString();}

The end.

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

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

相關文章

什么是 PoW(工作量證明,Proof of Work)

共識算法&#xff08;Consensus Algorithm&#xff09;是區塊鏈的“心臟”&#xff0c;它決定了多個節點在沒有中央機構的前提下&#xff0c;如何就“誰來記賬”達成一致。 什么是 PoW&#xff08;工作量證明&#xff0c;Proof of Work&#xff09; 定義&#xff1a; 工作量證…

Excel 中我們輸入的到底是什么?是數字、文本,還是日期?

簡單來說&#xff0c;Excel主要通過兩種方式來“猜測”你輸入的是什么&#xff1a;你的輸入內容 和 單元格的默認對齊方式。 一、三大核心數據類型&#xff1a;數字、文本、日期 1. 數字 (Number) 是什么&#xff1a;可以進行數學運算的數值。包括整數、小數、百分比、科學計…

【Linux】理解進程狀態與優先級:操作系統中的調度原理

Linux相關知識點可以通過點擊以下鏈接進行學習一起加油&#xff01;初識指令指令進階權限管理yum包管理與vim編輯器GCC/G編譯器make與Makefile自動化構建GDB調試器與Git版本控制工具Linux下進度條馮諾依曼體系與計算機系統架構進程概念與 fork 函數 操作系統通過進程調度來有效…

【Next Token Prediction】VLM模型訓練中數據集標簽預處理詳解

源代碼來自&#xff1a;https://github.com/huggingface/nanoVLM/blob/main/data/collators.py 詳解如下所示&#xff1a; import torch#-------------------------------# # 主要是在數據加載器的構建中被使用 #-------------------------------#class BaseCollator(object)…

Istio 簡介

Istio 簡介 什么是 Istio Istio 是一個開源的 服務網格&#xff08;Service Mesh&#xff09; 框架&#xff0c;由 Google、IBM 和 Lyft 聯合開發&#xff0c;目前屬于 CNCF&#xff08;云原生計算基金會&#xff09;項目。它主要用于管理和連接微服務架構中的服務&#xff0…

融云在華為開發者大會分享智能辦公平臺的鴻蒙化探索實踐

6 月 20 日-22 日&#xff0c;“華為開發者大會&#xff08;HDC 2025&#xff09;”在東莞隆重召開&#xff0c;融云受邀出席并在“政企內部應用論壇”發表主旨演講。 鴻蒙為千行百業的生態伙伴創新帶來了獨特的歷史機遇&#xff0c;其蓬勃發展也為我國數字經濟高質量發展提供…

滾珠導軌如何助力自動化生產實現高質量輸出?

在自動化生產線的蓬勃發展中&#xff0c;高效、精準與穩定是核心追求。滾珠導軌作為關鍵的傳動部件&#xff0c;以其獨特的優勢&#xff0c;在眾多自動化生產場景里大放異彩&#xff0c;為生產流程的優化和產品質量的提升顯著提高設備系統的穩定性和可靠性。 汽車自動化裝配線 …

消息隊列的推拉模式詳解:實現原理與代碼實戰

消息隊列是現代分布式系統中不可或缺的中間件&#xff0c;它通過"生產者-消費者"模式實現了系統間的解耦和異步通信。本文將深入探討消息隊列中的兩種核心消息傳遞模式&#xff1a;推送(Push)和拉取(Pull)&#xff0c;并通過代碼示例展示它們的實現方式。 目錄 消息…

OpenCV圖像噪點消除五大濾波方法

在數字圖像處理中&#xff0c;噪點消除是提高圖像質量的關鍵步驟。本文將基于OpenCV庫&#xff0c;詳細講解五種經典的圖像去噪濾波方法&#xff1a;均值濾波、方框濾波、高斯濾波、中值濾波和雙邊濾波&#xff0c;并通過豐富的代碼示例展示它們的實際應用效果。 一、圖像噪點…

Rust宏和普通函數的區別

Rust 中的宏&#xff08;macro&#xff09;和普通函數有以下核心區別&#xff0c;分別從用途、擴展方式、性能影響和語法特征等多個方面來解釋&#xff1a; &#x1f4cc; 1. 定義方式 項目宏函數定義方式macro_rules! 或 macro&#xff08;新版&#xff09;fn 關鍵字調用方式…

基于Qt C++的影像重采樣批處理工具設計與實現

摘要 本文介紹了一種基于Qt C++框架開發的高效影像重采樣批處理工具。該工具支持按分辨率(DPI) 和按縮放倍率兩種重采樣模式,提供多種插值算法選擇,具備強大的批量處理能力和直觀的用戶界面。工具實現了影像處理的自動化流程,顯著提高了圖像處理效率,特別適用于遙感影像處…

TypeScript 中的 WebSocket 入門

如何開始使用 Typescript 和 React 中的 WebSockets 創建一個簡單的聊天應用程序 示例源碼&#xff1a;ws 下一篇&#xff1a;https://blog.csdn.net/hefeng_aspnet/article/details/148898147 介紹 WebSocket 是一項我目前還沒有在工作中使用過的技術&#xff0c;但我知道…

TMS汽車熱管理系統HILRCP解決方案

TMS汽車熱管理系統介紹 隨著汽車電動化和智能化的發展&#xff0c;整車能量管理內容增多&#xff0c;對汽車能量管理的要求也越來越高&#xff0c;從整車層面出發對各子系統進行能量統籌管理將成為電動汽車未來的發展趨勢&#xff0c;其中汽車熱管理是整車能量管理的重要組成部…

CCleaner Pro v6.29.11342 綠色便攜版

CCleaner Pro v6.29.11342 綠色便攜版 CCleaner是Piriform&#xff08;梨子公司&#xff09;最著名廣受好評的系統清理優化及隱私保護軟件&#xff0c;也是該公司主打和首發產品&#xff0c;它體積小、掃描速度快&#xff0c;具有強大的自定義清理規則擴展能力。CCleaner是一款…

不做手機控APP:戒掉手機癮,找回專注與自律

在當今數字化時代&#xff0c;手機已經成為我們生活中不可或缺的一部分。然而&#xff0c;過度依賴手機不僅會分散我們的注意力&#xff0c;影響學習和工作效率&#xff0c;還可能對身心健康造成負面影響。為了幫助用戶擺脫手機依賴&#xff0c;重拾自律和專注&#xff0c;一款…

Go 語言中的接口

1、接口與鴨子類型 在 Go 語言中&#xff0c;接口&#xff08;interface&#xff09;是一個核心且至關重要的概念。它為構建靈活、可擴展的軟件提供了堅實的基礎。要深入理解 Go 的接口&#xff0c;我們必須首先了解一個在動態語言中非常普遍的設計哲學——鴨子類型&#xff0…

在項目中如何巧妙使用緩存

緩存 對于經常訪問的數據&#xff0c;每次都從數據庫&#xff08;硬盤&#xff09;中獲取是比較慢&#xff0c;可以利用性能更高的存儲來提高系統響應速度&#xff0c;俗稱緩存 。合理使用緩存可以顯著降低數據庫的壓力、提高系統性能。 那么&#xff0c;什么樣的數據適合緩存…

SLAM中的非線性優化-2D圖優化之零空間(十五)

這節在進行講解SLAM中一個重要概念&#xff0c;零空間&#xff0c;講它有啥用呢&#xff1f;因為SLAM中零空間的存在&#xff0c;才需要FEJ或固定約束存在&#xff0c;本節內容不屬于2D圖優化獨有&#xff0c;先看看什么是零空間概念&#xff1b;零空間是一個核心概念&#xff…

如何解決本地DNS解析失敗問題?以連接AWS ElastiCache Redis為例

在云服務開發中,DNS解析問題常常成為困擾開發者的隱形障礙。本文將通過AWS ElastiCache Redis連接失敗的實際案例,詳細介紹如何診斷和解決DNS解析問題,幫助你快速恢復服務連接。 引言 在使用 telnet 或 redis-cli 連接 AWS ElastiCache Redis 時,有時會遇到類似以下錯誤:…

探索釘釘生態中的宜搭:創建與分享應用的新視界

在當今快速發展的數字化時代&#xff0c;企業對于高效協作和信息管理的需求日益增長。作為阿里巴巴集團旗下的智能工作平臺&#xff0c;釘釘不僅為企業提供了強大的溝通工具&#xff0c;其開放的生態系統也為用戶帶來了無限可能。其中&#xff0c;宜搭&#xff08;YiDa&#xf…