Java 代码执行本地命令

这篇具有很好参考价值的文章主要介绍了Java 代码执行本地命令。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

by emanjusaka from https://www.emanjusaka.top/2024/03/java-exec-local-command 彼岸花开可奈何
本文欢迎分享与聚合,全文转载请留下原文地址。

我们可以在命令行中执行各种命令,比如,创建文件、查看文件夹下文件、调用第三方工具等等。

如果想在 java 代码中执行命令应该怎么操作呢?我们有两种方式可以实现:

  • 通过Runtime.getRuntime().exec调用命令
  • 使用ProcessBuilder类来构建和执行命令

Runtime.getRuntime().exec

Runtime.getRuntime().exec()是Java中用于执行操作系统命令的方法。它允许你在Java程序中执行外部命令,并获取命令的输出和错误信息。

下面是使用Runtime.getRuntime().exec()执行一个简单命令的步骤:

  1. 创建一个Runtime对象,通过调用Runtime.getRuntime()方法获取。
  2. 调用exec()方法,传入要执行的命令和参数。
  3. exec()方法返回一个Process对象,表示正在执行的进程。
  4. 使用Process对象的方法来获取输出、错误流和返回值。
    /**
     * 执行本地命令
     * 不支持管道和重定向机制
     *
     * @param command 命令
     */

    public static void executeLocalCommand(String command) {
        try {
            // 执行命令
            Process process = Runtime.getRuntime().exec(command);

            try (BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
                 BufferedReader errorReader = new BufferedReader(new InputStreamReader(process.getErrorStream()))) {

                String line;
                while ((line = reader.readLine()) != null) {
                    log.info(command + ",命令执行结果:", line);
                }

                while ((line = errorReader.readLine()) != null) {
                    // 输出标准错误(stderr),标记为错误信息
                    if (line.startsWith("[ERROR]")) {
                        log.error(command + ",命令执行错误:", line);
                    } else {
                        log.warn(command + ",[WARNING]" + line);
                    }
                }

                // 等待命令执行完成
                int exitCode = process.waitFor();
                if (exitCode != 0) {
                    throw new ServiceException("执行命令失败!");
                }
            }
        } catch (IOException | InterruptedException e) {
            Thread.currentThread().interrupt(); // 如果是InterruptedException,则重新设置中断状态
            throw new RuntimeException(e);
        }
        log.info(command + ",命令执行成功");
    }

注意:该方法不支持shell的管道符和重定向机制。它只能分步执行命令,每个命令都是独立的进程。

在进程执行完成后,你应该调用Process对象的waitFor()方法来等待进程结束,并获取进程的返回值。这样可以确保进程正常结束,并且你可以根据返回值进行进一步处理。

如果需要使用管道符和重定向机制,可以考虑使用ProcessBuilder类来构建和执行命令。

ProcessBuilder

ProcessBuilder是Java中用于创建和控制操作系统进程的类。它比Runtime.exec()更加强大,因为它可以处理命令行参数、错误流和输入流,并支持管道和重定向。

下面是使用ProcessBuilder执行一个简单命令的步骤:

  1. 创建一个ProcessBuilder对象,并传入要执行的命令和参数。
  2. 调用start()方法启动进程。
  3. 使用Process对象的方法来获取输出、错误流和返回值。

下面是一个调用的示例:

package top.emanjusaka;

import org.springframework.boot.autoconfigure.SpringBootApplication;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        String[] command = {
                "ls",
                "-l"
        };
        // 创建ProcessBuilder对象,并传入要执行的命令和参数
        ProcessBuilder processBuilder = new ProcessBuilder(command);

        // 启动进程
        Process process = null;
        try {
            process = processBuilder.start();
            // 获取输出流
            try (
                    BufferedReader outputReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
                    BufferedReader errorReader = new BufferedReader(new InputStreamReader(process.getErrorStream()));) {
                String line;
                while ((line = outputReader.readLine()) != null) {
                    System.out.println(line);
                }
                while ((line = errorReader.readLine()) != null) {
                    // 输出标准错误(stderr),标记为错误信息
                    if (line.startsWith("[ERROR]")) {
                        System.out.println(command + ",命令执行错误:" + line);
                    } else {
                        System.out.println(command + ",[WARNING]" + line);
                    }
                }
                // 等待进程执行完成,并获取返回值
                int exitCode = process.waitFor();
                System.out.println("Exit code: " + exitCode);
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        } catch (InterruptedException | IOException e) {
            throw new RuntimeException(e);
        }
    }
}

执行结果:

上述代码将执行ls -l命令,并将输出打印到控制台。你可以根据需要修改命令和参数来执行其他命令或传递不同的参数。

请注意,使用ProcessBuilder时需要注意以下几点:

  • ProcessBuilder可以处理命令行参数,因此你可以通过将参数作为字符串数组传递给ProcessBuilder的构造函数来传递多个参数。
  • 你可以使用redirectErrorStream(true)方法将错误流合并到输出流中,这样你就可以同时读取标准输出和错误输出。
  • 在进程执行完成后,你应该调用Process对象的waitFor()方法来等待进程结束,并获取进程的返回值。这样可以确保进程正常结束,并且你可以根据返回值进行进一步处理。

