一、所需要的jar包

  需要借助Ganymed SSH的jar包:  ganymed-ssh2-262.jar

  下载地址: http://www.ganymed.ethz.ch/ssh2/

  API详情:  http://www.ganymed.ethz.ch/ssh2/javadoc/ch/ethz/ssh2/package-summary.html

二、实现原理

  Ganymed SSH-2 java在整个访问过程中担当SSH的客户端,由于Linux系统自带SSH服务,所以可以直接访问Linux系统并执行相关命令,而 Windows系统则需要首先安装SSH服务。

三、windows下ssh服务安装与配置

  当远程服务器为Windows系统时, 需要在远程服务器中安装Windows版的SSH服务,比如:freesshd。

   freesshd下载地址: http://www.freesshd.com/?ctt=download

    freesshd安装与配置:(可以参考:http://www.cnblogs.com/xred/archive/2012/04/21/2461627.html

  1.安装完freesshd后,首选在[Users]下添加用来远程连接的win系统用户,此处采用密码认证的方式,允许使用shell:

2.然后再在【Authentication】下设置允许密码认证方式:

3.到[Server status]下查看SSH服务器状态,确保启动即可。最后点击【确定】即可。

四、java代码实现远程连接服务器并执行命令

1、接收执行命令返回pojo

 package com.mu.mujup.governor.base.tomcatOper;

 public class Result {
private String stdOut;
private String stdErr;
private int status;
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
public String getStdOut() {
return stdOut;
}
public void setStdOut(String stdOut) {
this.stdOut = stdOut;
}
public String getStdErr() {
return stdErr;
}
public void setStdErr(String stdErr) {
this.stdErr = stdErr;
}
}

Result

2、给前台返回对象

 package com.mu.mujup.governor.base.tomcatOper;

 public class BackEntity {

     private int status;
private String errMessage;
private String operator;
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
public String getOperator() {
return operator;
}
public void setOperator(String operator) {
this.operator = operator;
}
public String getErrMessage() {
return errMessage;
}
public void setErrMessage(String errMessage) {
this.errMessage = errMessage;
} }

BackEntity

3、linux命令执行线程,这个线程执行linux命令并返回执行结果

 package com.mu.mujup.governor.base.tomcatOper;

 import java.io.IOException;
import java.io.InputStream; import ch.ethz.ssh2.Session; /**
* @author jing.zhang
* @date 创建时间:2016年6月27日 上午8:52:02
* @version 1.0
* @description
*/
public class TomcatThread extends Thread{
Object thread;
String cmds;
Session sess;
Result result;
private final String charset = "UTF-8";
public TomcatThread(Object thread,String cmds,Session sess){
this.thread = thread;
this.cmds = cmds;
this.sess = sess;
}
private void test(Object thread,String str){
Result result = new Result();
try{
long start = System.currentTimeMillis();
sess.execCommand(cmds);
System.out.println("时长是=="+(System.currentTimeMillis()-start));
InputStream stdout = sess.getStdout();
InputStream stderr = sess.getStderr();
result.setStdOut(processStream(stdout, charset));
result.setStdErr(processStream(stderr, charset));
result.setStatus(sess.getState());
this.result = result;
synchronized (thread) {
thread.notify();
}
}catch(IOException e){
this.result = null;
} } private String processStream(InputStream in, String charset)
throws IOException {
byte[] buf = new byte[1024];
StringBuilder sb = new StringBuilder();
while (in.read(buf) != -1) {
sb.append(new String(buf, charset));
}
return sb.toString();
} public Result getRunback(){
return this.result;
} public void run() {
test(thread,cmds);
}
}

TomcatThread

4、执行入口类(主线程),在方法exec处另起TomcatThread线程执行命令,并让主线程等待相应时间,主线程等待时间到了就结束子线程,

并用getRunback()获取子线程执行结果。如果超时返回为null。

 package com.mu.mujup.governor.base.tomcatOper;

 import java.io.IOException;
import java.io.InputStream; import ch.ethz.ssh2.Connection;
import ch.ethz.ssh2.Session; import com.eos.system.annotation.Bizlet; /**
*
* @author jing.zhang
* @date 创建时间:2016年6月15日 下午4:31:16
* @version 1.0
* @description gonernor远程控制tomcat类
*/ @Bizlet("")
public class TomcatOperater {
// private String hostName;
// private String userName;
// private String password;
private final String charset = "UTF-8"; private final String CHECK_TOMCAT_CMD = "curl -o /root/null -s -m 10 --connect-timeout 60 -w %{http_code} "; public TomcatOperater() { } // public TomcatOperater(String hostName, String userName, String password) {
// this.hostName = hostName;
// this.userName = userName;
// this.password = password;
// } /*
*
* @parameter
* @return
* @description 验证用户,是否接入服务器成功
*/
// private boolean login() throws IOException {
// conn = new Connection(hostName);
// conn.connect();
// return conn.authenticateWithPassword(userName, password);
// } /*
*
* @parameter
* @return
* @description 执行命令获得封装的Result对象
*/
private Result exec(Connection conn, String cmds ,long time) {
Result result = new Result();
try {
Session sess = conn.openSession();
// sess.execCommand(cmds);
// InputStream stdout = sess.getStdout();
// InputStream stderr = sess.getStderr();
// result.setStdOut(processStream(stdout, charset));
// result.setStdErr(processStream(stderr, charset));
// result.setStatus(sess.getState()); TomcatThread test = new TomcatThread(this,cmds,sess);
test.start();
synchronized (this) {
this.wait(time);
}
result = test.getRunback();
test.interrupt();
sess.close();
} catch (Exception e) {
e.printStackTrace();
} finally { //conn.close();
}
return result;
} /*
*
* @parameter
* @return
* @description 检查tomcat状态 000-关闭 200-启动
*/
private boolean isStart(Connection conn, String hostName)
throws IOException {
String result = null;
InputStream in = null;
//'http://172.31.69.130:8080'
String url = "'http://" + hostName + ":8080'";
String cmds = CHECK_TOMCAT_CMD + url;
Session session = conn.openSession();
session.execCommand(cmds);
in = session.getStdout();
result = processStream(in, charset).trim();
session.close();
return "200".equals(result) ? true : false;
} /*
*
* @parameter
* @return
* @description 将流转化成字符串
*/
private String processStream(InputStream in, String charset)
throws IOException {
byte[] buf = new byte[1024];
StringBuilder sb = new StringBuilder();
while (in.read(buf) != -1) {
sb.append(new String(buf, charset));
}
return sb.toString();
} @Bizlet("启动tomcat")
public BackEntity startTomcat(String osUsername ,String osPassword,String tmcStartBatch ,String ip,String adminPort) throws IOException {
BackEntity backEntity = new BackEntity(); //测试开始
ip = "172.31.69.130";
osUsername = "root";
osPassword = "root123";
adminPort = "8080";
tmcStartBatch = "/root/apache-tomcat-7.0.69/bin/startup.sh";
//测试结束
Connection conn = new Connection(ip);
conn.connect();
boolean loginFlag = conn.authenticateWithPassword(osUsername, osPassword);
long time = 1000;
if (loginFlag) {
if (!isStart(conn, ip)) {
Result result = exec(conn, tmcStartBatch,time);
if(result!=null){
if (result.getStdErr().trim().equals("")) {
backEntity.setErrMessage("success");
} else {
backEntity.setErrMessage(result.getStdErr());
}
}else{
backEntity.setErrMessage("启动超时");
}
} else {
backEntity.setErrMessage("success");
}
} else {
backEntity.setErrMessage("服务器连接异常");
}
conn.close();
return backEntity;
} @Bizlet("关闭tomcat")
public BackEntity stopTomcat(String osUsername ,String osPassword,String tmcStopBatch ,String ip,String adminPort) throws IOException {
BackEntity backEntity = new BackEntity(); //测试开始
ip = "172.31.69.130";
osUsername = "root";
osPassword = "root123";
adminPort = "8080";
tmcStopBatch = "/root/apache-tomcat-7.0.69/bin/startup.sh";
//测试结束 Connection conn = new Connection(ip);
conn.connect();
boolean loginFlag = conn.authenticateWithPassword(osUsername, osPassword);
long time = 10000000;//脚本执行超时时间
if (loginFlag) {
if (!isStart(conn, ip)) {
Result result = exec(conn, tmcStopBatch,time);
if(result!=null){
if (result.getStdErr().trim().equals("")) {
backEntity.setErrMessage("success");
} else {
backEntity.setErrMessage(result.getStdErr());
}
}else{
backEntity.setErrMessage("关闭超时");
}
} else {
backEntity.setErrMessage("success");
}
} else {
backEntity.setErrMessage("服务器连接异常");
}
conn.close();
return backEntity;
} @Bizlet("判断ip,用户名,密码,启动脚本是否为空")
public BackEntity validateNull(String osUsername ,String osPassword,String tmcStartBatch ,String ip,String adminPort) {
System.out.println("开始。。。。。。。。");
BackEntity backEntity = new BackEntity();
if(isNotEnputy(tmcStartBatch)&&isNotEnputy(ip)&&isNotEnputy(osPassword)&&isNotEnputy(osUsername)&&isNotEnputy(adminPort)){
backEntity.setStatus(0);
}else{
backEntity.setStatus(1);
}
return backEntity;
} private boolean isNotEnputy(String str){
if(str==null||str.equals("")){
return false;
}
return true;
}
}

TomcatOperater

java连接远程服务器之manyged-ssh2 (windows和linux)的更多相关文章

  1. (一)通过JAVA连接SAP (sapjco3.jar在Windows和MacOS上的配置)

    (一)通过JAVA连接SAP调用接口 (sapjco3.jar在Windows和MacOS上的配置) 一.sapjoc3.jar获取 由于sap官网提供的链接需要合作公司提供账号密码,如果商用请索要正 ...

  2. Java如何判断当前系统是Windows 还是LInux

  3. Java文件夹操作,判断多级路径是否存在,不存在就创建(包括windows和linux下的路径字符分析),兼容Windows和Linux

    兼容windows和linux. 分析: 在windows下路径有以下表示方式: (标准)D:\test\1.txt (不标准,参考linux)D:/test/1.txt 然后在java中,尤其使用F ...

  4. Scrapy的安装--------Windows、linux、mac等操作平台

    Scrapy安装 Scrapy的安装有多种方式,它支持Python2.7版本及以上或者是Python3.3版本及以上.下面来说py3环境下,scrapy的安装过程. Scrapy依赖的库比较多,至少需 ...

  5. mongodb在Windows安装配置及遇到的问题、java连接测试

    一.安装 1.访问mongodb的官网http://www.mongodb.org/downloads下载64bit的包,我下载的是mongodb-win32-x86_64-2008plus-ssl- ...

  6. JAVA企业级应用服务器之TOMCAT实战

    JAVA企业级应用服务器之TOMCAT实战 链接:https://pan.baidu.com/s/1c6pZjLeMQqc9t-OXvUM66w 提取码:uwak 复制这段内容后打开百度网盘手机App ...

  7. Java连接SqlServer2008数据库(转)

    Java连接SqlServer2008数据库 首先下载JDBC:下载地址:http://www.microsoft.com/zh-cn/download/details.aspx?id=21599 下 ...

  8. java连接sql server2000/2005

    接触Java或者JSP,难免会使用到数据库SQL Server 2000/2005(我使用2005标准版[9.0.3054]测试),经过自己的搜索和研究,使用JDBC连接SQL Server成功,特此 ...

  9. Java连接redis的使用演示样例

    Java连接redis的使用演示样例 Redis是开源的key-value存储工具,redis通经常使用来存储结构化的数据,由于redis的key能够包括String.hash.listset和sor ...

随机推荐

  1. HDU POJ 1015 Jury Compromise(陪审团的人选,DP)

    题意: 在遥远的国家佛罗布尼亚,嫌犯是否有罪,须由陪审团决定.陪审团是由法官从公众中挑选的.先随机挑选n个人作为陪审团的候选人,然后再从这n个人中选m人组成陪审团.选m人的办法是:控方和辩方会根据对候 ...

  2. C 数据结构1——线性表分析(顺序存储、链式存储)

    之前是由于学校工作室招新,跟着大伙工作室招新训练营学习数据结构,那个时候,纯碎是小白(至少比现在白很多)那个时候,学习数据结构,真的是一脸茫然,虽然写出来了,但真的不知道在干嘛.调试过程中,各种bug ...

  3. Linux学习笔记——软件包管理

    1.RPM包的管理 RPM软件包的一个例子: sudo-1.7.2p1-5.el5.i386.rpm 这个rpm包名包括软件名sudo,版本号1.7.2p1,发行号5.el5,和硬件平台i386 (1 ...

  4. 关闭utorrent的广告

    版本:3.4.9 / 方法来源:wikihow. 在"选项-高级"里将下面的选项全部改成false. offers.left_rail_offer_enabledoffers.sp ...

  5. UOJ#191. 【集训队互测2016】Unknown

    题意:维护一个数列,每个元素是个二维向量,每次可以在后面加一个元素或者删除一个元素.给定P(x,y),询问对于[l,r]区间内的元素$S_i$,$S_i \times P$的最大值是多少. 首先简单地 ...

  6. [置顶] 程序员必知(三):一分钟知道URI编码(encodeURI)

    因为浏览器会用一些特殊的字符作为特定的意义,所以在要传输的内容上如果有这些特殊的字符的话,就需要对其进行转义才能正确传输,如以下字符为发送时候的关键字,即特殊字符 ;/?:@&=+$,# 所以 ...

  7. [2014.5.22][UBUNTU]Ubuntu与Windows系统时间不同步的问题

    安装Ubuntu+Windows双系统时会遇到Windows和Ubuntu系统时间不同步的问题,这是由于Windows系统默认读取主板bios等硬件系统时间作为OS的当地时间;而MAc,Linux类的 ...

  8. Nginx入门之两种handler函数的挂载方式

    请在文章页面明显位置给出原文连接,否则保留追究法律责任的权利. 接着上次的文章,今天研究<深入理解Nginx模块开发与架构解析>一书中给出的mytest的例子,发现和 /tengine.t ...

  9. stl之deque双端队列容器

    deque与vector很相似,不仅能够在尾部插入和删除元素,还能够在头部插入和删除. 只是当考虑到容器元素的内存分配策略和操作性能时.deque相对vector较为有优势. 头文件 #include ...

  10. 特殊的forward_list操作

    为了理解forward_list为什么有特殊版本的添加和删除操作,考虑当我们从一个单向链表中删除一个元素时会发生什么.当添加或删除一个元素时,删除或添加的元素之前的那个元素的后继会发生变化.为了添加或 ...