linux 循环执行ip停止服务,java调用远程服务器的shell脚本以及停止的方法实现

最近接了个需求,要求远程调shell脚本,你没听错!!!需求就一句话,咱是谁,咱是优秀的开发选手。考虑再三,有两种实现方式:

方案一:脚本所在服务器安装一个客户端,也就是自己写的一个小程序,本地通过端口调目标服务器的程序,然后程序调本机上的shell脚本!

优点:通过端口调用,用户不用暴露服务器的账号密码,安全性高

缺点:我们需要一直维护这个客户端程序,而且每接入一台服务器,都得安装该客户端,另外非常考验客户端程序的健壮性。

方案二:本地直接通过IP,服务器账号密码调远程服务器的shell脚本

优点:代码易开发,扩展时只用扩展服务端代码即可

缺点:用户服务器的账号密码会暴露给服务端,密码安全问题

把每种方案的优缺点汇报给leader,leader说:按第二种来吧

来吧!!开干,废话不多说,直接上代码:

导入程序所需的软件包:

org.jvnet.hudson

ganymed-ssh2

build210-hudson-1

程序涉及的demo:

import java.io.IOException;

import java.io.InputStream;

import java.io.UnsupportedEncodingException;

import java.nio.charset.Charset;

import org.apache.commons.io.IOUtils;

import ch.ethz.ssh2.ChannelCondition;

import ch.ethz.ssh2.Connection;

import ch.ethz.ssh2.Session;

import ch.ethz.ssh2.StreamGobbler;

public class RemoteShellExecutor {

private Connection conn;

/** 远程机器IP */

private String ip;

/** 用户名 */

private String osUsername;

/** 密码 */

private String password;

private String charset = Charset.defaultCharset().toString();

private final String GET_SHELL_PID = "ps -ef | grep '%s' | grep -v grep |awk '{print $2}'";

private final String KILL_SHELL_PID = "kill -15 %s";

private static final int TIME_OUT = 1000 * 5 * 60;

/**

* 构造函数

* @param ip

* @param usr

* @param pasword

*/

public RemoteShellExecutor(String ip, String usr, String pasword) {

this.ip = ip;

this.osUsername = usr;

this.password = pasword;

}

/**

* 登录

* @return

* @throws IOException

*/

private boolean login() throws IOException {

conn = new Connection(ip);

conn.connect();

return conn.authenticateWithPassword(osUsername, password);

}

/**

* 执行脚本

*

* @param cmds

* @return

* @throws Exception

*/

public ExecuteResultVO exec(String cmds) throws Exception {

InputStream stdOut = null;

InputStream stdErr = null;

ExecuteResultVO executeResultVO = new ExecuteResultVO();

String outStr = "";

String outErr = "";

int ret = -1;

try {

if (login()) {

// Open a new {@link Session} on this connection

Session session = conn.openSession();

// Execute a command on the remote machine.

session.execCommand(cmds);

stdOut = new StreamGobbler(session.getStdout());

outStr = processStream(stdOut, charset);

stdErr = new StreamGobbler(session.getStderr());

outErr = processStream(stdErr, charset);

session.waitForCondition(ChannelCondition.EXIT_STATUS, TIME_OUT);

System.out.println("outStr=" + outStr);

System.out.println("outErr=" + outErr);

ret = session.getExitStatus();

executeResultVO.setOutStr(outStr);

executeResultVO.setOutErr(outErr);

} else {

throw new Exception("登录远程机器失败" + ip); // 自定义异常类 实现略

}

} finally {

if (conn != null) {

conn.close();

}

IOUtils.closeQuietly(stdOut);

IOUtils.closeQuietly(stdErr);

}

return ret;

}

/**

* @param in

* @param charset

* @return

* @throws IOException

* @throws UnsupportedEncodingException

*/

private String processStream(InputStream in, String charset) throws Exception {

byte[] buf = new byte[1024];

StringBuilder sb = new StringBuilder();

int len = 0;

while ((len=in.read(buf)) != -1) {

sb.append(new String(buf,0,len, charset));

}

return sb.toString();

}

public static void main(String args[]) throws Exception {

//调远程shell

RemoteShellExecutor executor = new RemoteShellExecutor("192.168.234.123", "root", "beebank");

System.out.println(executor.exec("sh /data/checkMysql.sh"));

//获取远程shell 进程 pid

ExecuteResultVO executeResultVO = executor.exec(String.format(GET_SHELL_PID,"sh /data/checkMysql.sh"));

//杀掉shell进程

ExecuteResultVO executeResultVO1 = executor.exec(String.format(KILL_SHELL_PID ,executeResultVO.getOutStr()));

}

public class ExecuteResultVO{

private String outStr;

private String outErr;

//省略get set

}

}

经过测试也确实好用啊,大家可以根据这个demo进行相应的修改。到此这篇关于java调远程服务器的shell脚本以及停止的方法实现的文章就介绍到这了,更多相关java调远程shell脚本内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/398962.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql-防止XSS攻击

