【问题标题】:How to execute system commands (linux/bsd) using Java如何使用 Java 执行系统命令 (linux/bsd)
【发布时间】:2010-10-21 23:28:50
【问题描述】:

我试图廉价并在 Java 中执行本地系统命令 (uname -a)。我希望从uname 获取输出并将其存储在字符串中。这样做的最佳方法是什么?当前代码:

public class lame {

    public static void main(String args[]) {
        try {
            Process p = Runtime.getRuntime().exec("uname -a");
            p.waitFor();
            BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
            String line=reader.readLine();

            while (line != null) {    
                System.out.println(line);
                line = reader.readLine();
            }

        }
        catch(IOException e1) {}
        catch(InterruptedException e2) {}

        System.out.println("finished.");
    }
}

【问题讨论】:

    标签: java output-redirect


    【解决方案1】:

    你的方式离我可能做的不远:

    Runtime r = Runtime.getRuntime();
    Process p = r.exec("uname -a");
    p.waitFor();
    BufferedReader b = new BufferedReader(new InputStreamReader(p.getInputStream()));
    String line = "";
    
    while ((line = b.readLine()) != null) {
      System.out.println(line);
    }
    
    b.close();
    

    当然,处理您关心的任何异常。

    【讨论】:

      【解决方案2】:

      这是最好的方法。 你也可以使用ProcessBuilder,它有一个可变参数构造函数,所以你可以节省一两行代码

      【讨论】:

      • 这不是 最好的 方式,因为命令是使用 shell 执行的,因此,如果命令参数取自用户输入,它很容易受到操作系统命令注入的影响。 ProcessBuilder 在这方面肯定更安全。
      • “我试图廉价并执行本地系统命令 (uname -a)...” - 这是廉价并执行本地系统命令的最佳方式。您所指的是不受操作系统命令注入影响的最佳方法;)
      • 你知道,这有点像向程序员询问最快下悬崖的方法... :) 我在使用 StackOverflow 的 Java 应用程序中发现了操作系统命令注入-inspired 执行模式,所以我认为任何提到 Runtime.exec() 的东西都应该在这里发出一个大而厚的警告。
      • 你知道,这很像,我同意,仍然......不能真正改变人们的行为,如果他们只是从 SO 中复制粘贴而不是重新评估他们最初的想法,大胖子包括警告:(
      【解决方案3】:

      你在做什么看起来不错。如果您的命令仅返回单个字符串,则不需要 while 循环,只需将 reader.readLine() 值存储在单个字符串变量中即可。

      此外,您可能应该对这些异常做点什么,而不是仅仅吞下它们。

      【讨论】:

        【解决方案4】:

        我知道这已经很老了,但仍然......

        在此处阅读文章: http://www.javaworld.com/article/2071275/core-java/when-runtime-exec---won-t.html
        我的理解是你应该首先阅读你执行的命令的输出和错误流,然后waitFor你的进程的返回值。

        【讨论】:

          【解决方案5】:

          我知道这个问题很老了,但我只是想添加一些可能对某些人有用的信息。

          如果您只想从 java 代码中运行 uname 命令,最好使用 System 类来获取有关系统的信息。

          它不仅可以消除运行终端命令的依赖,而且可以独立于操作系统运行。

          系统类可以给你以下信息

          键:值

          --> os.version : 操作系统版本
          --> os.name : 操作系统名称

          --> os.arch : 操作系统架构

          --> java.compiler : 你正在使用的编译器的名称

          --> java.ext.dirs : 扩展目录路径

          --> java.library.path : 加载时搜索库的路径

          --> user.dir : 用户当前工作目录

          --> user.name : 用户账户名

          --> java.vm.version : JVM 实现版本

          --> java.vm.name : JVM 实现名称

          --> java.home : Java 安装目录

          --> java.runtime.version : JVM 版本

          (来源 - https://www.geeksforgeeks.org/getproperty-and-getproperties-methods-of-system-class-in-java/

          ex : 如果我运行的是基于 Linux 的系统,比如 Ubuntu,以下命令将为我提供有关它的信息。

          System.getProperty("os.name");
          

          【讨论】:

            猜你喜欢
            • 2017-01-30
            • 2011-10-07
            • 1970-01-01
            • 1970-01-01
            • 2013-10-21
            • 1970-01-01
            • 2012-04-17
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多