【问题标题】:Java and sudo command executionJava 和 sudo 命令执行
【发布时间】:2017-08-06 15:21:14
【问题描述】:

我在使用 ProcessBuilder 和 Runtime.exec 调用 sudo 命令时遇到了挑战。我认为 ProcessBuilder 总体上是更好的解决方案,但两者都产生相同的结果 - 它们在 Ubuntu 上执行 shell 命令很好,但如果我尝试执行 sudo -i mysql 命令,例如:

    public static void runProcess(String[] process) {
        String s = null;
        try { 
            Process p = new ProcessBuilder(process).start();
            BufferedReader stdInput = new BufferedReader(new InputStreamReader(p.getInputStream()));
            BufferedReader stdError = new BufferedReader(new InputStreamReader(p.getErrorStream()));
            while ((s = stdInput.readLine()) != null) { System.out.println(s); }
            while ((s = stdError.readLine()) != null) { System.out.println(s); }
        } catch (IOException e) { e.printStackTrace(); }
    }   

这两个命令有效:

        String[] cmdArgs0 = { "sudo", "echo", "Done" };
        runProcess(cmdArgs0);

        String[] cmdArgs1 = { "bash", usbDrivePath+"/ASWebUI/Install.sh" };
        runProcess(cmdArgs1);

但这不是:

        String[] cmdArgs2 = { "sudo", "-i", "mysqldump", "Core", ">", cachePath+"/SQLDumps/Core.sql" };
        runProcess(cmdArgs2);

错误:

mesg: ttyname failed: Inappropriate ioctl for device
mysqldump: Couldn't find table: ">"

【问题讨论】:

    标签: java mysql linux ubuntu processbuilder


    【解决方案1】:

    ProcessBuilder 不允许您使用> 字符重定向输出。相反,您可以使用processBuilder.redirectOutput() 方法来指定所需的输出。

    File dumpFile = new File("Core.sql");
    processBuilder.redirectOutput(Redirect.to(dumpFile));
    

    甚至可以使用mysqldump的--result-file选项来指定转储文件:

    mysqldump [options] --result-file=dump.sql
    

    【讨论】:

    • @user3260912 很高兴为您提供帮助!请检查我对答案的最后编辑,我已将Redirect.appendTo(dumpFile) 更改为Redirect.to(dumpFile),因为第一个对应于>> 而不是>
    最近更新 更多