Java实现远程连接服务器并执行命令的方法

2024-08-27 07:32

本文主要是介绍Java实现远程连接服务器并执行命令的方法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一.Apache sshd java实现远程连接服务器并执行命令的方法

先描述一下场景,本人在通信领域工作,暂时负责命令行这一块业务,公司使用apache sshd在Java应用中嵌入sshd服务,实现了通过SecureCRT等工具调用自定义的命令的功能,现想把这一套调用过程移植到web页面,通过接口实现命令的下发,网上查找了大量资料,好多资料年代比较久远,还是花了不少时间,最终实现了该功能。

思路如下:通过两个接口实现该功能,通过startClient启动客户端,实现客户端的连接,并用token作为唯一标识,把输入输出流保存在map中,map里的数据会在客户端断开时清除对应token的数据,客户端启动后,通过sendCommand下发命令,根据token从map中取出对应的流,通过流写入命令下发再从输出流里获取返回的结果,我在代码里写了一段while死循环,是为了保证结果已经完全写入到流里再获取结果,在获取结果前reset保证每次调用获取的都是当前命令下发后返回的结果,如果涉及分布式部署,可以把map中的数据放在redis中。

代码如下:

依赖:

<dependency><groupId>org.apache.sshd</groupId><artifactId>sshd-core</artifactId><version>0.8.0</version>
</dependency>

 

package com.datang.demo.controller;import com.datang.demo.model.ConnectionInfo;
import org.apache.sshd.ClientChannel;
import org.apache.sshd.ClientSession;
import org.apache.sshd.SshClient;
import org.springframework.web.bind.annotation.*;import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
import java.util.HashMap;
import java.util.Map;@RestController
@CrossOrigin
@RequestMapping("/sshd")
public class SSHController {Map<String, PipedOutputStream> inputMap = new HashMap<String, PipedOutputStream>();Map<String, ByteArrayOutputStream> outputMap = new HashMap<String, ByteArrayOutputStream>();/*** 启动客户端* @param connectionInfo*/@PostMapping(value = "/startClient")public void startClient(@RequestBody ConnectionInfo connectionInfo){String host = connectionInfo.getHost();int port = connectionInfo.getPost();String username = connectionInfo.getUsername();String password = connectionInfo.getPassword();String token = connectionInfo.getToken();SshClient client = SshClient.setUpDefaultClient();client.start();try {ClientSession session = client.connect(host, port).await().getSession();if(session.authPassword(username, password).await().isSuccess()){ClientChannel channel = session.createShellChannel();PipedOutputStream pipedIn = new PipedOutputStream();channel.setIn(new PipedInputStream(pipedIn));ByteArrayOutputStream out = new ByteArrayOutputStream();channel.setOut(out);ByteArrayOutputStream err = new ByteArrayOutputStream();channel.setErr(err);channel.open();inputMap.put(token, pipedIn);outputMap.put(token, out);channel.waitFor(ClientChannel.CLOSED, 0);inputMap.remove(token);outputMap.remove(token);channel.close(false);session.close(false);client.stop();}} catch (Exception e) {e.printStackTrace();}}/*** 找到对应客户端并下发命令* @param connectionInfo*/@PostMapping(value = "/sendCommand")public String sendCommand(@RequestBody ConnectionInfo connectionInfo)  {String command = connectionInfo.getCommand();String token = connectionInfo.getToken();PipedOutputStream pipedIn = inputMap.get(token);ByteArrayOutputStream out = outputMap.get(token);if(pipedIn != null && out != null){try {if(command != null){pipedIn.write(command.getBytes());pipedIn.flush();}while (true){byte[] a = out.toByteArray();Thread.sleep(500);byte[] b = out.toByteArray();if(b.length == a.length){out.reset();return new String(b, "GBK");}}} catch (IOException e) {e.printStackTrace();} catch (InterruptedException e){e.printStackTrace();}}return "";}
}

 

package com.datang.demo.model;public class ConnectionInfo {// 服务端ipprivate String host;// 服务端端口private int post;// 用户名private String username;// 密码private String password;// 下发的命令private String command;// 每个客户端的唯一标识private String token;public String getHost() {return host;}public void setHost(String host) {this.host = host;}public int getPost() {return post;}public void setPost(int post) {this.post = post;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public String getCommand() {return command;}public void setCommand(String command) {this.command = command;}public String getToken() {return token;}public void setToken(String token) {this.token = token;}
}

