java调用shell脚本,并且返回结果集

 1 /**
 2      * 运行shell脚本
 3      * @param shell 需要运行的shell脚本
 4      */
 5     public static void execShell(String shell){
 6         try {
 7             Runtime rt = Runtime.getRuntime();
 8             rt.exec(shell);
 9         } catch (Exception e) {
10             e.printStackTrace();
11         }
12     }
13
14
15 /**
16      * 运行shell
17      *
18      * @param shStr
19      *            需要执行的shell
20      * @return
21      * @throws IOException
22      */
23     public static List runShell(String shStr) throws Exception {
24         List<String> strList = new ArrayList();
25
26         Process process;
27         process = Runtime.getRuntime().exec(new String[]{"/bin/sh","-c",shStr},null,null);
28         InputStreamReader ir = new InputStreamReader(process
29                 .getInputStream());
30         LineNumberReader input = new LineNumberReader(ir);
31         String line;
32         process.waitFor();
33         while ((line = input.readLine()) != null){
34             strList.add(line);
35         }
36
37         return strList;
38     }

远程登陆linux且调用shell

首先在远程服务器上编写一个测试脚本test.sh,并赋予可执行权限:chmod +x test.sh

1     #!/bin/bash
2     echo ‘test22‘
3     echo $1  

$1是脚本传进来的第一个参数,我们控制台打印一下这个参数

新建maven项目,添加依赖:

1     <dependency>
2         <groupId>org.jvnet.hudson</groupId>
3         <artifactId>ganymed-ssh2</artifactId>
4         <version>build210-hudson-1</version>
5     </dependency>  

编写一个工具类:

 1 package com.xj.runshell;
 2
 3 import java.io.IOException;
 4 import java.io.InputStream;
 5 import java.nio.charset.Charset;
 6
 7 import ch.ethz.ssh2.Connection;
 8 import ch.ethz.ssh2.Session;
 9
10 public class RemoteShellTool {
11
12     private Connection conn;
13     private String ipAddr;
14     private String charset = Charset.defaultCharset().toString();
15     private String userName;
16     private String password;
17
18     public RemoteShellTool(String ipAddr, String userName, String password,
19             String charset) {
20         this.ipAddr = ipAddr;
21         this.userName = userName;
22         this.password = password;
23         if (charset != null) {
24             this.charset = charset;
25         }
26     }
27
28     public boolean login() throws IOException {
29         conn = new Connection(ipAddr);
30         conn.connect(); // 连接
31         return conn.authenticateWithPassword(userName, password); // 认证
32     }
33
34     public String exec(String cmds) {
35         InputStream in = null;
36         String result = "";
37         try {
38             if (this.login()) {
39                 Session session = conn.openSession(); // 打开一个会话
40                 session.execCommand(cmds);
41
42                 in = session.getStdout();
43                 result = this.processStdout(in, this.charset);
44                 session.close();
45                 conn.close();
46             }
47         } catch (IOException e1) {
48             e1.printStackTrace();
49         }
50         return result;
51     }
52
53     public String processStdout(InputStream in, String charset) {
54
55         byte[] buf = new byte[1024];
56         StringBuffer sb = new StringBuffer();
57         try {
58             while (in.read(buf) != -1) {
59                 sb.append(new String(buf, charset));
60             }
61         } catch (IOException e) {
62             e.printStackTrace();
63         }
64         return sb.toString();
65     }
66
67     /**
68      * @param args
69      */
70     public static void main(String[] args) {
71
72         RemoteShellTool tool = new RemoteShellTool("192.168.27.41", "hadoop",
73                 "hadoop", "utf-8");
74
75         String result = tool.exec("./test.sh xiaojun");
76         System.out.print(result);
77
78     }
79
80 } 

main函数中执行了./test.sh xiaojun这个命令,控制台打印出:

test22

xiaojun

时间: 2024-10-27 10:37:17

java调用shell脚本,并且返回结果集的相关文章

java调用shell脚本,并获得结果集的例子

