Java 远程执行服务器上的命令
在Java中使用JSch
库执行远程服务器上的命令是一种常见的做法,特别是在需要自动化运维任务或者进行远程文件操作时。以下是基于Codekru
网站提供的示例,展示如何使用JSch
库在远程服务器上执行单个或多个命令。
准备工作
首先,确保您的项目中已经包含了JSch
库的依赖。如果您使用Maven作为构建工具,可以在pom.xml
文件中添加如下依赖:
<dependency><groupId>com.jcraft</groupId><artifactId>jsch</artifactId><version>0.1.55</version>
</dependency>
连接到远程服务器
在执行命令之前,需要先建立与远程服务器的SSH连接。以下是一个简单的连接示例:
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.JSchException;public class SSHConnectionExample {public static void main(String[] args) {try {JSch jsch = new JSch();String user = "codekru"; // 您的用户名String host = "127.0.0.1"; // 您的远程服务器地址int port = 22; // 默认SSH端口String key = "/path/to/your/privatekey.pem"; // 您的私钥路径jsch.addIdentity(key);Session session = jsch.getSession(user, host, port);session.setConfig("StrictHostKeyChecking", "no");session.setTimeout(15000); // 设置超时时间session.connect();System.out.println("Connected");// 在这里您可以执行其他操作,如执行命令或传输文件session.disconnect(); // 断开连接} catch (JSchException e) {e.printStackTrace();}}
}
执行单个命令
一旦建立了SSH连接,您就可以使用JSch
库执行远程命令。以下是一个简单的示例:
import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelExec;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.JSchException;public class ExecuteSingleCommandExample {public static void main(String[] args) {try {JSch jsch = new JSch();String user = "codekru"; // 您的用户名String host = "127.0.0.1"; // 您的远程服务器地址int port = 22; // 默认SSH端口String key = "/path/to/your/privatekey.pem"; // 您的私钥路径jsch.addIdentity(key);Session session = jsch.getSession(user, host, port);session.setConfig("StrictHostKeyChecking", "no");session.setTimeout(15000); // 设置超时时间session.connect();String command = "ls -l"; // 您要执行的命令Channel channel = session.openChannel("exec");((ChannelExec) channel).setCommand(command);channel.setInputStream(null); // 这个方法必须在connect之前调用((ChannelExec) channel).setErrStream(System.err);InputStream inputStream = channel.getInputStream();channel.connect();byte[] byteObject = new byte[10240];while (true) {while (inputStream.available() > 0) {int readByte = inputStream.read(byteObject, 0, 1024);if (readByte < 0)break;String result = new String(byteObject, 0, readByte);System.out.print(result);}if (channel.isClosed())break;}channel.disconnect();System.out.println("Disconnected channel " + channel.getExitStatus());session.disconnect(); // 断开连接} catch (JSchException e) {e.printStackTrace();}}
}
执行多个命令
如果您需要在同一个SSH连接中执行多个命令,可以将这些命令使用分号(;
)隔开。以下是一个执行多个命令的示例:
import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelExec;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.JSchException;public class ExecuteMultipleCommandsExample {public static void main(String[] args) {try {JSch jsch = new JSch();String user = "codekru"; // 您的用户名String host = "127.0.0.1"; // 您的远程服务器地址int port = 22; // 默认SSH端口String key = "/path/to/your/privatekey.pem"; // 您的私钥路径jsch.addIdentity(key);Session session = jsch.getSession(user, host, port);session.setConfig("StrictHostKeyChecking", "no");session.setTimeout(15000); // 设置超时时间session.connect();String command = "cd /Users/codekru/jsch-tutorial/; cd ..; ls -l"; // 多个命令Channel channel = session.openChannel("exec");((ChannelExec) channel).setCommand(command);channel.setInputStream(null); // 这个方法必须在connect之前调用((ChannelExec) channel).setErrStream(System.err);InputStream inputStream = channel.getInputStream();channel.connect();byte[] byteObject = new byte[10240];while (true) {while (inputStream.available() > 0) {int readByte = inputStream.read(byteObject, 0, 1024);if (readByte < 0)break;String result = new String(byteObject, 0, readByte);System.out.print(result);}if (channel.isClosed())break;}channel.disconnect();System.out.println("Disconnected channel " + channel.getExitStatus());session.disconnect(); // 断开连接} catch (JSchException e) {e.printStackTrace();}}
}
处理无效命令
当您尝试执行一个无效的命令时,JSch
库会捕获错误并将错误信息输出到标准错误流。以下是一个执行无效命令的示例:
import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelExec;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.JSchException;public class HandleInvalidCommandExample {public static void main(String[] args) {try {JSch jsch = new JSch();String user = "codekru"; // 您的用户名String host = "127.0.0.1"; // 您的远程服务器地址int port = 22; // 默认SSH端口String key = "/path/to/your/privatekey.pem"; // 您的私钥路径jsch.addIdentity(key);Session session = jsch.getSession(user, host, port);session.setConfig("StrictHostKeyChecking", "no");session.setTimeout(15000); // 设置超时时间session.connect();String command = "qwerty"; // 无效命令Channel channel = session.openChannel("exec");((ChannelExec) channel).setCommand(command);channel.setInputStream(null); // 这个方法必须在connect之前调用((ChannelExec) channel).setErrStream(System.err);InputStream inputStream = channel.getInputStream();channel.connect();byte[] byteObject = new byte[10240];while (true) {while (inputStream.available() > 0) {int readByte = inputStream.read(byteObject, 0, 1024);if (readByte < 0)break;String result = new String(byteObject, 0, readByte);System.out.print(result);}if (channel.isClosed())break;}channel.disconnect();System.out.println("Disconnected channel " + channel.getExitStatus());session.disconnect(); // 断开连接} catch (JSchException e) {e.printStackTrace();}}
}
在执行无效命令时,控制台将输出错误信息,例如:
connected
bash: qwerty: command not found
Disconnected channel 127
总结
通过上述示例,您可以了解如何使用JSch
库在远程服务器上执行单个或多个命令。无论是执行有效的命令还是处理无效命令,都可以按照上述步骤实现。记得在实际使用中替换示例中的占位符为真实的用户名、IP地址、端口号、私钥路径以及命令。
相关文章:
Java 远程执行服务器上的命令
在Java中使用JSch库执行远程服务器上的命令是一种常见的做法,特别是在需要自动化运维任务或者进行远程文件操作时。以下是基于Codekru网站提供的示例,展示如何使用JSch库在远程服务器上执行单个或多个命令。 准备工作 首先,确保您的项目中已…...

3DMax基础- 创建基础模型
目录 零.软件简介 一. 标准基本型 长方体 圆锥体 球体 圆柱体 管状体 圆环 四棱锥 茶壶 平面编辑 加强型文本 二. 扩展基本体 三.复合对象 变形 散布 一致 连接 图形合并 布尔 并集 合并 交集 差集 四.门和窗 门 窗 植物,栏杆,墙 零.软件简介 3…...

JavaScript 知识点(从基础到进阶)
🌏个人博客主页:心.c 前言:JavaScript已经学完了,和大家分享一下我的笔记,希望大家可以有所收获,花不多说,开干!!! 🔥🔥ǵ…...

计算机网络知识点复习——TCP协议的三次握手与四次挥手(连接与释放)
TCP协议的三次握手与四次挥手(连接与释放) 一、前言二、简单的知识准备1. TCP协议的主要特点2. TCP报文段 三、TCP连接的建立(三次握手)四、TCP连接的释放(四次挥手)五、TCP连接与释放的总结六、结束语 一、…...

SpringDataJPA系列(7)Jackson注解在实体中应用
SpringDataJPA系列(7)Jackson注解在实体中应用 常用的Jackson注解 Springboot中默认集成的是Jackson,我们可以在jackson依赖包下看到Jackson有多个注解 一般常用的有下面这些: 一个实体的示例 测试方法如下: 按照上述图片中的序号做个简…...
【Spring Boot 3】【Web】统一封装 HTTP 响应体
【Spring Boot 3】【Web】统一封装 HTTP 响应体 背景介绍开发环境开发步骤及源码工程目录结构总结背景 软件开发是一门实践性科学,对大多数人来说,学习一种新技术不是一开始就去深究其原理,而是先从做出一个可工作的DEMO入手。但在我个人学习和工作经历中,每次学习新技术总…...
Linux如何做ssh反向代理
SSH反向代理是一种通过SSH协议实现的安全远程访问方式,它允许客户端通过SSH连接到一台具有公网IP的代理服务器,然后这台代理服务器再将请求转发给内部网络中的目标主机。以下是实现SSH反向代理的步骤: 一、准备工作 确保服务器配置ÿ…...

Verilog语法+:和-:有什么用?
Verilog语法:和-:主要用于位选择,可以让代码更简洁。 一、位选择基础 在Verilog中,位选择可以通过直接索引来实现,例如: reg [7:0] data; wire select_a; wire [2:0] select_b; assign select_a data[3]; assign select_b …...
stm32F103 串口2 中断 无法接收指定字符串 [已解决]
stm32F103 串口2中断接收指定字符串 USART 初始化和中断配置示例中断处理函数示例关键点总结 确保在串口配置中正确使能空闲中断 ( USART_IT_IDLE) 是关键。这个中断可以帮助你在串口接收一帧数据完成后,进行相应的处理和分析。 为了确保你在串口配置时能避免类似问…...

Matlab/Simulink和AMEsim联合仿真(以PSO-PID算法为例)
目录 安装软件和配置环境变量 Matlab/Simulink和AMEsim联合仿真详细流程 非常重要的一点 Simulink模型和AMEsim模型用S-Function建立连接 从AMEsim软件打开Matlab Matlab里的设置 Matlab的.m文件修改(对于PSO-PID算法) 运行程序 我印象中好像做过…...

超声波测距模块HC-SR04(基于STM32F103C8T6HAL库)
超声波测距模块参考资料 1.电路连接及引脚配置 触发信号PA3只需要输出10us的高电平,所以直接设置成 普通的GPIO端口即可;回响信号使用外部中断,上升沿信号产生外部中断,打开定时器,下降沿再产生一次中断,读…...
Go语言结构体和元组全面解析
Go语言中的复合类型与其应用 在编程中,标准类型虽然方便,但无法满足所有需求。Go通过支持结构体和元组类型,为开发者提供了自定义数据类型的能力。本文将介绍如何定义结构体、如何使用指针操作结构体、如何通过元组返回多个值等内容…...

集成电路学习:什么是SDK软件开发工具包
SDK:软件开发工具包 SDK,即Software Development Kit(软件开发工具包),是一套由软件提供商或其他组织提供的开发工具集合。这些工具旨在帮助开发者更快速、更便捷地创建、测试和部署软件应用程序。以下是对SDK的详细解…...
java后端如何发送http请求
用java后端发送请求需要用到的一个工具包为HttpClient。HttpClient是Apache的一个子项目,是高效的、功能丰富的支持HTTP协议的客户端编程工具包。 引入依赖 <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId&…...

装WebVideoCreator记录
背景,需要在docker容器内配置WebVideoCreator环境,配置npm、node.js WebVideoCreator地址:https://github.com/Vinlic/WebVideoCreator 配置环境,使用这个教程: linux下安装node和npm_linux离线安装npm-CSDN博客 1…...
【编程底层思考】什么是GC Roots
在Java虚拟机(JVM)中,GC Roots是垃圾收集(Garbage Collection,GC)过程中的起点,用于确定对象是否可被回收。GC Roots集合是一组必须活跃的(即必须保留在内存中的)引用&am…...

[STL --stack_queue详解]stack、queue,deque,priority_queue,容器适配器
stack stack介绍 1、stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。 2、stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供…...

240907-Gradio插入Mermaid流程图并自适应浏览器高度
A. 最终效果 B. 示例代码 import gradio as grmermaid_code """ <iframe srcdoc <!DOCTYPE html> <html><head><meta charset"utf-8" /><meta name"viewport" content"widthdevice-width" />…...

ubuntu 安装python3 教程
本篇教程,主要介绍如何在Ubuntu上安装python3教程。 1、查看是否有python 在安装前,首先看看自己系统上,是否存在python环境,可能有些系统,默认就安装过python,如果已经有python了,可以直接跳过安装教程。 2、安装步骤 apt update && apt install -y python3 p…...
NOR Flash、NAND Flash……
存储类型描述Compact Flash一种用于便携式电子设备的数据存储设备,于1994年由SanDisk公司推出。SRAM静态随机存取存储器,不需要刷新电路即能保存数据,速度快但集成度低、功耗大。PSRAM伪静态随机存取存储器,结合了SRAM和DRAM的特点…...

SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八
现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...
如何为服务器生成TLS证书
TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...
【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)
要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况,可以通过以下几种方式模拟或触发: 1. 增加CPU负载 运行大量计算密集型任务,例如: 使用多线程循环执行复杂计算(如数学运算、加密解密等)。运行图…...

Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...

C++使用 new 来创建动态数组
问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...
《C++ 模板》
目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板,就像一个模具,里面可以将不同类型的材料做成一个形状,其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式:templa…...

[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.
ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #:…...
智能职业发展系统:AI驱动的职业规划平台技术解析
智能职业发展系统:AI驱动的职业规划平台技术解析 引言:数字时代的职业革命 在当今瞬息万变的就业市场中,传统的职业规划方法已无法满足个人和企业的需求。据统计,全球每年有超过2亿人面临职业转型困境,而企业也因此遭…...