3

I need to run two commands Linux using java code like this:

 Runtime rt = Runtime.getRuntime();
          
           
            Process  pr=rt.exec("su - test");
            String line=null;
            BufferedReader input = new BufferedReader(new InputStreamReader(pr.getInputStream()));
          
            while((line=input.readLine()) != null) {
                
                System.out.println(line);
            }
           pr = rt.exec("whoami");
             input = new BufferedReader(new InputStreamReader(pr.getInputStream()));

             line=null;

            while((line=input.readLine()) != null) {
                 System.out.println(line);
            }               
            int exitVal = pr.waitFor();
            System.out.println("Exited with error code "+exitVal);              
        } catch(Exception e) {
            System.out.println(e.toString());
            e.printStackTrace();
        }

The problem is the output of the second command ("whoami") doesn't display the current user which used on the first command ("su - test")! Is there any problem on this code please?

4

3 回答 3

6

在一般情况下,您需要在 shell 中运行命令。像这样的东西:

    Process  pr = rt.exec(new String[]{"/bin/sh", "-c", "cd /tmp ; ls"});

但在这种情况下,这是行不通的,因为su它本身就创建了一个交互式子外壳。你可以这样做:

    Process  pr = rt.exec(new String[]{"su", "-c", "whoami", "-", "test"});

或者

    Process  pr = rt.exec(new String[]{"su", "test", "-c", "whoami"});

另一种选择是使用sudo代替su; 例如

    Process  pr = rt.exec(new String[]{"sudo", "-u", "test", "whoami"});

注意:虽然上述内容实际上都不需要这样做,但最好将“命令行”组装为字符串数组,而不是exec进行“解析”。(问题是execs splitter 不理解 shell 引用。)

于 2013-07-23T14:19:54.553 回答
2

Runtime.exec() 的 Javadoc中所述:

在单独的进程中执行指定的字符串命令。

每次通过 exec() 执行命令时,它将在单独的子进程中执行。这也意味着 su 的效果在返回后立即不复存在,这就是为什么该whoami命令将在另一个子进程中执行,再次使用最初启动程序的用户。

su test -c whoami

会给你你想要的结果。

于 2013-07-23T14:19:37.467 回答
0

如果您想以某种方式运行多个命令,如果需要,这些命令将在子 shell 中执行,请参见此处的响应

如何在 Java 的一个 cmd 窗口中运行多个命令?(使用ProcessBuilder模拟一个shell)

于 2016-05-27T22:11:56.367 回答