最近接了个需求,要求远程调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脚本内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

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

  1. java让服务器停止运行,java调用远程服务器的shell脚本以及停止的方法实现

    最近接了个需求,要求远程调shell脚本,你没听错!!!需求就一句话,咱是谁,咱是优秀的开发选手.考虑再三,有两种实现方式: 方案一:脚本所在服务器安装一个客户端,也就是自己写的一个小程序,本地通过端 ...

  2. java调用机器上的shell脚本

    java调用机器上的shell脚本,可以这样方便的通过shell脚本调用本机的C.C++等程序 Process process = null; Runtime runTime = Runtime.ge ...

  3. 执行远程服务器上的脚本失败?(环境变量引起的问题)

    我们在使用jenkins构建job时会调用远程服务器上的脚本,执行某项操作.有时因为脚本涉及到了环境变量,无法成功执行.解决这个问题的方法一直就是在脚本开始加入一行: source /etc/prof ...

  4. 阿里云移动推送服务java调用

    阿里云移动推送服务java调用 首先登录阿里云官网,开通移动推送服务 创建app和平台 配置应用 测试推送 根据文档编写自己的调用方法 测试推送 ##具体步骤如下: 登录阿里云官网 https://w ...

  5. Linux中执行shell脚本的4种方法

    这篇文章主要介绍了Linux中执行shell脚本的4种方法总结,即在Linux中运行shell脚本的4种方法,需要的朋友可以参考下. bash shell 脚本的方法有多种,现在作个小结.假设我们编写 ...

  6. 使用nodejs和Java访问远程服务器的服务

    既然这篇文章用的是nodejs和Java访问远程服务器的服务,那么咱们先用另一门编程语言,SAP的ABAP(我日常工作使用得最多的编程语言)来开发一个服务吧. 这是我用ABAP编程语言实现服务的类:Z ...

  7. Linux中执行shell脚本的5种方法总结

    Linux中执行shell脚本的4种方法总结,即在Linux中运行shell脚本的4种方法: 方法一:切换到shell脚本所在的目录(此时,称为工作目录)执行shell脚本: 复制代码 代码如下: c ...

  8. java在远程服务器上执行终端命令并获得返回结果

    最近经常会用到java到指定机器上执行终端命令并且获得返回结果,所以借此机会来记录一下 1.首先通过ip,用户名,密码链接到远程服务器上,然后执行终端命令 userName:主机的用户名,passwo ...

  9. java 发送客服消息,Java调用微信客服消息实现发货通知的方法详解

    本文实例讲述了java调用微信客服消息实现发货通知的方法.分享给大家供大家参考,具体如下: 个人说明:这是一个样例,微信客户消息有很多种,我现在用的是公众号发送消息.样子如下图. 说明:下面开始代码部 ...

最新文章

  1. c语言俄罗斯方块注释,C语言学习1年-俄罗斯方块(无注释)
  2. 涨知识!提单及运输业务中常用的一些代码、术语及意义!
  3. java写左侧导航栏界面,jQuery----左侧导航栏面板切换实现
  4. 英利1500伏光伏组件系列亮相美国
  5. Go Web编程--给自己写的服务器添加错误和访问日志
  6. 极速收藏!巨详细的分布式架构知识体系
  7. const与修饰函数形参
  8. SQL Server还原和一些小发现
  9. 关于支付接口回调地址参数字段是“notify_url”,签名过后的特殊字符url编码以后再解码后出现错误(¬ , ¢, ¤, £)
  10. 计算机win2000如何连接wifi,台式电脑windows7怎么连接wifi
  11. python网盘搜索引擎_打造一个蓝奏云网盘搜索引擎
  12. 如何成为IC验证工程师?
  13. 标准输出缓存在多进程代码中引起的一个问题
  14. 新松机器人产业小镇_总投资35亿元的新松机器人产业园项目落户永修
  15. C语言程序设计(第二版) 主编:余贞侠 何钰娟 课后习题 代码题答案
  16. C4D无法修改参数?所有参数都是灰色无法修改?
  17. Wireshark 抓包理解 FTP 传输过程
  18. 中国内联热水器市场现状研究分析与发展前景预测报告
  19. 将最小特权原则应用到Windows XP用户帐户
  20. python笔记(零基础学Python)

热门文章

  1. 从物联网发展历程看区块链挑战
  2. 获取ArcGIS安装路径
  3. [MSSQL]COALESCE与ISNULL函数
  4. 贝叶斯 朴素贝叶斯_手动执行贝叶斯分析
  5. 永恒python地速_立竿见影地把你的 Python 代码提速7倍
  6. leetcode109. 有序链表转换二叉搜索树(深度优先搜索/快慢指针)
  7. 3c技能和背包需要改建吗?_认为您需要仪表板? 您应该改建一个笔记本。
  8. snapchat_我刚刚在Snapchat获得开发人员职位。
  9. 感知器 机器学习_机器学习感知器实现
  10. opencv python运动人体检测