使用JSCH连接Linux系统并执行命令

2023-11-08

一、关于JSCH技术的简单描述

JSCH是SSH的一个纯Java实现。说直白点,就是一个远程连接你其他Linux或者Unix服务器的一个java代码包。其实就是我们使用jsch这个jar包来方便我们编写代码来连接自己linux系统的。
SSH:是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。
二、使用JSCH的基本操作步骤
1.首先当然是基于Eclipse或者Intellij IDEA。安装教程数不胜数,在这里略过。
2.下载jsch的jar包并导入自己的项目目录中。
https://mvnrepository.com/这个地址先下载jsch的jar包。
在这里插入图片描述
搜索jsch,找到一个合适的版本(就是使用人数比较多的版本,稳定)
在这里插入图片描述
点进去,再找到一个人数使用比较多的版本点击下载
在这里插入图片描述
下载
在这里插入图片描述
OK,下载完jar包之后在项目下新建一个folder文件夹,命名为lib(web项目在WEB-INF目录自带)。将jsch的jar包copy到lib目录下,后右键点击你的jar包,选择Build Path----->Add To Build Path。这样,jar包就已经导入你的项目中可以使用了。
3.编写jschutil工具类,用于连接Linux系统
代码如下:

/**
 * java 使用jsch远程链接linux 执行命令
 * @author Weikisa
 */
public class JSchUtil {
	private static JSch jsch;//定义jsch连接类
	private static Session session;
	private static String user = "root";//Linux系统的用户名
	private static String password = "R00tAtCT";//密码
	private static String host = "10.129.93.85";//測試IP,實際使用以輸入IP地址為准
	
	/**
	 * 首先连接服务器
	 * @throws JSchException
	 */
	public static void connect(String hostIP) throws JSchException {
		jsch = new JSch();//将jsch实例化
		session = jsch.getSession(user, hostIP, 22);//默认端口号为22端口,使用用户名user连接IP
		session.setPassword(password);//设置登录密码
		session.setConfig("StrictHostKeyChecking", "no");//是否使用密钥登录,一般默认为no
		session.connect(60 * 1000);
		
	}
	
	/**
	 *連接測試
	 */
	public static boolean connectTest(String hostIP) {
		boolean flag = false;
		try {
			connect(hostIP);
			flag = true;
			System.out.println("連接Linux成功");
		} catch (Exception e) {
			e.printStackTrace();
		} finally{
			session.disconnect();
		}
		return flag;
	}
}

创建完以上工具类后,我们可以自己写一个main方法来测试连接功能。

public static void main(String[] args) {
		JSchUtil jsch = new JSchUtil();
		jsch.connectTest("10.129.93.85");
		
	}

运行结果如下:
在这里插入图片描述
出现上述Console控制台的提示,说明我们已经可以通过java代码来连接Linux系统了。

三、实现java代码执行Linux的命令。

1.在你的JSchUtil工具类中 添加如下的新方法。

