Java执行cmd或者shell命令,并获取结果

文章介绍了一个Java类CommandExecutorUtils,用于在Windows和Linux系统中执行命令,确保命令输出在不同操作系统下的编码一致性,避免乱码问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

已经做了处理,兼容windows和linux系统和编码,不会乱码。 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;

public class CommandExecutorUtils {

    public static String executeCommand(String command) {
        Charset charset = System.getProperty("os.name").toLowerCase().contains("win") ? Charset.forName("GBK") : Charset.defaultCharset();
        String os = System.getProperty("os.name").toLowerCase();
        List<String> commands = new ArrayList<>();

        // 判断操作系统类型,并准备命令
        if (os.contains("win")) {
            // Windows
            commands.add("cmd");
            commands.add("/c");
        } else {
            // Unix/Linux/MacOS
            commands.add("/bin/sh");
            commands.add("-c");
        }

        commands.add(command);

        // 执行命令并获取结果
        try {
            ProcessBuilder processBuilder = new ProcessBuilder(commands);
            Process process = processBuilder.start();

            // 获取输出
            String output = readStream(process.getInputStream(), charset);
            // 等待进程结束
            int exitCode = process.waitFor();
            if (exitCode == 0) {
                return output;
            } else {
                String error = readStream(process.getErrorStream(), charset);
                throw new IOException("Command execution failed with exit code " + exitCode + " and error: " + error);
            }
        } catch (IOException | InterruptedException e) {
            Thread.currentThread().interrupt();
            return "Error: " + e.getMessage();
        }
    }

    private static String readStream(InputStream inputStream, Charset charset) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, charset));
        StringBuilder builder = new StringBuilder();
        String line;
        while ((line = reader.readLine()) != null) {
            builder.append(line);
            builder.append(System.getProperty("line.separator"));
        }
        return builder.toString();
    }

    public static void main(String[] args) {
        // 示例命令
        String command = "ping www.a.shifen.com";
        // 在Windows上使用GBK编码读取输出,在Linux上使用系统默认编码
        String result = CommandExecutorUtils.executeCommand(command);
        System.out.println(result);
    }
}

### Java执行远程Shell命令的示例教程 在Java中可以通过JSch库实现SSH协议下的远程Shell命令执行。以下是详细的说明以及代码示例。 #### 使用JSch库 JSch是一个用于支持SSH协议的Java库,能够帮助开发者轻松地建立SSH连接执行远程操作[^1]。为了使用该库,首先需要将其加入项目的依赖项中。如果是Maven项目,则可以在`pom.xml`文件中添加如下依赖: ```xml <dependency> <groupId>com.jcraft</groupId> <artifactId>jsch</artifactId> <version>0.1.55</version> </dependency> ``` #### 实现远程Shell命令执行的核心逻辑 下面展示了一个完整的例子,演示如何通过Java中的JSch库执行远程Shell命令捕获其返回值。 ```java import com.jcraft.jsch.*; public class RemoteShellExecutor { private static final int PORT = 22; public static void main(String[] args) { try { String host = "your.remote.server.ip"; String user = "username"; String password = "password"; String command = "ls -l"; JSch jsch = new JSch(); Session session = jsch.getSession(user, host, PORT); session.setPassword(password); // Avoid asking for key confirmation java.util.Properties config = new java.util.Properties(); config.put("StrictHostKeyChecking", "no"); session.setConfig(config); System.out.println("Establishing connection..."); session.connect(); Channel channel = session.openChannel("exec"); ((ChannelExec) channel).setCommand(command); // 获取输入流以便读取命令输出 InputStream in = channel.getInputStream(); channel.connect(); byte[] tmp = new byte[1024]; while (true) { while (in.available() > 0) { int i = in.read(tmp, 0, 1024); if (i < 0) break; System.out.print(new String(tmp, 0, i)); } if (channel.isClosed()) { System.out.println("Exit status: " + channel.getExitStatus()); break; } Thread.sleep(1000); } channel.disconnect(); session.disconnect(); } catch (Exception e) { e.printStackTrace(); } } } ``` 上述代码展示了如何创建一个Session对象通过它打开一个执行通道(Channel),设置待执行命令后启动通道,最终断开连接[^2]。 #### 处理多个Shell命令 当有多个Shell命令需要被执行时,可以根据实际需求选择不同的分隔方式。例如,使用`;`可以让所有命令按顺序依次运行而不考虑前一条命令结果;而使用`&&`则只有当前面所有的命令均成功完成后才继续下一条命令[^3][^4]。 #### 获取远程Shell命令的返回值 除了简单的打印输出外,有时还需要处理更复杂的场景——比如根据特定条件筛选某些进程的信息或者解析日志数据等。这时可以编写专门的方法来接收这些信息将它们转化为易于管理的形式,如列表或映射表结构[^5]。 ```java public static List<String> executeRemoteCommandsAndGetResults(String... commands) throws Exception { List<String> results = new ArrayList<>(); for (String cmd : commands){ StringBuilder outputBuffer = new StringBuilder(); JSch jsch = new JSch(); Session session = jsch.getSession("user", "host", 22); session.setPassword("pass"); Properties config = new Properties(); config.put("StrictHostKeyChecking", "no"); session.setConfig(config); session.connect(); Channel channel=session.openChannel("exec"); ((ChannelExec)channel).setCommand(cmd); InputStream in=channel.getInputStream(); channel.connect(); BufferedReader reader=new BufferedReader(new InputStreamReader(in)); String line; while((line=reader.readLine())!=null){ outputBuffer.append(line).append("\n"); } channel.disconnect(); session.disconnect(); results.add(outputBuffer.toString().trim()); } return results; } ``` 此方法接受一系列字符串形式的命令作为参数,逐一发送给目标主机上的shell解释器去执行,最后收集各次调用所产生的标准输出内容存入List集合里供后续分析之用。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值