在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 + "");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 }