博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
利用java实现可远程执行linux命令的小工具
阅读量:5772 次
发布时间:2019-06-18

本文共 3756 字,大约阅读时间需要 12 分钟。

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

 

 

转载于:https://www.cnblogs.com/lgfeng/p/3255535.html

你可能感兴趣的文章
Spark Streaming概念学习系列之Spark Streaming容错
查看>>
在命名空间下定义类型
查看>>
4、Java并发性和多线程-并发编程模型
查看>>
【图像处理】RGB Bayer Color分析
查看>>
3D Object Classification With Point Convolution —— 点云卷积网络
查看>>
James Whittaker的软件測试戒律(二)
查看>>
使用java.net.URLConnection发送http请求
查看>>
ZOJ 3699 Dakar Rally
查看>>
爬虫协议robots
查看>>
pathway一些网站
查看>>
Android使用am命令实现拨打电话、打开应用
查看>>
mysql mha高可用架构的安装
查看>>
Spring定时器多定时任务配置
查看>>
Linux 文件权限管理
查看>>
以神经网络使用为例的Matlab和Android混合编程
查看>>
Android自定义控件简单实现ratingbar效果
查看>>
Winform控件之DataGridView数据控件显示问题
查看>>
Java ArrayList 踩坑记录
查看>>
Linux下FFmpeg的安装编译过程【转】
查看>>
P1052 过河(状态压缩)
查看>>