参考:

https://tangmingjie2009.iteye.com/blog/2037048

https://blog.csdn.net/jackie_xiaonan/article/details/8749035

https://blog.csdn.net/jackie_xiaonan/article/details/8907855 

二.Ganymed SSH-2 java实现远程连接服务器并执行命令的方法(Windows和Linux)

依赖: 

<dependency><groupId>ch.ethz.ganymed</groupId><artifactId>ganymed-ssh2</artifactId><version>262</version>
</dependency>

具体实现参考https://my.oschina.net/liuyuanyuangogo/blog/186159

这篇关于Java实现远程连接服务器并执行命令的方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1111028

相关文章

使用Python和OpenCV库实现实时颜色识别系统

《使用Python和OpenCV库实现实时颜色识别系统》:本文主要介绍使用Python和OpenCV库实现的实时颜色识别系统,这个系统能够通过摄像头捕捉视频流,并在视频中指定区域内识别主要颜色(红... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间详解

PostgreSQL中MVCC 机制的实现

《PostgreSQL中MVCC机制的实现》本文主要介绍了PostgreSQL中MVCC机制的实现,通过多版本数据存储、快照隔离和事务ID管理实现高并发读写,具有一定的参考价值,感兴趣的可以了解一下... 目录一 MVCC 基本原理python1.1 MVCC 核心概念1.2 与传统锁机制对比二 Postg

SpringBoot整合Flowable实现工作流的详细流程

《SpringBoot整合Flowable实现工作流的详细流程》Flowable是一个使用Java编写的轻量级业务流程引擎,Flowable流程引擎可用于部署BPMN2.0流程定义,创建这些流程定义的... 目录1、流程引擎介绍2、创建项目3、画流程图4、开发接口4.1 Java 类梳理4.2 查看流程图4

一文详解如何在idea中快速搭建一个Spring Boot项目

《一文详解如何在idea中快速搭建一个SpringBoot项目》IntelliJIDEA作为Java开发者的‌首选IDE‌,深度集成SpringBoot支持,可一键生成项目骨架、智能配置依赖,这篇文... 目录前言1、创建项目名称2、勾选需要的依赖3、在setting中检查maven4、编写数据源5、开启热

C++中零拷贝的多种实现方式

《C++中零拷贝的多种实现方式》本文主要介绍了C++中零拷贝的实现示例,旨在在减少数据在内存中的不必要复制,从而提高程序性能、降低内存使用并减少CPU消耗,零拷贝技术通过多种方式实现,下面就来了解一下... 目录一、C++中零拷贝技术的核心概念二、std::string_view 简介三、std::stri

Python常用命令提示符使用方法详解

《Python常用命令提示符使用方法详解》在学习python的过程中,我们需要用到命令提示符(CMD)进行环境的配置,:本文主要介绍Python常用命令提示符使用方法的相关资料,文中通过代码介绍的... 目录一、python环境基础命令【Windows】1、检查Python是否安装2、 查看Python的安

C++高效内存池实现减少动态分配开销的解决方案

《C++高效内存池实现减少动态分配开销的解决方案》C++动态内存分配存在系统调用开销、碎片化和锁竞争等性能问题,内存池通过预分配、分块管理和缓存复用解决这些问题,下面就来了解一下... 目录一、C++内存分配的性能挑战二、内存池技术的核心原理三、主流内存池实现:TCMalloc与Jemalloc1. TCM

OpenCV实现实时颜色检测的示例

《OpenCV实现实时颜色检测的示例》本文主要介绍了OpenCV实现实时颜色检测的示例,通过HSV色彩空间转换和色调范围判断实现红黄绿蓝颜色检测,包含视频捕捉、区域标记、颜色分析等功能,具有一定的参考... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间

Java对异常的认识与异常的处理小结

《Java对异常的认识与异常的处理小结》Java程序在运行时可能出现的错误或非正常情况称为异常,下面给大家介绍Java对异常的认识与异常的处理,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参... 目录一、认识异常与异常类型。二、异常的处理三、总结 一、认识异常与异常类型。(1)简单定义-什么是

SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志

《SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志》在SpringBoot项目中,使用logback-spring.xml配置屏蔽特定路径的日志有两种常用方式,文中的... 目录方案一:基础配置(直接关闭目标路径日志)方案二:结合 Spring Profile 按环境屏蔽关