簡體   English   中英

如何使用進程構建器運行.sh文件?

[英]How to run .sh file, using process builder?

我已經創建了.sh文件,里面是:

sudo iptables --flush
sudo iptables -A INPUT -m mac --mac-source 00:00:00:00:00:00 -j DROP

當我在終端上運行它時,它正常工作,但是當我使用processbuilder時,它沒有做任何事情。 沒有錯誤,但沒有發生任何事情,這是我的java上的代碼:

Process pb = new ProcessBuilder("/bin/bash","/my/file.sh").start();

我已經找到了答案,但我仍然無法運行.sh文件,即使我對已經完成它的人做同樣的事情。 對不起,如果這是一個糟糕的問題,謝謝。

你確定bash沒有運行嗎? 你檢查了start方法返回的Process對象嗎? 您可以從此對象獲取輸出值,輸出流等。

檢查你的流和exitvalue是否有錯誤... sudo可能是這里的問題。

不一定是最好的代碼,但它完成了工作。 執行一個進程,獲取process.streams並將它們打印到System.out。 可能會發現問題實際上是最重要的。

    ProcessBuilder pb = new ProcessBuilder(args);
    pb.redirectErrorStream(true);

    final Process proc = pb.start();    

    final StringBuilder builder = new StringBuilder("Process output");

    final Thread logThread = new Thread() {
        @Override
        public void run() {
            InputStream is = proc.getInputStream();
            BufferedReader reader = new BufferedReader(new InputStreamReader(is));

                try {
                    String line;

                    do {
                        line = reader.readLine();
                        builder.append("");
                        builder.append(line == null ? "" : line);
                        builder.append("<br/>");    
                    } while(line != null);

                } catch (IOException e) {
                    builder.append("Exception!  ").append(e.getMessage());
                } finally {
                    try {
                        reader.close();
                    } catch (IOException e) {
                        builder.append("Exception! ").append(e.getMessage());
                    }
                }
            }
        };

    logThread.start();
    int retVal = proc.waitFor();
    System.out.println(builder.toString());

從Java API Runtime: http//docs.oracle.com/javase/7/docs/api/java/lang/Runtime.html

// Java runtime
Runtime runtime = Runtime.getRuntime();
// Command
String[] command = {"/bin/bash", "/my/file.sh"};
// Process
Process process = runtime.exec(command);

另外,您應該小心使用可能要求root密碼的sudo命令。

暫無
暫無

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

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