如何从java执行linux命令'su'命令时输入密码作为输入?

时间:2017-07-10 06:15:12

标签: java

我试图从java执行一些shell命令行。但似乎无法切换用户。我需要在切换用户时输入密码作为输入。

        Runtime rtime = Runtime.getRuntime();
        Process child = rtime.exec("/bin/sh \n");
        BufferedWriter outCommand = new BufferedWriter(
                        new OutputStreamWriter(child.getOutputStream()));
        outCommand.write("su - username");
        System.out.println("user switched");
        outCommand.flush();
        outCommand.write("password");
        System.out.println("password entered");
        outCommand.flush();
        outCommand.write("rm -rf test.txt");
        System.out.println("file removed");
        outCommand.flush();
        outCommand.close();

1 个答案:

答案 0 :(得分:1)

write只是写出你给它的角色。它不会在它们之后执行换行,因此shell只会从该代码中看到su - usernamepasswordrm -rf -test.txt

BufferedWriter有一个newLine method用于为环境编写换行符序列(例如,使用line.separator属性)。

E.g:

outCommand.write("su - username");
outCommand.newLine();                    // ***
outCommand.flush();                      // (I'd also probably put this before the output)
System.out.println("user switched");
outCommand.write("password");
outCommand.newLine();                    // ***
outCommand.flush();
System.out.println("password entered");
// ...

附注:如果此代码将用于除您的计算机以外的任何地方,我建议您阅读有关密码的最佳做法。特别是,一般建议不要在String中存储密码,即使是暂时的。相反,使用char[]并尽可能少地保留密码,尽快用其他字符覆盖密码。这样可以防止密码在内存中以明文形式存放任何重要时间。