java-代码操作服务器之SSH连续发送命令
2024-10-20 07:44:50
java操作Linux服务器可以使用专用的jar包,这里介绍使用jsch操作Linux服务器
maven 依赖
<dependency>
<groupId>com.jcraft</groupId>
<artifactId>jsch</artifactId>
<version>0.1.54</version>
</dependency>
引入包以后 获取ssh连接
public static ChannelShell connectShell(Session session) {
ChannelShell shell = null;
try {
shell = (ChannelShell) session.openChannel(type_ssh);
shell.connect();
System.out.println();
System.out.println("shell resource:" + session.equals(shell.getSession()));
System.out.println("shell login ok:" + shell.getId());
System.out.println();
return shell;
} catch (Exception e) {
e.printStackTrace();
}
return shell;
}
以上获取到连接对象可以进行交互操作,在调用方法中定义接收流对象后可以交互执行命令
一下监听和发送都在一个线程中,所以开启定时任务发送命令,主进程监听消息获取
getMsg为接收消息方法
private static PrintStream commander;//定义常量 发送消息使用
BufferedReader br;
try {
OutputStream outputStream = myShellSession_.getChannelShell().getOutputStream();
InputStream inputStream = myShellSession_.getChannelShell().getInputStream();
commander = new PrintStream(outputStream, false, MyShellAndSftpUtils.ENCODING);
br = new BufferedReader(new InputStreamReader(inputStream, MyShellAndSftpUtils.ENCODING));
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
sendMsg("pwd");//定时发送消息
System.out.println("shell run , time is "+DataTimeUtils.getDataStrOut());
}
},0,DataTimeUtils.getaLong(myShellSession_.getConfigParams().getShellTime()));//立即执行 过15分执行 15分 * 60 秒 * 1000毫秒
try {
getMsg();
} catch (Exception e) {
e.printStackTrace();
}
//接收消息调用
public static void getMsg() throws Exception {
StringBuffer buffer = new StringBuffer();
String line;
boolean flag = false;
while ((line = br.readLine()) != null) {
System.out.println("line " + line);
if (line.startsWith("Starting Nmap")) {
flag = true;
}
if (flag) {
buffer.append(line);
buffer.append(MyShellAndSftpUtils.lineSeparator);
}
if (line.startsWith("****:")) {//检测返回信息的开始
flag = false;
saveDb(buffer.toString());//执行存储等逻辑
buffer.setLength(0);
}
}
}
public static void sendMsg(String msg) {
commander.println(msg);
commander.flush();
}
以上方案可以连续执行命令,但是返回的结果需要进行判断后才能进入自己的操作
最新文章
- 如何在Ubuntu 14.04服务器上自动化部署Spring Boot的应用
- SharePoint 2013 CSOM 对象模型属性包
- 探索软件工程道路上的我 V (Θ∀Θ#)
- [课程设计]Scrum 1.2 Spring 计划&;系统流程&;DayOne燃尽图
- Permission denied:multiarray.cp35-win_amd64.pyd(tensorflow0.12.0在windows下安装)
- 《objective-c基础教程》学习笔记(九)—— Foundation框架介绍
- AngularJS 监控对象属性:$watch和$digest
- Java基础之序列化对象——反序列化对象(DeserializeObjects)
- linux 内核和应用程序区别
- mysql之字符集与校对集
- 【转载】CentOS 6.4下PXE+Kickstart无人值守安装操作系统
- YARN笔记——技术点汇总
- Convex(扫描线降维)
- 谈谈websocket集群的解决方式
- phpmyadmin 上传超过50m限制
- shell中括号的特殊用法 linux if多条件判断
- kafka集群环境搭建(Linux)
- phantomjs 中如何使用xpath
- web开发必备的浏览器常识
- Java源码阅读(不断补充)
热门文章
- SSE图像算法优化系列三十二:Zhang\Guo图像细化算法的C语言以及SIMD指令优化
- JDK1.7HashMap源码分析
- synchronized下的 i+=2 和 i++ i++执行结果居然不一样
- 使用Group By子句的时候,一定要记住下面的一些规则
- C++ 炼气期之数据是主角
- React Suspense 尝鲜,处理前后端IO异步操作
- BUUCTF-另一个世界
- SpringBoot之缓存
- UiPath程序设计文档
- UiPath文本操作Get Full Text的介绍和使用