【问题标题】:Running a shell script using ProcessBuilder使用 ProcessBuilder 运行 shell 脚本
【发布时间】:2017-08-08 14:17:30
【问题描述】:

我正在尝试使用 Java 和 ProcessBuilder 运行脚本。当我尝试运行时,我收到以下消息:error=2, No such file or directory。

我不知道我做错了什么,但这是我的代码(ps:我试图只执行不带参数的脚本,但错误是一样的:

String[] command = {"/teste/teste_back/script.sh, "+argument1+", "+argument+""};
ProcessBuilder p = new ProcessBuilder(command);

    try {  

        // create a process builder to send a command and a argument
        Process p2 = p.start(); 
        BufferedReader br = new BufferedReader(new InputStreamReader(p2.getInputStream()));
        String line;

        log.info("Output of running " + command + " is: ");
        System.out.println("Output of running " + command + " is: ");
        while ((line = br.readLine()) != null) {
            log.info(line);
        }

    }  

【问题讨论】:

标签: java linux process builder


【解决方案1】:

尝试替换

String[] command = {"/teste/teste_back/script.sh, "+argument1+", "+argument+""};

String[] command = {"/teste/teste_back/script.sh", argument1, argument};

更多信息请参考ProcessBuilder

ProcessBuilder(字符串...命令)

用指定的操作系统构造一个进程构建器 程序和参数。

【讨论】:

  • 实际上问题出在我的字符串最后的引号和参数上。
  • @JaganathanNanthakumar 嗨,在我的 shellscript 中有 user 和 pw 作为参数。但是我该如何初始化它们呢?当我将它们放入字符串命令时,程序不知道“用户”和“密码”是什么......?谢谢
【解决方案2】:

您可以使用 ProcessBuilder 定义方法。

public static Map execCommand(String... str) {
    Map<Integer, String> map = new HashMap<>();
    ProcessBuilder pb = new ProcessBuilder(str);
    pb.redirectErrorStream(true);
    Process process = null;
    try {
        process = pb.start();
    } catch (IOException e) {
        e.printStackTrace();
    }

    BufferedReader reader = null;
    if (process != null) {
        reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
    }

    String line;
    StringBuilder stringBuilder = new StringBuilder();
    try {
        if (reader != null) {
            while ((line = reader.readLine()) != null) {
                stringBuilder.append(line).append("\n");
            }
        }
    } catch (IOException e) {
        e.printStackTrace();
    }

    try {
        if (process != null) {
            process.waitFor();
        }
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

    if (process != null) {
        map.put(0, String.valueOf(process.exitValue()));
    }

    try {
        map.put(1, stringBuilder.toString());
    } catch (StringIndexOutOfBoundsException e) {
        if (stringBuilder.toString().length() == 0) {
            return map;
        }
    }
    return map;
}

你可以调用函数来执行shell命令或脚本

String cmds = "ifconfig";
String[] callCmd = {"/bin/bash", "-c", cmds};
System.out.println("exit code:\n" + execCommand(callCmd).get(0).toString());
System.out.println();
System.out.println("command result:\n" + execCommand(callCmd).get(1).toString());

【讨论】:

    【解决方案3】:

    除非您的 script.sh 名称中有逗号,否则这是错误的:

    String[] command = {"/teste/teste_back/script.sh" , argument1, argument};
    

    【讨论】: