java连接远程服务器之manyged-ssh2 (windows和linux)

一、所需要的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

 1 package com.mu.mujup.governor.base.tomcatOper;
 2
 3
 4 public class Result {
 5     private String stdOut;
 6     private String stdErr;
 7     private int status;
 8     public int getStatus() {
 9         return status;
10     }
11     public void setStatus(int status) {
12         this.status = status;
13     }
14     public String getStdOut() {
15         return stdOut;
16     }
17     public void setStdOut(String stdOut) {
18         this.stdOut = stdOut;
19     }
20     public String getStdErr() {
21         return stdErr;
22     }
23     public void setStdErr(String stdErr) {
24         this.stdErr = stdErr;
25     }
26 }

Result

2、给前台返回对象

 1 package com.mu.mujup.governor.base.tomcatOper;
 2
 3 public class BackEntity {
 4
 5     private int status;
 6     private String errMessage;
 7     private String operator;
 8     public int getStatus() {
 9         return status;
10     }
11     public void setStatus(int status) {
12         this.status = status;
13     }
14     public String getOperator() {
15         return operator;
16     }
17     public void setOperator(String operator) {
18         this.operator = operator;
19     }
20     public String getErrMessage() {
21         return errMessage;
22     }
23     public void setErrMessage(String errMessage) {
24         this.errMessage = errMessage;
25     }
26
27 }

BackEntity

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

 1 package com.mu.mujup.governor.base.tomcatOper;
 2
 3
 4 import java.io.IOException;
 5 import java.io.InputStream;
 6
 7 import ch.ethz.ssh2.Session;
 8
 9
10 /**
11  * @author  jing.zhang
12  * @date 创建时间:2016年6月27日 上午8:52:02
13  * @version 1.0
14  * @description
15  */
16 public class TomcatThread extends Thread{
17     Object thread;
18     String cmds;
19     Session sess;
20     Result result;
21     private final String charset = "UTF-8";
22     public TomcatThread(Object thread,String cmds,Session sess){
23         this.thread = thread;
24         this.cmds = cmds;
25         this.sess = sess;
26     }
27     private void test(Object thread,String str){
28         Result result = new Result();
29         try{
30             long start = System.currentTimeMillis();
31             sess.execCommand(cmds);
32             System.out.println("时长是=="+(System.currentTimeMillis()-start));
33             InputStream stdout = sess.getStdout();
34             InputStream stderr = sess.getStderr();
35             result.setStdOut(processStream(stdout, charset));
36             result.setStdErr(processStream(stderr, charset));
37             result.setStatus(sess.getState());
38             this.result = result;
39             synchronized (thread) {
40                 thread.notify();
41             }
42         }catch(IOException e){
43             this.result = null;
44         }
45
46     }
47
48     private String processStream(InputStream in, String charset)
49             throws IOException {
50         byte[] buf = new byte[1024];
51         StringBuilder sb = new StringBuilder();
52         while (in.read(buf) != -1) {
53             sb.append(new String(buf, charset));
54         }
55         return sb.toString();
56     }
57
58     public Result getRunback(){
59         return this.result;
60     }
61
62     public void run() {
63         test(thread,cmds);
64     }
65 }

