Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Java执行系统命令(linux/bsd)_Java_Output Redirect - Fatal编程技术网

如何使用Java执行系统命令(linux/bsd)

如何使用Java执行系统命令(linux/bsd),java,output-redirect,Java,Output Redirect,我试图廉价地用Java执行本地系统命令(uname-a)。我希望从uname获取输出并将其存储在字符串中。这样做的最佳方式是什么?当前代码: public class lame { public static void main(String args[]) { try { Process p = Runtime.getRuntime().exec("uname -a"); p.waitFor();

我试图廉价地用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.");
    }
}

你的方式与我可能会做的并不遥远:

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

当然,不管你想处理哪种例外情况。

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


此外,您可能应该处理这些异常,而不是仅仅吞咽它们。

这是最好的方法。
您还可以使用具有可变参数构造函数的,这样您可以保存一行或两行代码

我知道这很旧,但仍然

在这里阅读文章:

我的理解是,您应该首先读取已执行命令的输出和错误流,然后等待进程的返回值。

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

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

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

System类可以为您提供以下信息

关键字:值

-->操作系统版本:操作系统版本
-->操作系统名称:操作系统名称

-->arch:os体系结构

-->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版本

(来源-)

如果我运行的是基于Linux的系统,比如Ubuntu,下面的命令会告诉我有关它的信息

System.getProperty("os.name");

这不是最好的方法,因为命令是使用shell执行的,因此,如果命令参数是从用户输入中获取的,那么它很容易受到OS命令注入的影响
ProcessBuilder
在这方面肯定更安全。“我正试图降低成本并执行本地系统命令(uname-a)…”-这是降低成本并执行本地系统命令的最佳方式。您所指的是让操作系统命令注入无法察觉的最佳方式;)你知道,这有点像向程序员询问悬崖下最快的路……:)我发现Java应用程序中的OS命令注入使用了StackOverflow启发的执行模式,所以我认为任何提到Runtime.exec()的东西都应该在这里得到一个大大的警告。你知道,我同意,这很像这样,但。。。如果人们只是从SO复制粘贴,而不是重新评估其原始想法,则无法真正改变人们的行为,重大警告包括:(