java调用cmd程序,如何输入确认信息如y/n,或用户名密码?

谢小纯_ 发布于 2021/12/07 11:44
阅读 695
收藏 1

想在前端通过websocket实现操作一个控制台程序,中间回涉及到输入用户名密码或者确认的操作。
后端使用ProcessBuilder执行了cmd /c 命令,生成了Process。process的输出流可以向调用的程序写入指令,输入流可以获取控制台 输出的部分信息
开发过程中获取process的输入流,用BufferReader.readLine()可以获取大部分程序返回的内容,但不能返回输入确认的信息, 通过输出流可以向程序写入指令,但在程序返回了输入确认信息时,再写入指令是没有反应的

 

具体代码如下

package design.java操作命令行;

import java.io.*;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.regex.Pattern;

public class MvnReleasePackageRunner {

    private static Pattern releasePattern = Pattern.compile("Dependency(.*)is a snapshot ");

    static ExecutorService executorService = Executors.newFixedThreadPool(5);

    public static void main(String[] args) {

        ProcessBuilder processBuilder = new ProcessBuilder("cmd.exe","/k","mvn release:clean release:prepare -Dusername=xjz -Dpassword=as5798670 release:perform -Dusername=xiejizhe -Dpassword=as1234567");
        processBuilder.redirectErrorStream(true);
        Process process = null;
        AtomicBoolean isStart = new AtomicBoolean(false);

        try {
            processBuilder.directory(new File("C:\\Users\\admin\\Desktop\\feature-school"));

            process = processBuilder.start();

            InputStream resultStream = process.getInputStream();

            InputStream errorStream = process.getErrorStream();

            PrintWriter out = new PrintWriter(process.getOutputStream(), true);

            //处理
            new Thread(() -> {

                handle(resultStream, msg -> {
                    System.out.println("输出结果:" + msg);

                        if (msg.contains("There are still some remaining snapshot dependencies")) {
                            out.println();
                            out.flush();
                        } else if (msg.contains("Do you want to resolve them now?")) {
                            out.println("echo yes");
                            out.flush();
                        }
                    });
                }).start();

            Thread.sleep(300);

            new Thread(() -> {

                handle(errorStream, msg -> {
                    System.err.println("错误信息:" + msg);
                });

            }).start();

            Thread.sleep(5000);

            int exitCode = process.waitFor();

            System.err.println("exitCode is " + exitCode);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    public static String getStringFromStream(InputStream ins) throws IOException {
        byte[] resultBytes = new byte[ins.available()];
        ins.read(resultBytes);
        return new String(resultBytes);

    }


    public static void handle(InputStream ins, CallBackFunction callBcak) {

        BufferedReader bufferedReader = null;

        try {
            bufferedReader = new BufferedReader(new InputStreamReader(ins, "GBK"));
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        String line = null;
        try {
            while (true) {

                if ((line = bufferedReader.readLine()) != null) {
                    callBcak.handle(line);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

运行结果显示 根本没有从out 流中读取到yes!!!

加载中
0
谢小纯_
谢小纯_

自己已经解决

sprouting
sprouting
小伙子不讲武德,解决了要贴出你的解决方案撒
1
sprouting
sprouting

哥们,你的密码泄露出来了。。。。

你这个问题,我建议使用dos的管道命令来处理,命令是可以一次性搞完的,不需要中间再输入Y之类的东西

谢小纯_
谢小纯_
密码都是瞎写的 我用的就是管道命令 我要一次搞完 就不需要这么麻烦了 我要不断地交互 就像下围棋 我已经解决了 问题很坑 网上也没什么例子 自己猜测着解决的
0
我在山河在

还有这种操作呢,怎么解决的?

0
谢小纯_
谢小纯_

解决方案是 不使用 readline   逐行读取,而是有多少就读取多少!

OSCHINA
登录后可查看更多优质内容
返回顶部
顶部