抓取程序的控制台输出

我正在为一家公司创build一个networkingpipe理程序,我正在做一些合同工作(与我无关)

作为该计划的一部分,我想有一个控制台/ telnet(types)克隆。 我有一个工作目录系统,我可以从根本上读取目录中的所有文件,并更改目录。 我也有一个简单的FTP协议设置。 不过,我想以编程方式随意使用标准input/输出程序对不同的程序进行说话。 我不反对DLL注入技术和其他方法,因为这是一个良性的程序。 如果可能的话,如果我可以直接轻松地使用控制台,那将是非常棒的。 (系统()可能会工作,但是这不允许继续通信或回读输出)

我想到目前为止抓住PATH环境variables,并利用它的标准命令(IPCONFIG,NETSTAT等)我的networking库使通信容易,但我不知道如何与程序的控制台接口…

TL; DR:

程序之间是否有预定义的标准控制台通信方式?

正如杰里所说,你要找的是一个管道( CreatePipe )。 其中两个实际上是一个输入和一个输出。 然后在STARTUPINFO中将它们设置为stdin / stdout / stderr,并将其传递给CreateProcess 。 然后可以使用WriteFile , ReadFile , PeekNamedPipe和朋友进行通信。

MSDN上提供了一个完整的示例:

http://msdn.microsoft.com/en-us/library/ms682499(v=vs.85).aspx

并且确保你不会陷入这些常见的陷阱(幸好Raymond Chen刚刚碰巧记录):

PS,这在Python和子进程模块中非常容易。

最简单的方法通常是用_popen产生子程序。 这会给你一个写入孩子标准输入的句柄,或者从孩子的标准输出中读取。

如果你们需要这样做,事情就会变得更加丑陋。 您通常必须自己创建匿名管道,并在对CreateProcess的调用中指定它们,坦率地说,这是一个痛苦。

好吧,我已经在最近的一段时间里了解到了这一点。 以下是一些人可能会觉得有用的信息=]

代码创建进程管道/文件描述符作为标准输出/出/ err:

  STARTUPINFO startInfo; PROCESS_INFORMATION procInfo; memset((void*) &startInfo, 0, sizeof (startInfo)); memset((void*) &procInfo, 0, sizeof (procInfo)); startInfo.cb = sizeof (startInfo); startInfo.dwFlags = (STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW); startInfo.wShowWindow = SW_HIDE; //No Console Window, Thanks. startInfo.hStdInput = (HANDLE)inHandle; startInfo.hStdOutput = (HANDLE)outHandle; startInfo.hStdError = (HANDLE)errHandle; char* pe = "cmd\0"; //This is the program to execute (eg: c:\\Windows\\System32\\cmd.exe) CreateProcess(NULL,pe,NULL,NULL,TRUE,0,NULL,NULL,&startInfo,&procInfo); return procInfo.hProcess; 

现在这一切都很好,但是还有一点点信息可以帮助我。 你可以为你的句柄使用文件描述符(in / out / err),所以你可以直接使用套接字,而不需要修改,你可以直接访问进程的输入和输出。

所以我现在创建隐藏控制台的方法是在本地连接两个套接字,然后使用其中一个套接字作为调用cmd的子程序的stdInput && stdOutput && stdError描述符。 这很快,很容易。

如果你不知道如何连接一些插座,只要看看beej的指导