TomcatThread

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

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

  1 package com.mu.mujup.governor.base.tomcatOper;
  2
  3 import java.io.IOException;
  4 import java.io.InputStream;
  5
  6 import ch.ethz.ssh2.Connection;
  7 import ch.ethz.ssh2.Session;
  8
  9 import com.eos.system.annotation.Bizlet;
 10
 11
 12 /**
 13  *
 14  * @author  jing.zhang
 15  * @date 创建时间:2016年6月15日 下午4:31:16
 16  * @version 1.0
 17  * @description gonernor远程控制tomcat类
 18  */
 19
 20 @Bizlet("")
 21 public class TomcatOperater {
 22     //    private String hostName;
 23     //    private String userName;
 24     //    private String password;
 25     private final String charset = "UTF-8";
 26
 27     private final String CHECK_TOMCAT_CMD = "curl -o /root/null -s -m 10 --connect-timeout 60 -w %{http_code} ";
 28
 29     public TomcatOperater() {
 30
 31     }
 32
 33     //    public TomcatOperater(String hostName, String userName, String password) {
 34     //        this.hostName = hostName;
 35     //        this.userName = userName;
 36     //        this.password = password;
 37     //    }
 38
 39     /*
 40      *
 41      * @parameter
 42      * @return
 43      * @description 验证用户,是否接入服务器成功
 44      */
 45     //    private boolean login() throws IOException {
 46     //        conn = new Connection(hostName);
 47     //        conn.connect();
 48     //        return conn.authenticateWithPassword(userName, password);
 49     //    }
 50
 51     /*
 52      *
 53      * @parameter
 54      * @return
 55      * @description 执行命令获得封装的Result对象
 56      */
 57     private Result exec(Connection conn, String cmds ,long time) {
 58         Result result = new Result();
 59         try {
 60             Session sess = conn.openSession();
 61 //            sess.execCommand(cmds);
 62 //            InputStream stdout = sess.getStdout();
 63 //            InputStream stderr = sess.getStderr();
 64 //            result.setStdOut(processStream(stdout, charset));
 65 //            result.setStdErr(processStream(stderr, charset));
 66 //            result.setStatus(sess.getState());
 67
 68             TomcatThread test = new TomcatThread(this,cmds,sess);
 69             test.start();
 70             synchronized (this) {
 71                 this.wait(time);
 72             }
 73             result =  test.getRunback();
 74             test.interrupt();
 75             sess.close();
 76         } catch (Exception e) {
 77             e.printStackTrace();
 78         } finally {
 79
 80             //conn.close();
 81         }
 82         return result;
 83     }
 84
 85     /*
 86      *
 87      * @parameter
 88      * @return
 89      * @description 检查tomcat状态 000-关闭  200-启动
 90      */
 91     private boolean isStart(Connection conn, String hostName)
 92             throws IOException {
 93         String result = null;
 94         InputStream in = null;
 95         //‘http://172.31.69.130:8080‘
 96         String url = "‘http://" + hostName + ":8080‘";
 97         String cmds = CHECK_TOMCAT_CMD + url;
 98         Session session = conn.openSession();
 99         session.execCommand(cmds);
100         in = session.getStdout();
101         result = processStream(in, charset).trim();
102         session.close();
103         return "200".equals(result) ? true : false;
104     }
105
106     /*
107      *
108      * @parameter
109      * @return
110      * @description 将流转化成字符串
111      */
112     private String processStream(InputStream in, String charset)
113             throws IOException {
114         byte[] buf = new byte[1024];
115         StringBuilder sb = new StringBuilder();
116         while (in.read(buf) != -1) {
117             sb.append(new String(buf, charset));
118         }
119         return sb.toString();
120     }
121
122     @Bizlet("启动tomcat")
123     public BackEntity startTomcat(String osUsername ,String osPassword,String tmcStartBatch ,String ip,String adminPort) throws IOException {
124         BackEntity backEntity = new BackEntity();
125
126
127         //测试开始
128         ip = "172.31.69.130";
129         osUsername = "root";
130         osPassword = "root123";
131         adminPort = "8080";
132         tmcStartBatch = "/root/apache-tomcat-7.0.69/bin/startup.sh";
133         //测试结束
134         Connection conn = new Connection(ip);
135         conn.connect();
136         boolean loginFlag = conn.authenticateWithPassword(osUsername, osPassword);
137         long time = 1000;
138         if (loginFlag) {
139             if (!isStart(conn, ip)) {
140                 Result result = exec(conn, tmcStartBatch,time);
141                 if(result!=null){
142                     if (result.getStdErr().trim().equals("")) {
143                         backEntity.setErrMessage("success");
144                     } else {
145                         backEntity.setErrMessage(result.getStdErr());
146                     }
147                 }else{
148                     backEntity.setErrMessage("启动超时");
149                 }
150             } else {
151                 backEntity.setErrMessage("success");
152             }
153         } else {
154             backEntity.setErrMessage("服务器连接异常");
155         }
156         conn.close();
157         return backEntity;
158     }
159
160     @Bizlet("关闭tomcat")
161     public BackEntity stopTomcat(String osUsername ,String osPassword,String tmcStopBatch ,String ip,String adminPort) throws IOException {
162         BackEntity backEntity = new BackEntity();
163
164         //测试开始
165         ip = "172.31.69.130";
166         osUsername = "root";
167         osPassword = "root123";
168         adminPort = "8080";
169         tmcStopBatch = "/root/apache-tomcat-7.0.69/bin/startup.sh";
170         //测试结束
171
172         Connection conn = new Connection(ip);
173         conn.connect();
174         boolean loginFlag = conn.authenticateWithPassword(osUsername, osPassword);
175         long time = 10000000;//脚本执行超时时间
176         if (loginFlag) {
177             if (!isStart(conn, ip)) {
178                 Result result = exec(conn, tmcStopBatch,time);
179                 if(result!=null){
180                     if (result.getStdErr().trim().equals("")) {
181                         backEntity.setErrMessage("success");
182                     } else {
183                         backEntity.setErrMessage(result.getStdErr());
184                     }
185                 }else{
186                     backEntity.setErrMessage("关闭超时");
187                 }
188             } else {
189                 backEntity.setErrMessage("success");
190             }
191         } else {
192             backEntity.setErrMessage("服务器连接异常");
193         }
194         conn.close();
195         return backEntity;
196     }
197
198     @Bizlet("判断ip,用户名,密码,启动脚本是否为空")
199     public BackEntity validateNull(String osUsername ,String osPassword,String tmcStartBatch ,String ip,String adminPort) {
200         System.out.println("开始。。。。。。。。");
201         BackEntity backEntity = new BackEntity();
202         if(isNotEnputy(tmcStartBatch)&&isNotEnputy(ip)&&isNotEnputy(osPassword)&&isNotEnputy(osUsername)&&isNotEnputy(adminPort)){
203             backEntity.setStatus(0);
204         }else{
205             backEntity.setStatus(1);
206         }
207         return backEntity;
208     }
209
210     private boolean isNotEnputy(String str){
211         if(str==null||str.equals("")){
212             return false;
213         }
214         return true;
215     }
216 }

