Java调用远程Shell脚本(待验证)

来源:互联网 发布:淘宝大图轮播 编辑:程序博客网 时间:2024/06/05 06:56

最近,需要开发一个Web管理系统,通过Web控制来执行远程Linux主机上的服务脚本,参考了http://blog.csdn.net/sheismylife/archive/2009/11/17/4823696.aspx使用的一个小工具,确实很好地解决了这个问题,做个记录,以供查阅。

这个小工具打成一个jar文件:ganymed-ssh2-build210.jar,可以在http://www.ganymed.ethz.ch/ssh2/处下载。该工具是基于SSH2协议的实现,在使用它的过程中非常容易,只需要指定合法的用户名口令,或者授权认证文件,就可以创建到远程Linux主机的连接,在建立起来的会话中调用该Linux主机上的脚本文件,执行相关操作。

下面是我基于ganymed-ssh2-build210.jar库,写的一个Demo,代码如下所示:

package org.shirdrn.shell;import java.io.IOException;import java.io.InputStream;import java.nio.charset.Charset;import ch.ethz.ssh2.Connection;import ch.ethz.ssh2.Session;/*** 远程Shell脚本执行工具** @author Administrator*/public class RemoteShellTool {private Connection conn;private String ipAddr;private String charset = Charset.defaultCharset().toString();private String userName;private String password;public RemoteShellTool(String ipAddr, String userName, String password, String charset) {   this.ipAddr = ipAddr;   this.userName = userName;   this.password = password;   if(charset != null) {    this.charset = charset;   }}/*** 登录远程Linux主机** @return* @throws IOException*/public boolean login() throws IOException {   conn = new Connection(ipAddr);   conn.connect(); // 连接   return conn.authenticateWithPassword(userName, password); // 认证}/*** 执行Shell脚本或命令** @param cmds 命令行序列* @return*/public String exec(String cmds) {   InputStream in = null;   String result = "";   try {    if (this.login()) {     Session session = conn.openSession(); // 打开一个会话     session.execCommand(cmds);     in = session.getStdout();     result = this.processStdout(in, this.charset);     conn.close();    }   } catch (IOException e1) {    e1.printStackTrace();   }   return result;}/*** 解析流获取字符串信息** @param in 输入流对象* @param charset 字符集* @return*/public String processStdout(InputStream in, String charset) {   byte[] buf = new byte[1024];   StringBuffer sb = new StringBuffer();   try {    while (in.read(buf) != -1) {     sb.append(new String(buf, charset));    }   } catch (IOException e) {    e.printStackTrace();   }   return sb.toString();}}


需要说明的一点是,执行脚本以后,可以获取脚本执行的结果文本,需要对这些文本进行正确编码后返回给客户端(我们的Web管理控制台),才能看到实际脚本执行的结果。

另外,当执行login方法时,登录成功,位于当前的***.***.***.***:/home/username/目录之下,你可以指定脚本文件所在的绝对路径,或者通过cd导航到脚本文件所在的目录,然后传递执行脚本所需要的参数,完成脚本调用执行。

http://hi.baidu.com/shirdrn/blog/item/59223b129a7322c5c3fd78a9.html