/** * 运行shell脚本 * @param shell 需要运行的shell脚本 */ public static void execShell(String shell){ try { Runtime rt = Runtime.getRuntime(); rt.exec(shell); } catch (Exception e) { e.printStackTrace(); } } /** * 运行shell * * @param shStr * 需要执行的shell * @return

Java 调用 shell 脚本详解

这一年的项目中,有大量的场景需要Java 进程调用 Linux的bash shell 脚本实现相关功能. 从之前的项目中拷贝的相关模块和网上的例子来看,有个别的"陷阱"造成调用shell 脚本在某些特殊的场景下,有一些奇奇怪怪的bug. 大家且听我一一道来. 先看看网上搜索到的例子: [java] view plain copy package someTest; import java.io.BufferedReader; import java.io.IOException; im

JAVA调用Shell脚本

在实际项目中,Java有时候需要调用C写出来的东西,除了JNI以外,我认为一种比较好的方法是JAVA调用Shell.先把C写出来的make成可执行文件,然后再写一个shell脚本执行该可执行文件,最后是JAVA调用该shell脚本. JAVA调用很简单,例子如下: 首先是shell脚本 [plain] view plain copy print? #!/bin/sh echo Begin word cluster /home/felven/word2vec/word2vec -train /ho

java调用shell脚本且传递参数

在最近的工作中,需要用到Java要调用shell脚本的情况.总结如下: @RequestMapping("/changePermission") public String changePermission(){ String returnCode = ""; try { Process process = Runtime.getRuntime().exec("chmod 755 /tmp/upgrade.sh"); process.waitFo

Java调用 shell脚本阻塞

Java在调用Shell时,要不断读取进程中标准输出和错误输出流的信息,否则缓冲区被写满就会造成子进程阻塞而无法继续运行下去,可起两个线程不断读取标准输出.错误流信息而不被阻塞 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.UnsupportedEncodingExcept

Java代码调用Shell脚本并传入参数实现DB2数据库表导出到文件

本文通过Java代码调用Shell脚本并传入参数实现DB2数据库表导出到文件,代码如下: import java.io.File; import java.io.IOException; import java.io.InputStreamReader; import java.io.LineNumberReader; import java.util.HashMap; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import

Java调用Shell命令和脚本

1.介绍 有时候我们在Linux中运行Java程序时,需要调用一些Shell命令和脚本.而Runtime.getRuntime().exec()方法给我们提供了这个功能,而且Runtime.getRuntime()给我们提供了以下几种exec()方法: Process exec(String command) 在单独的进程中执行指定的字符串命令. Process exec(String[] cmdarray) 在单独的进程中执行指定命令和变量. Process exec(String[] cmd

java servlet调用带有多个返回结果集的存储过程

一.mysql存储过程 这里我先说下我这个功能实现的逻辑及途中遇到的一些问题.这个存储过程一共带两个输入参数,一共关联到两张表的查询,每个参数都对应查询表中的一个判断,所以一共返回了两个结果集(当然要返回更多结果集也是一样的,如果需要判断,就继续增加存储过程参数,如果不需要判断就直接在存储过程中,增加查询的SQL语句即可).实现这个功能还有更简单的方法,可以写SQL关联语句查询出两张表的结果,返回一个组合的结果集.我这里当然是为了实现这个效果,所以把它的实现复杂化了.继续说下我今天在mysql上

Java执行shell脚本关闭远程数据库

本实例为用Java执行shell脚本启动或关闭远程Mysql数据库,需求原因:游戏服务器合服后,为了节省内存消耗,需要关闭合服后的服务器不必要的数据库(一台服务器主机存在多个MySql数据库),以提高服务器性能,但有时需要查询历史游戏玩家信息,又需要开启数据库,为了节省运维人员的人力和时间,游戏后台就提供非运维人员都可操作开关数据库的操作. 功能实现步骤: 第一:服务器后台提供参数,发送异步请求,请求方法如下 <script type="text/javascript">