ProcessBuilder脚本运行

文章介绍了Java中的ProcessBuilder类,如何使用它构建并启动操作系统进程,管理命令、参数、工作目录、环境变量,以及重定向输入输出流。特别提到其在执行shell脚本和调用外部工具时的便利性。
摘要由CSDN通过智能技术生成

ProcessBuilder脚本运行
ProcessBuilder是一个Java类,它用于构建和启动操作系统进程。它提供了一组方法来指定要执行的命令、参数、工作目录、环境变量等信息,然后使用start()方法启动进程。
ProcessBuilder可以方便地将命令、参数和工作目录组合成一个进程,并且可以设置环境变量和输入输出流。它还提供了一些方便的方法来捕获进程的输出和错误输出,以及等待进程完成。
ProcessBuilder常用于需要执行外部命令或程序的应用程序中,例如需要运行shell脚本、调用外部工具或其他应用程序等。使用ProcessBuilder可以更加方便地管理和控制这些外部进程。
ProcessBuilder 类提供了一种创建和管理进程的方法。它允许您指定命令行参数、工作目录、环境变量等。
以下是 ProcessBuilder 的一些常用参数:

  1. command:命令及其参数的数组,例如 new String[]{“ls”, “-l”}。
  2. directory:进程的工作目录,例如new File(“/home/user”)。 environment:进程的环境变量,例如 new HashMap<String,
    String>()。
  3. redirectErrorStream:是否将标准错误流重定向到标准输出流,例如 true。
  4. redirectInput:是否将标准输入流重定向到一个文件,例如 new FileInputStream(“/dev/null”)。
  5. redirectOutput:是否将标准输出流重定向到一个文件,例如 new FileOutputStream(“/tmp/output.txt”)。
    您可以使用这些参数来创建和管理进程。例如,以下代码将在当前工作目录下运行 ls -l 命令,并将输出重定向到一个文件:
