Java和sudo命令执行

标签 java mysql linux ubuntu processbuilder

我遇到了使用 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: ">"

最佳答案

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

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

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

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

关于Java和sudo命令执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45533494/

相关文章:

java - 如何向 stringbuilder 添加另一个字符串?

MySQL 查询 - 排序和分组的混合

mysql - 如何使用 PHP 通过 SQL 插入 ID

linux - 写入 TCP 套接字不断返回 EAGAIN

linux - ext4 中的项目配额

java - 打开新的 native 应用程序时保持全屏

java - 如何通过点击html上的按钮来运行java程序

java - 没有找到适合 File(file) 的构造函数

php - 特定 if 语句的含义

c++ - 如何通过 Linux 的调度程序测量线程从繁忙的核心迁移的延迟?