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

using cmd with in responsive mode in c++ or java

本文关键字:模式 cmd 响应 c++ java      更新时间:2023-10-16

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

在Java中足够简单。只是:

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

这里有一个快速的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 responsen'
}

如果您不能遵循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 responsen".getBytes());
processStdin.flush();
}
}
}

我忘了在第一轮测试中记下响应中的n是至关重要的,假设应用程序希望你输入一些内容,然后按enter键。此外,您可能最好使用line.separator系统属性

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

openssl ca -days 3650 -out client.crt -in client.csr -config pathtoconfigs -batch -passin pass:PASSWORD -key password

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

对于openssl,Wimmel的答案是正确的方法。根据您的具体用例,您可能需要准备或构建一个包含重复参数的配置文件,并在命令行上指定不同的参数(以及指向配置文件的指针)。batch选项(至少在用于管理证书的通用openssl命令中可用)将确保不会发生交互——如果指定的参数不足,则命令将失败。

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

但是,对于以编程方式直接回答交互式问题,这些界面可能是不够的。交互式对话可能相当复杂。通常,这并不像将所有输入和输出视为简单的字符流那么简单。详细信息取决于平台和程序,但您可能需要类似预期的内容(请参阅http://en.wikipedia.org/wiki/Expect)处理这个问题。

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