利用java實現可遠端執行linux命令的小工具

haifeng0730發表於2013-08-13

在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 }

 

 

相關文章