首页 > 编程语言 >java-代码操作服务器之SSH连续发送命令

java-代码操作服务器之SSH连续发送命令

时间:2022-08-16 17:55:32浏览次数:50  
标签:shell java System SSH new println 服务器 line out

  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();
}

以上方案可以连续执行命令,但是返回的结果需要进行判断后才能进入自己的操作

标签:shell,java,System,SSH,new,println,服务器,line,out
From: https://www.cnblogs.com/CaiNiao-TuFei/p/16592363.html

相关文章

  • java线程池源码阅读
    说明简单理解和使用可以参考:https://www.cnblogs.com/LQBlog/p/8735356.html类图接口Executor接口publicinterfaceExecutor{/***代表提交了一个任......
  • MultipartFile上传文件异步处理时的java.io.FileNotFoundException
    参考:https://javajgs.com/archives/26157一.背景1-1需求前端上传Word文档,后端将接收到的Word文档①上传到文件服务器②将Word转为Pdf。1-2方案因为Word转Pdf的耗时......
  • 腾讯云服务器安装rabbitmq及简单测试记录
    一、安装近期对消息队列的学习让我对消息中间件产生了兴趣,而作为消息队列的使用的rabbitmq,就是我学习中间件的第一步。rabbitmq和erlang的安装安装之前先检查环境:[root......
  • Java安装卸载
    Java基本知识JDKJavaDevelopmentKit开发工具包JREJavaRuntimeEnvironment运行环境JVMJavaVirtualMachine虚拟机Java开发环境搭建JDK下载与安装搜索J......
  • java如何判断一个对象是否死去
    简单直观的一个方法是:对一个对象添加引用计数器。每当有地方引用它时,计数器的值加1;当引用失效时,计数器de的值减1.而当计数器的值为0时这个对象就不会再被使用,判断为已......
  • JavaDoc
    JavaDocJavaDoc是一种将注释生成HTML文档的技术,生成的HTML文档类似于Java的API,易读且清晰明了。只要在编写程序时以一套特定的标签作注释,在程序编写完成后,通过Javadoc就......
  • JS-Symbol(javascript的第七种数据类型)
    introduce在ES5中对象的属性名都是字符串,这容易造成属性名的冲突。引入Symbol类型来解决命名冲突的问题。Symbol的值通过Symbol函数来生成,也就是说,对象的属性名......
  • 记Windows服务器Redis 6379被攻击 被设置主从模式同步项目数据
    在工作中第一次经历被攻击,我是一个前端,同时复负责维护一个已上线的项目,在最近一段时间小程序与后台经常出现这个报错,搜了下说我的从机是只读模式,不能写入,问了同事得知这......
  • java中获取指定日期是周几
    可以使用Calendar日历工具类获取,代码如下:Calendarcalendar=Calendar.getInstance();calendar.setTime(newDate());intindex=calendar.get(Calendar.DAY_OF_WEEK)-......
  • JavaSE:第十三章:一分钟了解反射
    首先分享一篇关于反射的博文,因为我发现这篇博文写的很详细,然后开始我的表演:首先学习反射之前,我要提出疑问:反射是个什么东西?它是用来做什么的?平时的应用场景有哪些?为啥......