通过Java代码执行shell命令/脚本

JDK自带的两种方式有通过Runtime.getRuntime().exec()和ProcessBuilder类来做, 后者是JDK1.5以后引入的,官方也建议放弃使用Runtime的方式来做。今天在实现的时候就是采用ProcessBuilder,apache commons类库也提供了一个exec包专门做这类功能,这次暂时没用到。

在编写过程中,遇到几个比较坑的地方:

1、构建ProcessBuilder采用的参数:

建议采用“/bin/bash”. "-c",  "your shell"组装一个List, 其实你一次如果执行多个命令,都可以统一放到那个“your shell”字符串中。

2、执行过程中输出流控制:

在执行过程中,我们肯定需要得到正常的执行结果,也需要知道出错的内容提示, 这时需要将错误输出流重定向到标准输出流,相当于合并在一起输出

3、有些命令是需要环境变量的支持, 这时需要执行evivonment()拷贝系统相关env变量到当前进程上下文中,供命令使用。

4、如果执行过程卡死,需要知道可以kill哪个进程, 所以输出内容中将当前进程ID打印出,便于手动处理。

完整代码如下:

  public int exeCmd(String shell) throws IOException {
    int success = 0;
    StringBuffer sb = new StringBuffer();
    BufferedReader br = null;

    // get name representing the running Java virtual machine.
    String name = ManagementFactory.getRuntimeMXBean().getName();
    String pid = name.split("@")[0];

    try {
      System.out.println("Starting to exec{ " + shell + " }. PID is: " + pid);
      Process process = null;
      ProcessBuilder pb = new ProcessBuilder("/bin/bash", "-c", shell);
      pb.environment();
      pb.redirectErrorStream(true); // merge error stream into standard stream
      process = pb.start();
      if (process != null) {
        br = new BufferedReader(
            new InputStreamReader(process.getInputStream()), 1024);
        process.waitFor();
      } else {
        System.out.println("There is no PID found.");
      }
      sb.append("Ending exec right now, the result is:\n");
      String line = null;
      while (br != null && (line = br.readLine()) != null) {
        sb.append(line).append("\n");
      }
    } catch (Exception ioe) {
      sb.append("Error occured when exec cmd:\n").append(ioe.getMessage())
          .append("\n");
    } finally {
      PrintWriter writer = null;
      if (br != null) {
        br.close();
      }
      try {
        writer = new PrintWriter(System.out);
        writer.write(sb.toString());
      } catch (Exception e) {
        LOG.error(e.getMessage(), e);
      } finally {
        writer.close();
      }
      success = 1;
    }
    return success;
  }
时间: 2024-10-04 15:56:50

通过Java代码执行shell命令/脚本的相关文章

Android JAVA代码执行shell命令

Android中级篇之用JAVA代码执行shell命令 [日期:2011-12-08] 来源:Linux社区  作者:y13872888163    在Android可能有的系统信息没有直接提供API接口来访问,为了获取系统信息时我们就要在用shell指令来获取信息,这时我们可以在代码中来执行命令 ,这里主要用到ProcessBuilder 这个类. 代码部分  : 1.package com.yin.system_analysis; 2.import java.io.File; 3.impor

Java远程执行Shell命令

1. Jar包:ganymed-ssh2-build210.jar 2. 步骤: a) 连接: Connection conn = new Connection(ipAddr); conn.connect(); b)认证: boolean authenticateVal = conn.authenticateWithPassword(userName, password); c) 打开一个Session: if(authenticateVal) Session session = conn.op

使用java代码执行linux命令

前提: java代码是在windows下面写的,要打包放到linux下面运行,并且执行某个脚本. java代码: try { // 起作用的代码其实就下面这一行, 参数是linux中要执行的代码 Runtime.getRuntime().exec("sh generator.sh").waitFor(); } catch (IOException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printSt

Android Java代码执行adb Shell命令

通过java代码代替adb命令 增加工具类 ShellUtils.java import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.util.List; /** * ShellUtils */ public class ShellUtils { public static fin

Java 实现 ssh命令 登录主机执行shell命令

Java 实现 ssh命令 登录主机执行shell命令 1.SSH命令 SSH 为 Secure Shell 的缩写,由 IETF 的网络小组(Network Working Group)所制定:SSH 为建立在应用层基础上的安全协议.SSH 是较可靠,专为远程登录会话和其他网络服务提供安全性的协议.利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题.SSH最初是UNIX系统上的一个程序,后来又迅速扩展到其他操作平台.SSH在正确使用时可弥补网络中的漏洞.SSH客户端适用于多种平台.几乎

java执行shell命令,chmod 777 xxx,改变权限无效的解决办法。

在java程序中执行shell命令,改变文件的权限,可以在命令行中执行 chmod 777 <span style="font-family: Arial, Helvetica, sans-serif;">/data/misc/123.sh"</span> 来改变权限,但是在java代码中执行这个命令时使用 Runtime.getRuntime().exec("chmod 777 /data/misc/123.sh"): 无效,使用

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

Linux远程执行Shell命令或脚本

## 远程执行shell命令 ssh [user]@[server] '[command]' # eg. ssh [email protected]192.168.1.1 'uptime' ## 远程执行本地shell脚本 ssh [user]@[server] 'bash -s' < [local_script] # eg. ssh [email protected]192.168.1.1 'bash -s' < local_script.sh

JAVA远程执行Shell脚本类

1.java远程执行shell脚本类 1 package com.test.common.utility; 2 3 import java.io.IOException; 4 import java.io.InputStream; 5 import java.io.UnsupportedEncodingException; 6 import java.nio.charset.Charset; 7 8 import org.apache.commons.io.IOUtils; 9 import o