/**
	 * 连接服务器后执行相应的linux命令
	 * @param command
	 * @throws JSchException
	 */
	public boolean execCmd(String hostIP,String command) throws JSchException {
		connect(hostIP);//连接指定IP地址的Linux
		BufferedReader reader = null;
		Channel channel = null;//定义流通道
		try {
			while (command != null) {
				channel = session.openChannel("exec");
				((ChannelExec) channel).setCommand(command);
				channel.setInputStream(null);
				((ChannelExec) channel).setErrStream(System.err);
				// 获取流
				InputStream in = channel.getInputStream();//定义输入的通道
				channel.connect();//连接
				
				byte[] tmp = new byte[1024];
				
				
				while (true) {
		            while (in.available() > 0) {
		                int i = in.read(tmp, 0, 1024);
		                if (i < 0) break;
		                System.out.print(new String(tmp, 0, i));
		            }
		            if (channel.isClosed()) {
		                if (in.available() > 0) continue;
		                System.out.println("exit-status: " + channel.getExitStatus());
		                if(channel.getExitStatus()!=0){
		                	return false;
		                }
		                break;
		            }
//		            try {
//		                Thread.sleep(1000);
//		            } catch (Exception ee) {
//		            }
		        }
				channel.disconnect();
				session.disconnect();
				System.out.println("Linux指令執行結束");
				return true;
			}
		} catch (IOException e) {
			e.printStackTrace();
		} catch (JSchException e) {
			e.printStackTrace();
		} finally {// 最后流和连接的关闭
			try {
				reader.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		return true;
	}

添加完方法后,自然是进行测试。
这里我们使用简单的命令来测试命令是否执行成功。
2.在main方法中添加以下代码 ,用于测试

public static void main(String[] args) {
		JSchUtil jsch = new JSchUtil();
		try {
			jsch.execCmd("10.129.93.85", "mkdir /weikisa");
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("出現異常"+e.toString());
		}
	}	

执行结果如下:
在这里插入图片描述
结果exit-status: 0意味着执行过程没有异常,执行成功。
为了进一步验证,我们使用Putty(你也可以使用X-shell)连接上我们的Linux系统验证一下weikisa这个文件夹是否真的被创建出来。
在这里插入图片描述
看到weikisa已经创建在根目录下(“/”),说明我们的命令已经得以执行。
3.在执行一次删除命令,看看。
在这里插入图片描述
执行无误,我们再回到Linux系统下看看。
在这里插入图片描述
weikisa目录已经被删除了,说明基本的命令执行也可以实现了。

在最后附上JSchUtil的完整代码

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.util.Calendar;
import java.util.Random;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelExec;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;


/**
 * java 使用jsch远程链接linux 执行命令
 * @author Weikisa
 */
public class JSchUtil {
	private static JSch jsch;
	private static Session session;
	private static String user = "root";
	private static String password = "R00tAtCT";
	private static String host = "10.129.93.85";//測試IP,實際使用以輸入IP地址為准
	
	public static void main(String[] args) {
		JSchUtil jsch = new JSchUtil();
		try {
			jsch.execCmd("你的Linux的IP地址", "mkdir /weikisa");
			jsch.execCmd("你的Linux的IP地址", "rmdir /weikisa");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	/**
	 * 首先连接服务器
	 * @throws JSchException
	 */
	public static void connect(String hostIP) throws JSchException {
		jsch = new JSch();
		session = jsch.getSession(user, hostIP, 22);
		session.setPassword(password);
		session.setConfig("StrictHostKeyChecking", "no");
		session.connect(60 * 1000);
		
	}
	
	/**
	 *連接測試
	 */
	public static boolean connectTest(String hostIP) {
		boolean flag = false;
		try {
			jsch = new JSch();
			session = jsch.getSession(user, hostIP, 22);
			session.setPassword(password);
			session.setConfig("StrictHostKeyChecking", "no");
			session.connect(60 * 1000);
			flag = true;
			System.out.println("連接Linux成功");
		} catch (Exception e) {
			e.printStackTrace();
		} finally{
			session.disconnect();
		}
		return flag;
	}


	/**
	 * 连接服务器后执行相应的linux命令
	 * @param command
	 * @throws JSchException
	 */
	public boolean execCmd(String hostIP,String command) throws JSchException {
		connect(hostIP);
		BufferedReader reader = null;
		Channel channel = null;
		try {
			while (command != null) {
				channel = session.openChannel("exec");
				((ChannelExec) channel).setCommand(command);
				channel.setInputStream(null);
				((ChannelExec) channel).setErrStream(System.err);
				// 获取流
				InputStream in = channel.getInputStream();
				channel.connect();
				
				byte[] tmp = new byte[1024];
				
				
				while (true) {
		            while (in.available() > 0) {
		                int i = in.read(tmp, 0, 1024);
		                if (i < 0) break;
		                System.out.print(new String(tmp, 0, i));
		            }
		            if (channel.isClosed()) {
		                if (in.available() > 0) continue;
		                System.out.println("exit-status: " + channel.getExitStatus());
		                if(channel.getExitStatus()!=0){
		                	return false;
		                }
		                break;
		            }
//		            try {
//		                Thread.sleep(1000);
//		            } catch (Exception ee) {
//		            }
		        }
				channel.disconnect();
				session.disconnect();
				System.out.println("Linux指令執行結束");
				return true;
			}
		} catch (IOException e) {
			e.printStackTrace();
		} catch (JSchException e) {
			e.printStackTrace();
		} finally {// 最后流和连接的关闭
			try {
				reader.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
			System.out.println("finally結束");
		}
		return true;
	}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用JSCH连接Linux系统并执行命令 的相关文章

  • package.xml个人总结

    https zhuanlan zhihu com p 57030010 https blog csdn net sinat 16643223 article details 114067299 这是prometheus control功能包
  • 个人总结 - JS逆向解析

    目前加密的方式总结有下面几点 xff1a 对称加密 xff08 加密解密密钥相同 xff09 xff1a DES DES3 AES 非对称加密 xff08 分公钥私钥 xff09 xff1a RSA 信息摘要算法 签名算法 xff1a MD
  • Doxygen使用教程(个人总结)

    简介Doxygen 一 xff0e 什么是Doxygen Doxygen 是一个程序的文件产生工具 xff0c 可将程序中的特定批注转换成为说明文件 通常我们在写程序时 xff0c 或多或少都会写上批注 xff0c 但是对于其它人而言 xf
  • Fast-lio个人总结

    Lidar第一帧作为基坐标 1 lidar原始数据预处理默认不提取特征 xff0c 对原始数据间隔式 xff08 间隔3个点 xff09 降采样提取 2 imu初始化 惯性解算 误差分析 状态 协方差预测 3 Lidar与imu时间状态对齐
  • JAVA怎么替换html标签呢???

    之前遇见个需求 让我在下载文件时 把content里面的富文本存储的内容下载下来 但是又不能有html标签 那个我们怎们处理呢 废话不多说 上代码 StringBuffer stringBuffer new StringBuffer Str
  • 用Java去掉中文中括号【】,你学废了吗?

    大家好 今天我有多了一个需求 甲方爸爸让我取中文括号里的文本 这可怎么办嘛 费劲心思 i get do not bb show me code ok String msg sadasd 的范德萨发斯蒂芬斯蒂芬 打撒所所多多 String r
  • QT 信号和槽的使用笔记

    目录 信号和槽介绍 回调机制 信号槽机制 信号 槽 信号槽和直接调用效率问题 信号和槽的使用对比 QT5 写法 QT4 写法 总结 信号和槽介绍 信号与插槽机制 提供对象间的通信机制 可以取代原始的回调和消息映射机制 信号与槽是迅速的 类型
  • 域名简单认识

    什么是域名 域名 Domain Name 是由一串用 点 分隔的字符组成的Internet上某一台计算机或计算机组的名称 用于在数据传输时标识计算机的电子方位 有时也指地理位置 地理上的域名 指代有行政自主权的一个地方区域 域名是一个IP地
  • 基于unity+高通AR项目的一些总结

    今天 公司做的第一款AR项目终于在苹果appstore上架了 将近三个多月的踩坑和摸索也终于告一段落了 接下来就是不断的进行版本优化和更新 这将是一个漫长的过程 在此 对自己三个多月的开发做一个阶段性的总结 也希望能够帮到一些正在用unit
  • uni-app使用总结

    我在uni app遇到的问题 样式问题 1 组件和调用此组件的页面样式最好不要重名 不然会有样式覆盖问题 2 数据绑定变量的时候不能识别upx 可以转化 官网最新更正单位为rpx computed halfWidth return uni
  • 抽奖组件lucky-canvas

    https 100px net usage wx html 次组件可以画轮盘和九宫格 老虎机抽奖画面
  • nuxt.js服务端渲染使用flexible.js和postcss-px2rem实现移动端自适应—淘宝弹性布局方案(750px设计稿)

    在用vue做服务端渲染的时候需要对移动端做适配所以要用到postcss 2rem插件 第一步 首先下载flexible js 可加载阿里的cdn文件 http g tbcdn cn mtb lib flexible 0 3 4 flexib
  • 支付宝小程序中网络请求 my.request({}) 的用法

    支付宝小程序网络请求官方文档 https docs alipay com mini api network Page data name 支付宝小程序 onLoad query 页面加载 在这里请求接口 console info Page
  • 解决VS安装无法联网下载问题

    离线安装VC 14 0 build tools的解决方案 在能正常通过visualcppbuildtools full exe 联网获取安装文件的电脑上 在系统自带的cmd exe中在对应目录下执行 visualcppbuildtools
  • angular-cli中引入ng-zorro-antd(蚂蚁框架)

    首先你要确保angular cli环境搭建成功 第一步 进入项目文件夹 执行以下命令后将自动完成 ng zorro antd 的初始化配置 包括引入国际化文件 导入模块 引入样式文件等工作 ng add ng zorro antd 安装完成
  • 《代码走查》杂记

    代码走查 一 定义 1 代码走查 code walkthrough 是一个开发人员与架构师集中与讨论代码的过程 代码走查的目的交换有关代码是如何书写的思路 并建立一个对代码的标准集体阐述 在代码走查的过程中 开发人员都应该有机会向其他人来阐
  • linux入门学习(3权限管理)

    权限管理 一 文件或目录的权限查看 1 文件权限的查看 两种查看文件详细信息的方法 ls l file 查看file文件的详细信息 如果是目录 则是查看该目录下的所有子文件的详细信息 ls ld dir 查看dir目录的详细信息 2 文件权
  • 有关无人机的几点总结

    Pix APM 减震问题 X Y 方向震动必须小于0 3g Z方向必须小于0 5g 最好每个方向上都控制在0 1g 电机动平衡处理 T motor 在工厂已经做过动平衡处理 ArduPilot 4 0 代码中初始化函数已经移至 AP veh
  • PuTTY 通过 SSH 访问出现错误:"expected key exchange group packet from server"。

    使用 PuTTY 通过 SSH 访问出现错误 expected key exchange group packet from server 解决 在 PuTTY 的左侧窗格中 导航到 连接 gt SSH gt Kex 在算法选择策略下 选择
  • 数仓面试总结

    2021年5月开始找工作 面试了若干个数仓的岗位 面的差不多也就2个 总结下大致的面试内容 一 字节视频面 上海的一个部门 视频面挂 小伙伴内推的 这个5月份面的 大概视频面试了一个小时 主要面试内容 1 问了mapreduce的具体执行过

随机推荐

  • Mysql数据库drop表不用跑路,表空间传输助你恢复数据

    今天给大家介绍一种 在Mysql数据库中 利用InnoDb的表空间传输功能 帮助你恢复drop的业务表 Mysql表空间传输限制 要使用Mysql数据库表空间传输功能 有2个限制 1 Mysql数据库版本必须在5 6以上 2 Mysql数据
  • 冒泡法详解

    目录 什么是冒泡法 冒泡法思路 代码的实现 什么是冒泡法 冒泡排序 Bubble Sort 是一种计算机科学领域的较简单的排序算法 这个算法的名字由来是因为越小的元素会经由交换慢慢 浮 到数列的顶端 升序或降序排列 就如同碳酸饮料中二氧化碳
  • 大数据和人工智能关系的基本介绍

    人工智能主要有三个分支 1 基于规则的人工智能 2 无规则 计算机读取大量数据 根据数据的统计 概率分析等方法 进行智能处理的人工智能 3 基于神经元网络的一种深度学习 基于规则的人工智能 在计算机内根据规定的语法结构录入规则 用这些规则进
  • 搜索引擎solr系列---多字段匹配的实现方法

    solr可以实现多字段匹配查询的结果 即传入一个条件 可以按照你预选设置好的匹配范围去匹配数据 将匹配到的所有数据返回 比如现在我有如下这样的需求 数据库中fbf表中有多个字段 其中有几个中文字段 现在要求传入汉字 对其中的四个中文字段进行
  • 人脸属性识别 - 使用多任务学习模型在CelebA数据集上进行人脸属性识别任务

    简介 人脸属性识别是计算机视觉领域的一个重要应用 它可以用于人脸检测 人脸识别 表情识别等多个领域 本文将介绍如何使用多任务学习模型在CelebA数据集上进行人脸属性识别任务 我们将使用Python编写代码 并使用PyTorch框架搭建我们
  • 云计算基础架构

    原文地址 http www chinacloud cn show aspx id 15922 cid 12 云计算不仅是技术 更是服务模式的创新 云计算之所以能够为用户带来更高的效率 灵活性和可扩展性 是基于对整个IT领域的变革 其技术和应
  • 基础算法:差分

    题目 输入一个长度为 n 的整数序列 接下来输入 m 个操作 每个操作包含三个整数 l r c 表示将序列中 l r 之间的每个数加上 c 请你输出进行完所有操作后的序列 差分 若数组A a1 a2 a3 数组B b1 b2 b3 满足a1
  • java种语言包在线翻译_Java 实现在线翻译功能 调用微软Bing API

    下面是利用java程序实现翻译功能 调用微软Bing API 注意 代码中的keyId 需要自己申请 2 去申请key 进入http www bing com developers createapp aspx 填写相关的你的应用信息就行了
  • pikachu靶场之暴力破解

    暴力破解 是一攻击具手段 在web攻击中 一般会使用这种手段对应用系统的认证信息进行获取 其过程就是使用大量的认证信息在认证接口进行尝试登录 直到得到正确的结果 为了提高效率 暴力破解一般会使用带有字典的工具来进行自动化操作 理论上来说 大
  • 计算机网络主要分为哪几类?

    通俗地讲 计算机网络就是由多台计算机或其他计算机网络设备通过传输介质和软件物理 或逻辑 连接在一起组成的 从总体上来说 计算机网络的组成基本上包括计算机 网络操作系统 传输介质 可以是有形的 也可以是无形的 如无线网络的传输介质就是空气 和
  • vue-cli搭建项目

    一 全局化安装cnpm 其实对于安装vue cli 使用npm命令和cnpm命令都是可以的 个人觉得使用npm安装的比较慢 而且很可能会因为网络问题而出错 所以还是觉得使用cnpm稳一点 npm install cnpm g registr
  • 第35讲:Xposed+模拟器的详细使用

    如果你对逆向有所涉猎的话 可能听说过 Hook 利用 Hook 技术我们可以在某一逻辑的前后加入自定义的逻辑处理代码 几乎可以实现任意逻辑的修改 在前面的 JavaScript 逆向实战课时我们也初步体会了 Hook 的功效 如果你对 Ho
  • 一 , Element-UI tabs标签实现点击左右箭头 实现左右tab栏按个选中切换(正常是只会切换到后面空白tab栏 不会选中) .........二 , tabs标签切换不同的模板样式

    div class TAb div class xiangzuo i class el icon arrow left i div div
  • cuda c by example - 1

    并行计算大当其道 cuda c 给了开发者与NVIDIA 通用型GPU设备交互的能力 举2个栗子先了解一下 1 枚举设备属性代码 int main void cudaDeviceProp prop int count HANDLE ERRO
  • 面试官:说说CountDownLatch,CyclicBarrier,Semaphore的原理?

    CountDownLatch CountDownLatch适用于在多线程的场景需要等待所有子线程全部执行完毕之后再做操作的场景 举个例子 早上部门开会 有人在上厕所 这时候需要等待所有人从厕所回来之后才能开始会议 public class
  • Storm 踩坑记

    1 storm web ui 不显示 Kafka Spouts Lag 原因分析 vim logs ui log 2023 06 05 16 55 35 206 o a s u TopologySpoutLag qtp931482420 2
  • JDBC连接mysql遇到的问题

    本地安装的mysql是5 7版本 pom中引用的mysql connector java依赖是8 0 11版本 驱动使用Class forName com mysql cj jdbc Driver 连接的url为 jdbc mysql 12
  • android使用C/C++调用SO库

    有时候 我们反编译apk得到一个so库 如果直接使用这个so库的话 必须使用原来so库同样的package名字 才能用 这样人家反编译你的apk 就知道你侵犯了人家的版权 为了达到混淆的目的 我们可以再写一个so库调用人家的so库 即把人家
  • Nessus 扫描问题处理

    Nessus扫描后 如下问题 SSH Weak Key Exchange Algorithms Enabled 和 SSH Server CBC Mode Ciphers Enabled 解决方法如下 修改 etc ssh sshd con
  • 使用JSCH连接Linux系统并执行命令

    一 关于JSCH技术的简单描述 JSCH是SSH的一个纯Java实现 说直白点 就是一个远程连接你其他Linux或者Unix服务器的一个java代码包 其实就是我们使用jsch这个jar包来方便我们编写代码来连接自己linux系统的 SSH