【问题标题】:executing commands on terminal in linux through java通过java在linux终端上执行命令
【发布时间】:2011-05-09 00:59:31
【问题描述】:

我创建了一个独立的应用程序,我希望当用户单击运行按钮时终端应该打开并且应该在终端上执行特定的命令。我可以使用以下代码成功打开终端...

Process process = null;  
try {  
    process = new ProcessBuilder("xterm").start();  
} catch (IOException ex) {  
    System.err.println(ex);  
}  

上面的代码打开了一个终端窗口,但我无法对其执行任何命令。谁能告诉我该怎么做?

【问题讨论】:

    标签: java linux command terminal processbuilder


    【解决方案1】:

    试试

    new ProcessBuilder("xterm", "-e", 
                       "/full/path/to/your/program").start()
    

    【讨论】:

    • 实际上在终端中我不想运行特定的程序。我需要执行一个特定的命令。例如,终端中的 $gedit。
    • 顺便说一下,为了知识,我尝试了你上面给出的陈述,但它不起作用,甚至终端都没有打开。
    • 你能给我一个在linux终端中执行“ls”命令的代码吗?
    • "ls" 就是这样,它是一个程序(或一个内置的 shell)。您也可以像调用“some_very_different_program”一样调用“ls”。
    • 如果我想给出一个也有参数的命令该怎么办?
    【解决方案2】:

    假设您正在尝试使用 gedit 命令,那么您需要提供 gedit 的完整路径(例如 /usr/bin/gedit)。同样为所有其他命令指定完整路径。

    【讨论】:

      【解决方案3】:

      在 linux 中按原样执行任何命令,就像您在终端中键入的那样:

          import java.io.BufferedReader;
          import java.io.IOException;
          import java.io.InputStreamReader;
      
          public class CommandExecutor {
          public static String execute(String command){
              StringBuilder sb = new StringBuilder();
              String[] commands = new String[]{"/bin/sh","-c", command};
              try {
                  Process proc = new ProcessBuilder(commands).start();
                  BufferedReader stdInput = new BufferedReader(new 
                          InputStreamReader(proc.getInputStream()));
      
                  BufferedReader stdError = new BufferedReader(new 
                          InputStreamReader(proc.getErrorStream()));
      
                  String s = null;
                  while ((s = stdInput.readLine()) != null) {
                      sb.append(s);
                      sb.append("\n");
                  }
      
                  while ((s = stdError.readLine()) != null) {
                      sb.append(s);
                      sb.append("\n");
                  }
              } catch (IOException e) {
                  e.printStackTrace();
              }
              return sb.toString();
          }
      
      }
      

      用法:

      CommandExecutor.execute("ps ax | grep postgres");
      

      或者像这样复杂:

      CommandExecutor.execute("echo 'hello world' | openssl rsautl -encrypt -inkey public.pem -pubin | openssl enc -base64");
      
      String command = "ssh user@database-dev 'pg_dump -U postgres -w -h localhost db1 --schema-only'";
      CommandExecutor.execute(command);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-08-16
        • 1970-01-01
        • 2015-06-23
        • 2014-07-03
        • 2014-12-15
        • 1970-01-01
        • 2012-07-16
        相关资源
        最近更新 更多