通过JSch运行远程linux主机上的shell脚本
时间:2022-07-25
本文章向大家介绍通过JSch运行远程linux主机上的shell脚本,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
如果您看完文章之后,觉得对您有帮助,请帮我点个赞,您的支持是我不竭的创作动力!
运行远程主机上的shell脚本
下面的例子是教给大家如何通过java程序,运行远程主机上的shell脚本。(我讲的不是一个黑客学习教程,而是使用用户名密码去执行有用户认证资格的主机上的shell脚本)。并且通过java程序获得shell脚本的输出。 首先通过maven坐标引入JSch依赖库,我们正是通过JSch去执行远程主机上的脚本。
<dependency>
<groupId>com.jcraft</groupId>
<artifactId>jsch</artifactId>
<version>0.1.55</version>
</dependency>
当然以下java代码可执行的的前提是,远程主机已经开通SSH服务(也就是我们平时登录主机所使用的服务)。
远程shell脚本
下面的代码放入一个文件:hello.sh
,脚本的内容很简单只是用来测试,回显输出“hello <参数1> ”
#! /bin/sh
echo "hello $1n";
然后我把它放到远程主机的/root
目录下面,远程主机的IP是1.1.1.1
(当然我真实测试时候不是这个IP,我不能把我的真实IP写到这个文章里面,以免被攻击)。并且在远程主机上,为这个脚本设置可执行权限,方法如下:
$ chmod +x hello.sh
本地java程序
我们可以使用下面的代码,去远程的linux 主机执行shell脚本,详细功能请看代码注释
import com.jcraft.jsch.*;
import java.io.IOException;
import java.io.InputStream;
public class RunRemoteScript {
//远程主机IP
private static final String REMOTE_HOST = "1.1.1.1";
//远程主机用户名
private static final String USERNAME = "";
//远程主机密码
private static final String PASSWORD = "";
//SSH服务端口
private static final int REMOTE_PORT = 22;
//会话超时时间
private static final int SESSION_TIMEOUT = 10000;
//管道流超时时间(执行脚本超时时间)
private static final int CHANNEL_TIMEOUT = 5000;
public static void main(String[] args) {
//脚本名称及路径,与上文要对上
String remoteShellScript = "/root/hello.sh";
Session jschSession = null;
try {
JSch jsch = new JSch();
//SSH授信客户端文件位置,一般是用户主目录下的.ssh/known_hosts
jsch.setKnownHosts("/home/zimug/.ssh/known_hosts");
jschSession = jsch.getSession(USERNAME, REMOTE_HOST, REMOTE_PORT);
// 密码认证
jschSession.setPassword(PASSWORD);
// 建立session
jschSession.connect(SESSION_TIMEOUT);
//建立可执行管道
ChannelExec channelExec = (ChannelExec) jschSession.openChannel("exec");
// 执行脚本命令"sh /root/hello.sh zimug"
channelExec.setCommand("sh " + remoteShellScript + " zimug");
// 获取执行脚本可能出现的错误日志
channelExec.setErrStream(System.err);
//脚本执行结果输出,对于程序来说是输入流
InputStream in = channelExec.getInputStream();
// 5 秒执行管道超时
channelExec.connect(CHANNEL_TIMEOUT);
// 从远程主机读取输入流,获得脚本执行结果
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 (channelExec.isClosed()) {
if (in.available() > 0) continue;
//获取退出状态,状态0表示脚本被正确执行
System.out.println("exit-status: "
+ channelExec.getExitStatus());
break;
}
try {
Thread.sleep(1000);
} catch (Exception ee) {
}
}
channelExec.disconnect();
} catch (JSchException | IOException e) {
e.printStackTrace();
} finally {
if (jschSession != null) {
jschSession.disconnect();
}
}
}
}
最终在本地控制台,获得远程主机上shell脚本的执行结果。如下
hello zimug
exit-status: 0
当然,我只是为大家演示这样一个例子,上面的代码可以通过更好的封装,从而提供更简单的使用方式。
喜欢 (1)or分享 (0)
- HDUOJ-----Computer Transformation
- Veeam Backup & Replication(二):添加虚拟化主机和配置备份存储
- HDUOJ 2672---god is a girl 《斐波那契数》
- Golang语言--一些基础用法
- 复杂SQL性能优化的剖析(一)(r11笔记第36天)
- hduoj1073--Online Judge
- Golang语言--- channel
- Golang语言--将byte的int转换
- HDUOJ------Daydream字符查找-并求其始末位置
- HDUOJ------敌兵布阵
- 复杂SQL性能优化的剖析(二)(r11笔记第37天)
- HDUOJ-------Being a Good Boy in Spring Festival
- Golang语言--slice 切片原理
- GoLang语言--的函数运用
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Angular No provider for EffectsRootModule错误消息
- Leetcode No.15 三数之和
- 正则表达式介绍与使用
- Angular StoreFeatureModule
- Angular Component之间的事件通知机制
- 如何将你的Python项目全面自动化?
- 正则表达式介绍与使用
- Angular ERROR NullInjectorError: R3InjectorError(AppModule)的错误分析
- 2.4-Air302(NB-IOT)-基础外设-延时,定时器
- Shell正则表达式一览表
- YAML基础语法
- 详解Kubernetes存储体系
- Python3 正则表达式特殊符号及用法.md
- Web网页响应式布局.md
- BootStrap应用开发学习入门1