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