TomcatOperater

时间: 07-10

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

Linux系统Java连接Mysql数据库

Linux系统下Java连接Mysql数据库方法与Windows下类似,具体步骤如下: 下载JDBC(驱动):mysql-connector-java-5.1.37.tar.gz 解压下载的数据包:tar -zxvf mysql-connector-java-5.1.37.tar.gz 解压后,mysql-connector-java-5.1.29-bin.jar位于mysql-connector-java-5.1.29目录下. 配置解压后,mysql-connector-java-5.1.29

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

兼容windows和linux. 分析: 在windows下路径有以下表示方式: (标准)D:\test\1.txt (不标准,参考linux)D:/test/1.txt 然后在java中,尤其使用File对象在操作windows的路径时,非常的不好操作,因为不知道要用多少个斜杠“\”来表示. 斜杠“\”为转义字符(参考:http://www.cnblogs.com/EasonJim/p/6561576.html). 而java的File对象上无论是windows还是linux,输入的路径不管标

Windows和linux虚拟机之间联网实现SSH远程连接以及VMware的3种网络模式[NAT、桥接和Host-only]

Windows和linux虚拟机之间联网实现SSH远程连接以及VMware的3种网络模式[NAT.桥接和Host-only] 作者:天齐 一.Windows和linux虚拟机之间联网实现SSH远程连接 假如我们要给主机名为mini1的虚拟机配置ip地址,需要以下几个步骤: 在linux上查看ip地址,如果linux服务器有ip地址,让它的ip地址和windows的ip地址在同一个网段,它们之间才能联网.在linux上查看ip地址的命令为"ifconfig": 发现eth0网卡没有配置i

Java连接Sql Server 2008的简单数据库应用

1.从微软官网下载JDBC驱动包 sqljdbc_4.0.2206.100_chs.exe,双击解压文件到指定目录,我的指定目录是: C:\Program Files\Microsoft JDBC Driver 4.0 for SQL Server\sqljdbc_4.0\chs 下面是解压后的文件, 如果JDK版本低于6.0,则需使用sqljdbc.jar; 6.0以上版本使用sqljdbc4.jar,使用sqljdbc4.jar版本好处可以省略 Class.forName("com.micr

Java连接SqlServer2008数据库

Java连接SqlServer2008数据库 首先下载JDBC:下载地址:http://www.microsoft.com/zh-cn/download/details.aspx?id=21599 下载 完成后,是个exe文件,点击运行,会提示你选择解压目录. 解压完成后,进入 <你解压到得目录>\sqljdbc_3.0\chs,里边有两个我们需要的东东 一个是:sqljdbc.jar,另外一个是sqljdbc4.jar 这里使用sqljdbc4.jar 首先配置sa身份验证: 由于安装sql

java连接sqlserver的各个坑(菜鸟亲测)

作为一个菜鸟,刚开始用java连接sqlserver的时候,用的时间不短, 可以说解决了一个又出现一个,所以我觉得有必要把我的经验分享给大家. (因为我踩了大部分的坑) 第一个坑:加载驱动.java要连接数据库就需要驱动,我们去网上下载一个 sqljdbc.jar就行了.下载后该怎么做呢. 这个时候,我们在项目里面添加文件,然后把这个包粘贴进去,然后再右键这个包 添加构建路径,这样就可以了.这个时候你以为搞定了,可是后面还有很多坑. 第二坑:“ Failed to load the sqljdb

Java连接redis的使用演示样例

Redis是开源的key-value存储工具,redis通经常使用来存储结构化的数据,由于redis的key能够包括String.hash.listset和sorted list. Redisserver眼下最稳定的版本号是2.8.9,能够到官网http://redis.io/download下载.依据机器的类型及位数下载相应的版本号安装就可以,reids支持linux和windows操作系统. Redisclient支持多种语言,包含:c.C++.C#.php.java.python.go等语

Java Web开发环境搭建基础[Windows篇]

1. 准备软件: JDK:(jdk-6u10-rc2-bin-b32-windows-i586-p-12_sep_2008.exe) Tomcat:(apache-tomcat-7.0.54-windows-x86.zip) Eclipse:(eclipse-java-helios-SR1-win32.zip) MySQL:(mysql-5.5.20-win32.msi) MySQL JDBC:(mysql-connector-java-5.1.31.zip) Navicat for MySQL

在64位环境下Java连接Access2010的问题与解决

整理下思路,包括出现的问题及解决方案 Java连接Access的方法 1 ODBC桥接方法,就是在控制面板"ODBC数据源(32位或64位)"那里设置DSN,百度一下,一大堆设置方法,以及什么wow64下设置兼容32位之类的东西,这里设置的数据源名称acc,连接到D盘c.accdb数据库. 主要代码:String url ="jdbc:odbc:acc"; 2 直接连接access不使用ODBC数据源,这个就是直接写代码 主要代码:String url = &quo