使用Java语言,连接linux服务器,并远程执行shell 脚本

依赖:

 1 <dependency>
 2             <groupId>ch.ethz.ganymed</groupId>
 3             <artifactId>ganymed-ssh2</artifactId>
 4             <version>build210</version>
 5         </dependency>
 6  
 7         <dependency>
 8             <groupId>org.apache.directory.studio</groupId>
 9             <artifactId>org.apache.commons.lang</artifactId>
10             <version>2.6</version>
11  </dependency>
  1 package com.lwl.controller;
  2 
  3 import ch.ethz.ssh2.Connection;
  4 import ch.ethz.ssh2.Session;
  5 import ch.ethz.ssh2.StreamGobbler;
  6 import com.test.controller.Script;
  7 import org.apache.commons.lang.StringUtils;
  8 import org.springframework.stereotype.Controller;
  9 import org.springframework.web.bind.annotation.RequestMapping;
 10 
 11 import javax.servlet.http.HttpServletRequest;
 12 import javax.servlet.http.HttpServletResponse;
 13 import java.io.*;
 14 
 15 /**
 16  * @author liuwenlong
 17  * @create 2021-11-08 20:42:07
 18  */
 19 @SuppressWarnings("all")
 20 @Controller
 21 @RequestMapping(value = "server")
 22 public class ConnectServerController {
 23 
 24     //字符编码默认是utf-8
 25     private static String DEFAULTCHART = "UTF-8";
 26     private Connection conn;
 27     private String ip;
 28     private String userName;
 29     private String userPwd;
 30 
 31     public ConnectServerController(String ip, String userName, String userPwd) {
 32         this.ip = ip;
 33         this.userName = userName;
 34         this.userPwd = userPwd;
 35     }
 36 
 37 
 38     public ConnectServerController() {
 39 
 40     }
 41 
 42     /**
 43      * 远程登录linux的主机
 44      *
 45      * @return 登录成功返回true,否则返回false
 46      * @author 47      * @since V0.1
 48      */
 49     public Boolean login() {
 50         boolean flg = false;
 51         try {
 52             conn = new Connection(ip);
 53             conn.connect();//连接
 54             flg = conn.authenticateWithPassword(userName, userPwd);//认证
 55         } catch (IOException e) {
 56             e.printStackTrace();
 57         }
 58         return flg;
 59     }
 60 
 61     /**
 62      * @param cmd 即将执行的命令
 63      * @return 命令执行完后返回的结果值
 64      * @author 65      * 远程执行shll脚本或者命令
 66      * @since V0.1
 67      */
 68     public String execute(String cmd) {
 69         String result = "";
 70         try {
 71             if (login()) {
 72                 Session session = conn.openSession();//打开一个会话
 73                 session.execCommand(cmd);//执行命令
 74                 result = processStdout(session.getStdout(), DEFAULTCHART);
 75                 //如果为得到标准输出为空,说明脚本执行出错了
 76                 if (StringUtils.isBlank(result)) {
 77                     result = processStdout(session.getStderr(), DEFAULTCHART);
 78                 }
 79                 conn.close();
 80                 session.close();
 81             }
 82         } catch (IOException e) {
 83             e.printStackTrace();
 84         }
 85         return result;
 86     }
 87 
 88 
 89     /**
 90      * @param cmd 即将执行的命令
 91      * @return 命令执行成功后返回的结果值,如果命令执行失败,返回空字符串,不是null
 92      * @author 93      * 远程执行shll脚本或者命令
 94      * @since V0.1
 95      */
 96     public String executeSuccess(String cmd) {
 97         String result = "";
 98         try {
 99             if (login()) {
100                 Session session = conn.openSession();//打开一个会话
101                 session.execCommand(cmd);//执行命令
102                 result = processStdout(session.getStdout(), DEFAULTCHART);
103                 conn.close();
104                 session.close();
105             }
106         } catch (IOException e) {
107             e.printStackTrace();
108         }
109         return result;
110     }
111 
112     /**
113      * 解析脚本执行返回的结果集
114      *
115      * @param in      输入流对象
116      * @param charset 编码
117      * @return 以纯文本的格式返回
118      * @author119      * @since V0.1
120      */
121     private String processStdout(InputStream in, String charset) {
122         InputStream stdout = new StreamGobbler(in);
123         StringBuffer buffer = new StringBuffer();
124         ;
125         try {
126             BufferedReader br = new BufferedReader(new InputStreamReader(stdout, charset));
127             String line = null;
128             while ((line = br.readLine()) != null) {
129                 buffer.append(line + "\n");
130             }
131         } catch (UnsupportedEncodingException e) {
132             e.printStackTrace();
133         } catch (IOException e) {
134             e.printStackTrace();
135         }
136         return buffer.toString();
137     }
138 
139     public static void setCharset(String charset) {
140         DEFAULTCHART = charset;
141     }
142 
143     public Connection getConn() {
144         return conn;
145     }
146 
147     public void setConn(Connection conn) {
148         this.conn = conn;
149     }
150 
151     public String getIp() {
152         return ip;
153     }
154 
155     public void setIp(String ip) {
156         this.ip = ip;
157     }
158 
159     public String getUserName() {
160         return userName;
161     }
162 
163     public void setUserName(String userName) {
164         this.userName = userName;
165     }
166 
167     public String getUserPwd() {
168         return userPwd;
169     }
170 
171     public void setUserPwd(String userPwd) {
172         this.userPwd = userPwd;
173     }
174 
175     /**
176      * 连接服务器,执行命令
177      *
178      * @param command
179      * @param resp
180      * @param req
181      * @throws IOException
182      */
183     @RequestMapping(value = "server")
184     public void server(String command, HttpServletResponse resp, HttpServletRequest req) throws IOException {
185         Script rec = new Script("服务器IP", "账号", "密码");
186         resp.setContentType("text/plain; charset=UTF-8");
187         resp.setCharacterEncoding("UTF-8");
188         PrintWriter out = resp.getWriter();
189         command = command.trim();
190         System.out.println("指令:" + command);
191         //执行命令
192         String result = rec.execute(command);
193         System.out.println(result);
194         out.print(result);
195         //System.out.println(rec.execute("/usr/ksybak/myshell/tomcat-fw.sh"));
196         //执行脚本
197         //rec.execute("sh /usr/local/tomcat/bin/statup.sh");
198         //这个方法与上面最大的区别就是,上面的方法,不管执行成功与否都返回,
199         //这个方法呢,如果命令或者脚本执行错误将返回空字符串
200         //System.out.println(rec.executeSuccess("ifconfig"));
201     }
202 }

 

运行结果

 

posted @ 2021-11-08 23:01  勤快的懒羊羊  阅读(853)  评论(0编辑  收藏  举报