繁体   English   中英

在c ++或java中以响应模式使用cmd

[英]using cmd with in responsive mode in c++ or java

我在我的c ++应用程序中使用OpenSSL,问题是如果我使用exec("Open ssl command")然后它将执行该特定命令,但实际上这个命令是repsonsive,我的意思是它进一步问你"Are you sure you want to do this Y/N?" 我不知道如何迎合这种情况。如何使用java或C ++运行响应的命令行,任何帮助将不胜感激。 谢谢

在Java中很容易。 只是:

  1. 获取流程句柄。
  2. 读取进程'输入流以获取写入stdout的提示。
  3. 通过写入Process的输出流来响应提示。

这是一个快速的Groovy示例,因为它比Java更容易:

def cmd = ... // the command you want to run
def process = cmd.execute()
def processStdout = new Scanner(process.inputStream)
def processStdin = process.outputStream
def outputLine = processStdout.nextLine()
if (outputLine == 'some prompt written to stdout') {
    processStdin << 'your response\n'
}

如果您不能关注Groovy,我可以将它扩展为Java。

请注意,此示例不处理潜在的重要任务,即确保嵌套进程的stdout和stderr被完全消耗以防止阻塞,也不处理确保进程干净地退出。

更新:这是Java中的相同内容:

import java.io.OutputStream;
import java.util.Scanner;

public class SubprocessIO {
    public static void main(String[] args) throws Exception {
        String[] cmd = { ... your command as a series of strings ... };
        Process process = Runtime.getRuntime().exec(cmd);
        Scanner processStdout = new Scanner(process.getInputStream());
        OutputStream processStdin = process.getOutputStream();
        String outputLine = processStdout.nextLine();
        if (outputLine.equals("some prompt written to stdout")) {
            processStdin.write("your response\n".getBytes());
            processStdin.flush();
        }
    }
}

我忘了在第一轮中记录响应中的\\n至关重要,假设应用程序希望您输入内容然后按Enter键。 此外,您最好使用line.separator系统属性

基本上,您只需要确保在命令行上输入所有必需的信息,并使用-batch来避免进一步的问题,例如:

openssl ca -days 3650 -out client.crt -in client.csr -config \path\to\configs -batch -passin pass:PASSWORD -key password

如果这对任何特定的openssl命令都不起作用,请在您的问题中指定它需要执行哪个命令。

对于openssl来说,Wimmel的答案是正确的方法。 根据您的确切用例,您可能希望准备或构造包含重复参数的配置文件,并在命令行上指定变化的参数(以及指向配置文件的指针)。 -batch选项至少可以使用用于管理证书的公共openssl命令来确保不会发生交互 - 如果指定的参数不足,命令将失败。

要运行命令并评估其结果,您仍需要相应的功能。 在Java中,您使用ProcessBuilder和Process类。 在C ++中没有标准的方法来执行此操作(system()函数对于大多数用途来说太有限了),因此您需要使用特定于平台的C函数(例如CreateProcess,posix_spawn或fork / exec)或查找合适的C ++库。

但是为了以编程方式直接回答交互式问题,这些接口可能是不够的。 交互式对话可能非常复杂。 通常,这并不像将所有输入和输出视为简单字符流那样简单。 细节取决于平台和程序,但您可能需要类似期望(请参阅http://en.wikipedia.org/wiki/Expect )来处理此问题。

更新:当然,为所有这些调用外部CLI的方法不一定是最好的,并引入了一整套新的无关的副问题。 您可能最好使用合适的加密API(例如BouncyCastle http://www.bouncycastle.org/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM