簡體   English   中英

使用 java runtime exec 運行連續命令 Linux

[英]Run consecutive Commands Linux with java runtime exec

我需要使用這樣的 java 代碼運行兩個命令 Linux:

 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();
        }

問題是第二個命令(“whoami”)的輸出沒有顯示在第一個命令(“su - test”)上使用的當前用戶! 請問這段代碼有問題嗎?

在一般情況下,您需要在 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進行“解析”。 (問題是exec的拆分器不理解 shell 引用。)

正如Runtime.exec()Javadoc中所述:

在單獨的進程中執行指定的字符串命令。

每次通過 exec() 執行命令時,它將在單獨的子進程中執行。 這也意味着 su 的效果在返回后立即不復存在,這就是為什么whoami命令將在另一個子whoami中執行,再次使用最初啟動該程序的用戶。

su test -c whoami

會給你你想要的結果。

如果您想以某種方式運行多個命令,這些命令將在子shell 中執行,如果需要,請在此處查看響應

如何在 Java 的一個 cmd 窗口中運行多個命令? (使用 ProcessBuilder 模擬 shell)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM