设为首页 收藏本站
查看: 938|回复: 0

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

[复制链接]

尚未签到

发表于 2015-4-29 09:51:31 | 显示全部楼层 |阅读模式
  最近,需要开发一个Web管理系统,通过Web控制来执行远程Linux主机上的服务脚本,参考了http://blog.iyunv.com/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

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-61810-1-1.html 上篇帖子: 使用Bash编写Linux Shell脚本-7.复合命令 下篇帖子: shell中的fork、source和exec总结(包括环境变量)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表