在c++或java中以响应模式使用cmd
using cmd with in responsive mode in c++ or java
我在c++应用程序中使用OpenSSL,问题是如果我使用exec("Open ssl command")
然后它会执行那个特定的命令,但实际上这个命令是重复的,我的意思是它会进一步询问"Are you sure you want to do this Y/N?"
我不知道如何应对这种情况。我如何使用java或C++来运行一个响应良好的命令行,如有任何帮助,将不胜感激。感谢
在Java中足够简单。只是:
- 获取进程句柄
- 读取进程的输入流以获取写入stdout的提示
- 通过写入进程的输出流来响应提示
这里有一个快速的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/)
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 如何使用ndk-build.cmd构建Android.so文件
- 为什么在保护模式下继承升级不起作用
- 如何在全屏模式下(在OpenGL中)使背景透明
- 为什么使用__LINE_的代码在发布模式下在MSVC下编译,而不是在调试模式下
- 派生类是否可以在抽象工厂设计模式中具有数据成员
- 此模式的C++RegEx
- avrogencpp能为模式中的每种类型生成单独的头文件吗
- 使用可变模板的Broadcaster/Listener模式
- c++方法参数只能在linux的发布模式下自行更改
- 资源管理设计模式
- 使用 mod_gsoap 部署服务时,如何在 Gsoap 中更改 soap 上下文的模式?
- C++ 无法在字符数组中使用 for 循环打印字母模式
- 小字符串优化(调试与发布模式)
- 可视化C++:发布模式的运行时库作为'Multi-threaded Debug DLL'
- 如何设计具有不同类型的通知和观察器的观察者模式?
- 在C++的一系列数字中查找重复模式
- 是否允许使用带有"w+"模式的 freopen 进行标准设置?
- C++ 使用存储在动态数组中的文本文件中的数据查找模式
- 在c++或java中以响应模式使用cmd