利用java实现可远程执行linux命令的小工具

在linux的脚本中,如果不对机器做其他的处理,不能实现在linux的机器上执行命令。为了解决这个问题,写了个小工具来解决这个问题。

后面的代码是利用java实现的可远程执行linux命令的小工具,代码中使用了jsch这个开源包。

JSch 是SSH2的一个纯Java实现。它允许你连接到一个sshd 服务器,使用端口转发,X11转发,文件传输等等。jsch的jar,可从官网下载。

  1 import java.io.IOException;
  2 import java.io.InputStream;
  3 import java.util.Properties;
  4 
  5 import com.jcraft.jsch.Channel;
  6 import com.jcraft.jsch.ChannelExec;
  7 import com.jcraft.jsch.JSch;
  8 import com.jcraft.jsch.JSchException;
  9 import com.jcraft.jsch.Session;
 10 
 11 /**
 12  * 
 13  * 类似ssh执行命令的小工具
 14  * 
 15  * @author walker
 16  * 
 17  */
 18 public class SSH {
 19     private String userName;
 20     private String password;
 21     private String host;
 22 
 23     public SSH(String host, String userName, String password) {
 24         this.host = host;
 25         this.userName = userName;
 26         this.password = password;
 27     }
 28 
 29     private Session getSession() {
 30         JSch jsch = new JSch();
 31         Session session = null;
 32 
 33         try {
 34             session = jsch.getSession(userName, host);
 35             session.setPassword(password);
 36 
 37             Properties props = new Properties();
 38             props.put("StrictHostKeyChecking", "no");
 39             session.setConfig(props);
 40             session.connect();
 41         } catch (JSchException e) {
 42             e.printStackTrace();
 43         }
 44         return session;
 45     }
 46 
 47     public boolean exec(String[] cmds) {
 48         StringBuffer cmdBuffer = new StringBuffer();
 49 
 50         for (int i = 0; i < cmds.length; i++) {
 51             if (i != 3) {
 52                 cmdBuffer.append(" ");
 53             }
 54             cmdBuffer.append(cmds[i]);
 55         }
 56         return exec(cmdBuffer.toString());
 57     }
 58 
 59     public boolean exec(String cmd) {
 60         Session session = getSession();
 61         Channel channel = null;
 62         InputStream in = null;
 63         try {
 64             channel = session.openChannel("exec");
 65             ((ChannelExec) channel).setCommand(cmd);
 66             ((ChannelExec) channel).setInputStream(null);
 67             ((ChannelExec) channel).setErrStream(System.err); // 获取执行错误的信息
 68 
 69             in = channel.getInputStream();
 70             channel.connect();
 71             byte[] b = new byte[1024];
 72             int size = -1;
 73             while ((size = in.read()) > -1) {
 74                 System.out.print(new String(b, 0, size)); // 打印执行命令的所返回的信息
 75             }
 76             return true;
 77         } catch (Exception e) {
 78             e.printStackTrace();
 79         } finally {
 80             // 关闭流
 81             if (in != null) {
 82                 try {
 83                     in.close();
 84                 } catch (IOException e) {
 85                 }
 86             }
 87             // 关闭连接
 88             channel.disconnect();
 89             session.disconnect();
 90         }
 91 
 92         return false;
 93     }
 94 
 95     /**
 96      * @param args
 97      */
 98     public static void main(String[] args) {
 99         if (args.length < 4) {
100             System.err.println("usage:\n\t" + SSH.class.getName()
101                     + " <host> <usename> <password> <cmds>");
102             System.exit(1);
103         }
104 
105         // 用以保存命令(可能是一串很长的命令)
106         StringBuffer cmdBuffer = new StringBuffer();
107         for (int i = 3; i < args.length; i++) {
108             if (i != 3) {
109                 cmdBuffer.append(" ");
110             }
111             cmdBuffer.append(args[i]);
112         }
113 
114         SSH ssh = new SSH(args[0], args[1], args[2]);
115         System.exit(ssh.exec(cmdBuffer.toString()) ? 0 : 1);
116     }
117 }

 

 

posted @ 2013-08-13 17:29  haifeng0730  阅读(4566)  评论(2编辑  收藏  举报

欲起步的人生贵在励志 已起步的人生贵在坚持