ProcessBuilder pb = new ProcessBuilder(
pb.directory(new File("."));
pb.redirectOutput(new FileOutputStream("/tmp/output.txt"));
Process p = pb.start();

这将在当前工作目录下运行 ls -l 命令,并将输出重定向到 /tmp/output.txt 文件。

package com.cmb.ts01.scan;
import com.google.common.collect.Lists;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.apache.tomcat.util.http.fileupload.FileUtils;
import org.springframework.util.CollectionUtils;
import java.io.*;
import java.text.MessageFormat;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
 * @author
 * @date 2024/1/25 9:49
 */
public class ScanUtil {
    private final static String CACHE_FILE = "cache\\cacheTemp.tmp";
    private final static String CACHE_FILE_PATH = "cache\\";
    @Data
    @NoArgsConstructor
    static class ScanParam {
        private List<String> keyList;
        private String appPath;
        private String jarPath;
        private boolean rescanSwitch = true;
        private boolean cleanSwitch = true;
    }

    public static void main(String[] args) {
        List<String> keyList = Lists.newArrayList("iText", "jpmml", "Neo4j", "nextcloud", "ownCloud", "JDbC", "jmx",
                "pdfHTML", "plupload", "PM2", "Tailormap", "voltdb");
        ScanParam scanParam = new ScanParam();
        scanParam.setKeyList(keyList);
        scanParam.setAppPath("AppPath");
        scanParam.setJarPath("JarPath");
        ScanParam scanParam2 = new ScanParam();
      
        for (Map.Entry<String, Set<String>> entry : resultMap.entrySet()) {
            System.out.println(MessageFormat.format("应用:{0}命中:", entry.getKey()));
            System.out.println(entry.getValue());
        }
    }
    private static Map<String, Set<String>> executor(List<ScanParam> scanParams) {
        Map<String, Set<String>> resultMap = new HashMap<>();
        for (ScanParam scanParam : scanParams) {
            try {
                Set<String> singleResult = executorSingle(scanParam);
                if (!CollectionUtils.isEmpty(singleResult)) {
                    resultMap.put(scanParam.getAppPath(), singleResult);
                }
            } catch (Exception e) {
                System.out.println(e);
            }
        }
        return resultMap;
    }

    private static Set<String> executorSingle(ScanParam scanParam) {
        System.out.println(MessageFormat.format("----------{0}----------", scanParam.appPath));
        Set<String> matchSet = new HashSet<>();
        // 1、获取扫描关键词
        List<String> scanKeyList = scanParam.getKeyList();
        // 2、确定是否重新扫描生成jar包list
        // 3、执行CMD命令
        boolean jarReady = copyDependency(scanParam);// 4、根据关键词匹配jar
            commend.add("cmd.exe");
            commend.add("/c");
//            commend.add("cd");
//            commend.add("/d");
//            commend.add(APP_LOCAL_DIRECTORY);
//            commend.add("&&");
//            commend.add("dir");
//            commend.add("&&");
            commend.add("mvn");
            commend.add("dependency:copy-dependencies");
            StringBuilder directory = new StringBuilder("-DoutputDirectory=");
            directory.append(scanParam.getJarPath());
            commend.add(directory.toString());
            ProcessBuilder builder = new ProcessBuilder();
            builder.command(commend);
            builder.redirectErrorStream(true);
            builder.redirectOutput(tempFile);
            builder.directory(new File(scanParam.getAppPath()));
            Process process = builder.start();
            int i = process.waitFor();
            printCmdLog();
            if (i == 0) {
                return true;
            } else {
                return false;
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }
    private static File createCacheTempFile() throws IOException {
        File file = new File(CACHE_FILE_PATH);
        // 新建一个存储结果的缓存文件
        File tmpFile = new File(CACHE_FILE);
        if (!file.exists()) {
            file.mkdirs();
        }
        if (!tmpFile.exists()) {
            tmpFile.createNewFile();
        }
        return tmpFile;
    }
    private static void printCmdLog() {
        StringBuilder stringBuilder = new StringBuilder();
        String result;
        BufferedReader bufferedReader;
        try (InputStream inputStream = new FileInputStream(CACHE_FILE);) {
            bufferedReader = new BufferedReader(new InputStreamReader(inputStream, "GBK"));
            String line;
            while ((line = bufferedReader.readLine()) != null) {
                stringBuilder.append(line + "\n");
            }
            bufferedReader.close();
            result = stringBuilder.toString();
            System.out.println(result);
        } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}
可以使用JavaProcessBuilder类来远程调用shell脚本ProcessBuilder类允许您启动并控制外部进程。以下是一个示例代码,它使用ProcessBuilder类从远程服务器上运行shell脚本。 ``` import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class RemoteShellExecutor { public static void main(String[] args) throws IOException, InterruptedException { String host = "remote-host"; // 远程服务器IP地址或域名 String user = "remote-user"; // 远程服务器用户名 String password = "remote-password"; // 远程服务器密码 String command = "/path/to/remote/script.sh"; // 远程服务器上的shell脚本路径 // 创建ProcessBuilder对象 ProcessBuilder processBuilder = new ProcessBuilder(); // 设置远程SSH连接命令 processBuilder.command("sshpass", "-p", password, "ssh", user + "@" + host, command); // 启动进程 Process process = processBuilder.start(); // 读取进程输出 BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); String line; while ((line = reader.readLine()) != null) { System.out.println(line); } // 等待进程结束 int exitCode = process.waitFor(); System.out.println("Process exited with code " + exitCode); } } ``` 在上面的示例代码,我们使用ProcessBuilder类创建了一个SSH连接命令,并将其设置为要执行命令。然后,我们启动进程,并使用一个缓冲读取器来读取进程输出。最后,我们等待进程结束,并打印进程退出代码。请注意,您需要在本地计算机上安装sshpass软件包,以便使用密码连接到远程服务器。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值