如何使用Java执行系统命令(linux/bsd)
我试图廉价地用Java执行本地系统命令(如何使用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();
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复制粘贴,而不是重新评估其原始想法,则无法真正改变人们的行为,重大警告包括:(