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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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…