1,防止Xss攻击 数据库查询数据操作,为了防止注入,要执行参数化查询,也就是直接利用execute直接进行sql语句的执行, 因为exexute本身就有接收语句变量的参数位, execute()函数本身就有接受SQL语句变量的参数位,只要正确的使用(直白一点就是:使…

java main方法背后的故事?(转)

jvm java 看似一种语言,实则一个巨大的体系的王国,开发这么多年了,还是没有搞懂,我以为我懂了,可是过了一段时间又忘了,所以说还是没懂 1、main方法说起 编译完我们的java文件后,需要有个一含有main方法的类…

亲历腾讯WEB前端开发三轮面试经历及面试题

【一面】~110分钟 2014/09/24 11:20 星期三 进门静坐30分钟做题。 填空题大题问答题 >>填空题何时接触电脑 何时接触前端运算符 字符串处理 延时 display position XMLHttpRequest 正则Jquery绑定事件 cookie >>大题BOM浏览器…

Redis的数据结构之字符串

原文:http://blog.java1234.com/blog/articles/316.html 五种数据类型: 字符串(String) 字符串列表(list) 有序字符串集合(sorted set) 哈希(hash) 字符串集合…

linux搜索日志组合条件,find查找

find查找是生产中最常见的日志查找工具下面看看它的用法基本用法:find 查找路径 查找标准 查找到以后的处理动作查找路径:需要被查找的文件所在的路径,一定是个目录,默认情况下为当前的目录查找的标准:查找的…

常用的JPA标记 (转)

Table Table用来定义entity主表的name,catalog,schema等属性。 元数据属性说明: name: 表名catalog: 对应关系数据库中的catalogschema:对应关系数据库中的schemaUniqueConstraints:定义一个UniqueConstraint数组,指定…

JavaBean技术的一些讲解

JavaBean: 由于原先的jsp的html代码和css代码以及java代码都是写在一起的,所以看起来就比较冗余,同时 也体现不了javaBean中面向对象的思想的{当然可以同过jstl标签库以及mvc框架来脱离java代码,但是这也是必不可少的} 在这里对于Javabean的一…

linux网卡名称乱编,小斗CentOS7.x网卡名称错乱、及网卡启动失败。

本帖最后由 Zack 于 2018-5-31 13:39 编辑最近在搞CentOS7装机的事情,在此记录期间遇到关于网卡方面的坑,整理分享下,以免大家继续再踩。一、在CentOS7默认装完系统之后网卡名称一改之前的名称习惯,网卡名称为enoxxxxx(之前命名规…

block传值 链接

iOS传值之block传值(一)转载于:https://www.cnblogs.com/dqxu/p/4016117.html

Maven——继承和聚合

实际项目中,可能正要构建一个大型的系统,但又不想一遍又一遍的重复同样的依赖元素,这种情况是经常出现的。不过还好,maven提供了继承机制,项目可以通过parent元素使用继承,可以避免这种重复。当一个项目声明…

隐藏linux操作系统版本信息,linux centos 如何查看操作系统版本信息?

本文介绍常用的四种查看linux下查看系统版本信息的方法:一、uname -a[appVM_11_211_centos ~]$ uname -aLinux VM_11_211_centos 2.6.32-504.30.3.el6.x86_64 #1 SMP Wed Jul 15 10:13:09 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux二、cat /proc/version[appVM_11_2…

iframe css练习

转载于:https://www.cnblogs.com/wenhuan/p/4019154.html

关于缓存的几篇好文章

追求极致:从技术细节看美团架构 Memcache架构新思考 Memcache应用场景介绍,说明[zz] 大型web系统数据缓存设计-l转载 大型网站后台架构的Web Server与缓存 Intelligence Computing 微博到底有多重视分布式缓存(上) Beanstalkd 一个…

linux 复制分区文件,dd复制分区后目标分区的大小变成原分区了

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼我使用了dd if/dev/sda1 of/dev/sdb1这个命令,想复制分区sda1上的所有数据但是我原本sdb1是150G,dd之后,挂载后变成55G了(df -h输出结果)(也就是sda1的大小 )但是我用fdisk -l 得到的信息还是150G请问这种情况如何解决??acePerso…

Elasticsearch 5.2.x 使用 Head 插件连接不上集群

0、前言 时光荏苒,ES转眼间就从2.X跳到了5.X。。。忆往昔峥嵘岁月,奈何ES社区太活跃,版本跳的比房价还快啊。。。话说回来,需要部署一套Elasticsearch 5.2.1 即本月最新推出的ES新力作,发现很多用法已经不一样了。。。…

Javascript---Immediately-Invoked Function Expression (IIFE)立即执行的函数表达式

1.一下是几种形式的函数调用: 各种调用的效率:在这编文章中有谈到: http://suqing.iteye.com/blog/1981591 // Either of the following two patterns can be used to immediately invoke // a function expression, utilizing the functions…

extern 使用方法具体解释

在C语言中,修饰符extern用在变量或者函数的声明前,用来说明“此变量/函数是在别处定义的。要在此处引用”。(extern能够置于变量或者函数前,以标示变量或者函数的定义在别的文件里,提示编译器遇到此变量和函数时在其它…

.NET常用工具类集锦

不错的地址: http://www.cnblogs.com/flashbar/archive/2013/01/23/helper.html https://github.com/chrisyanghua/MyHelper/tree/master/MyHelper http://www.cnblogs.com/conan87810/archive/2009/03/15/1412529.html http://www.cnblogs.com/ltp/archive/2008/03…

现代控制理论-李雅普诺夫

现代控制理论-李雅普诺夫 单输入单输出系统(BIBO)的系统函数如下: 则,该系统的能控标准型(能空性)为: 能观性: 李雅普诺夫下的稳定性: 李雅普诺夫下的渐进稳定性&a…

Linux服务器的gou,开源跨平台移动项目Langou【简介】

Langou简介Langou是一个跨平台(Android/iOS)前端开发框架,核心代码使用C编写,底层基于OpenGL绘图,上层实现了一个精简的排版引擎以及一个JS/JSX运行环境。目标是想实现在此基础上开发GUI应用程序可兼顾开发速度与运行效率。暂时只支持iOS与An…