本文原创,才疏学浅,如有纰漏,欢迎指正。如果本文对您有所帮助,欢迎点赞,并期待您的反馈交流,共同成长。
原文地址: https://www.emanjusaka.top/2024/03/java-exec-local-command
微信公众号:emanjusaka的编程栈文章来源地址https://www.toymoban.com/news/detail-841219.html

到了这里,关于Java 代码执行本地命令的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 原神获取抽卡链接 powershell执行命令的命令( iex(irm ‘https://img.lelaer.com/gf.ps1‘) )有问题吗?

    PowerShell是一种由Microsoft开发的跨平台的命令行界面和脚本语言。它最初是为Windows操作系统设计的,但现在已经支持Linux和macOS等其他操作系统。PowerShell可以执行各种任务,包括文件和文件夹管理、系统配置和管理、网络管理、安全和身份验证等。它使用.NET框架和命令行Shel

    2024年02月06日
    浏览(46)
  • python,如何设置定时执行python代码-windows本地

    最近写了一个python小程序,希望能每天定时执行,但是又不想用jenkins这样的工具,后来发现windows本地就可以设置,而且很好用,具体步骤如下: 首先,需确保本地python代码已编写好,环境变量已配置好,能运行成功; 1)依次进入:控制面板-大图标-管理工具-任务计划程序

    2024年02月10日
    浏览(41)
  • PHP常见的命令执行函数与代码执行函数

    目录 代码执行函数: 1. eval() GET和POST传参的区别  2. assert() 3. call_user_func() 4. create_function() 5. array_map() 6. call_user_func_array() 7. array_filter() ​编辑 8. uasort()函数 9. preg_replace() 命令执行函数: 1. system() 2. passthru() 3. exec() 4. pcntl_exec() 5. shell_exec() 6. popen()/proc_open() 7. 反引号

    2024年02月08日
    浏览(46)
  • RCE代码及命令执行(详解)

      RCE漏洞,可以让攻击者直接向后台服务器远程注入操作系统命令或者代码,从而控制后台系统。   1)调用第三方组件存在的代码执行漏洞。   2)用户输入的内容作为系统命令的参数拼接到命令中。   3)对用户的输入过滤不严格。   4)可控变量或漏洞函数。   像

    2024年02月11日
    浏览(59)
  • RCE代码及命令执行漏洞全解(30)

     web应用中,有时候程序员为了考虑灵活性,简洁性,会在代码中调用代码或执行命令执行函数去处理。 比如当应用在调用一些能将字符串转化成代码的函数时,没有考虑用户是否能够控制这些字符串,将代码执行漏洞,同样调用系统命令处理,将造成命令执行漏洞。  危害

    2024年02月07日
    浏览(43)
  • Java程序执行Linux命令

    今天这篇文章我们来用Java程序执行Linux命令。 执行一条命令: 执行服务器中 /home/admin 路径下的test.py文件 可以自己写一个py文件 生成一份txt或excel等 看通过java是否执行了py文件。 https://editor.csdn.net/md/?articleId=128816307 执行多条命令: 下面这段代码是做了三条linux命令 1、 复制

    2024年02月15日
    浏览(42)
  • java中的命令执行汇总

    命令执行漏洞只关注 第一个 String参数  或者 String[]或列表的第一个元素 如果该参数完全可控,或者是/bin/bash(Linux)或cmd(Windows)等运行shell解析器的命令、后面的部分可控,则可以注入。 如果的哥参数是bat或者sh脚本文件,后面的参数可控,则需要根据脚本如何使用可控参数来

    2023年04月10日
    浏览(29)
  • python代码调出cmd命令行窗口并在cmd窗口中执行指定的命令

    有时候,我们需要在python代码中打开 cmd命令行窗口,并在新打开的命令行cmd窗口中执行特定的命令, 其实,这个操作很容易,不过在网上找了一圈,都是没有说明白, 这里总结发布一下, 导入 os 模块 import os os.system( \\\' start cmd.exe /K C:\\\\Users\\\\admin\\\\AppData\\\\Roaming\\\\360se6\\\\Applicati

    2024年02月11日
    浏览(55)
  • 在Java中执行docker命令

    在Java中执行docker命令可以使用Java的Runtime类或ProcessBuilder类。下面是使用Runtime类执行docker命令的示例代码: 上述代码中,使用Runtime类的exec()方法执行docker ps命令,并通过BufferedReader读取命令执行结果。 另外,使用ProcessBuilder类也可以执行docker命令,示例代码如下:   上述代

    2024年02月09日
    浏览(28)
  • 【Python】在代码中执行终端命令并获取输出和运行状态

      在Python编程过程中,我们可能会遇到需要在终端命令行执行某个命令并获取其输出的操作,我们首先想到可能就是C语言中的 system(\\\"pause\\\"); 语句,确实,python当中也有类似的命令,同时,为了满足进一步的需求,比如判断指令是否执行完毕或者是得到执行输出的内容。  

    2024年02月05日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包