[英]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中很容易。 只是:
这是一个快速的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.