在Java中执行Linux命令主要可以通过Runtime类或者ProcessBuilder类来实现。以下分别是两者的方法示例。

通过Runtime类来运行命令:

java

java调用linux命令  第1张

public class LinuxCommandRunner {

public static void main(String args[]) throws Exception {

//定义你的命令字符串,可以是一个或多个参数,如果是两个及以上时以字符串数组形式传入

String command = "ls l"; //例如列出所有文件并详细显示的linux命令

java调用linux命令  第2张

Process child = Runtime.getRuntime().exec(command); //执行此进程中的本机外部命令

// 获取输入和错误输出流来处理返回的结果

new Thread(new ConsolePrinter(child.getInputStream())).start();

new Thread(new ConsolePrinter(child.getErrorStream())).start();

java调用linux命令  第3张

int returnVal = child.waitFor();

System.out.println("Return value is: " + returnVal);

if(returnVal != 0) {

java调用linux命令  第4张

throw new Exception("Command returned error: "+returnVal);

}

}

}

// 这里假设ConsolePrinter类已经存在,用来将流内容打印出来

class ConsolePrinter implements Runnable {

// 你自己的流处理逻辑,请实现run方法。

}

java调用linux命令  第5张

需要注意:对于一些Linux的命令可能会要求输入密码,这种时候上面的例子就不能很好的工作了,因为没有机制可以让程序去提供这个密码信息。

使用ProcessBuilder类(推荐):

相比于 `Runtime.getRuntime().exec()`, 使用 `ProcessBuilder` 更灵活,更容易理解和控制。下面的代码展示了基本用法:

java调用linux命令  第6张

java

import java.io.BufferedReader;

import java.io.InputStreamReader;

public class LinuxCommandsWithProcessBuilder {

public static void main(String[] args) throws Exception {

String linuxCommand="ls";

java调用linux命令  第4张

// 初始化ProcessBuilder,传入命令行

ProcessBuilder builder = new ProcessBuilder("/bin/bash", "c", linuxCommand);

//设置环境变量,如果有必要的话

// builder.environment().put("VARNAME", "VARIABLE");

java调用linux命令  第8张

//设置当前的工作目录

// builder.directory(new File("/path/to/work/dir"));

//开始构建

java调用linux命令  第9张

Process p = builder.start();

try (BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream(), "UTF8"));) {

System.out.printf("Command output is %s\n", br.readLine());

java调用linux命令  第10张

} catch(Exception err) {

err.printStackTrace();

}

}

}

这个例子也展示了如何从子进程接收数据流。你需要自己读这些输入和输出流,才能得到任何来自子进程的输出。同样,这里也有同样的输入要求的限制,如上所述,在需要交互式的用户输入(比如输入密码)的情况下,这可能不够。

请记得为可能引发安全问题的操作配置合适的安全权限。并且对于敏感信息(例如密码),应避免硬编码到你的程序里,最好采用环境变量或其他保密技术保护起来。