首页 > 解决方案 > 从java执行shell脚本

问题描述

我想从java执行一个shell脚本。我有下一个代码

    ProcessBuilder pb2 = null;
    if (this.args.size() == 0) {
        pb2 = new ProcessBuilder(file.getPath());
    } else if (this.args.size() > 0) {
        pb2 = new ProcessBuilder(file.getPath(), this.args.get(0));
    }

    Process p2;
        p2 = pb2.start();
        BufferedReader reader = new BufferedReader(new InputStreamReader(p2.getInputStream()));
        String line = null;
        while ((line = reader.readLine()) != null) {
            log(line);
                }

但我得到了Permission denied。我曾尝试sh在开头执行文件,但代码不起作用。

       ProcessBuilder pb2 = null;
    if (this.args.size() == 0) {
        pb2 = new ProcessBuilder("sh", file.getPath());
    } else if (this.args.size() > 0) {
        pb2 = new ProcessBuilder("sh", file.getPath(), this.args.get(0));
    }

    Process p2;
        p2 = pb2.start();
        BufferedReader reader = new BufferedReader(new InputStreamReader(p2.getInputStream()));
        String line = null;
        while ((line = reader.readLine()) != null) {
            log(line);
                }

我可以允许它,chmod a+x但想法是自动进行。

更新:我尝试了第一个代码file.setExecutable(true)但没有任何反应,我没有得到Permission Denied但文件没有执行

标签: javaubuntu

解决方案


如果要将文件作为 shell 脚本执行,则必须设置执行权限。没有办法解决这个问题。

如果您从 Java 应用程序创建脚本文件,那么您的应用程序可以在创建文件后更改文件权限。

如果某个用户正在上传此脚本,那么您需要非常非常确定您信任该用户。如果您从不值得信任的人那里接受了一个 shell 脚本,就会发生各种令人讨厌的事情。(这包括无辜但危险的错误的后果。)


更新:我尝试了第一个代码,file.setExecutable(true)但没有任何反应,我没有得到 Permission Denied 但文件没有执行。

发生了什么事。您已停止收到 Permission Denied 消息!

下一步将调试您正在生成/执行的脚本:

  • 目测吧。检查“hash bang”行是否正确。寻找其他错误。

  • 从脚本中捕获标准输出和标准错误,并检查错误。

  • 在脚本中添加一些“跟踪打印”;例如

        echo "here 1" >> /tmp/log
    
  • 子进程是否在等待来自 Java 父进程的输入?

  • 您是否在父进程中读取孩子的标准输出和标准错误?


推荐阅读