如何以编程方式模拟与控制台的交互?

时间:2012-03-27 16:14:23

标签: c++ winapi visual-c++

我想知道如何以编程方式在Windows命令提示符(CMD)中执行命令(如“dir C:\”或“shutdown -r”等)并检索结果输出,而不显示黑色CMD窗口当然。

我怀疑->this link<-包含所需API的列表,但我不确定要选择哪些API,所以需要您的帮助。

基本上这就是我所需要的:我想编写简单的客户端 - 服务器应用程序(WinSock),用户可以坐在客户端上,并在服务器的命令提示符下执行命令(并从中读取回复)。是的 - 就像Telnet一样,但没有Telnet,只需要Win32 API。

假设用户想在服务器上执行“dir”命令。他在客户端应用程序上键入“dir”,它将请求发送到服务器应用程序,执行命令(就好像它是在服务器的命令提示符中物理输入的那样),输出文本将被发送回客户端应用程序。 / p>

2 个答案:

答案 0 :(得分:3)

您基本上是在尝试重新实现netcat的众多可能用途之一。通过在命令提示符下运行Windows系统:

nc -l -L -e cmd -p 5555

然后从另一个系统运行

nc 192.168.1.xxx 5555

192.168.1.xxx是Windows机器的IP地址,你可以完全按照你所说的做什么:你输入的任何内容都将在Windows机器上“输入”,你将从远程执行的命令中获得输出。您还可以在隐藏窗口中运行netcat。

请注意,由于此功能,某些防病毒程序阻止了netcat程序...恶意软件显然已将其用于将受害者的PC转换为奴隶机器人。

另请注意,将输入/输出直接路由到cmd(XP shell)非常危险,因为没有任何类型的身份验证:任何人都可以连接到端口5555并执行命令在机器上,除非你处于一个非常受控制的环境中,否则你真的不想让它。

答案 1 :(得分:0)

虽然这个答案对于便携式软件来说不是一个好的答案,但如果您确定一切正常,它的工作方式与您所需的完全一致:

int system(const char *command);

如果可用,此函数在shell(Windows中的CMD)中执行command

通过“如果一切正常”我的意思是你的操作系统中有一个shell,它可供你使用。通常,这应该适用于Windows。

如果用NULL调用它,如果shell可用,它将给出非零值。如果您提供实际命令,它将返回-1表示错误(例如,无法生成进程),或返回应该依赖于操作系统的命令的状态。也许你最关心的是“如果命令失败”,你应该通过检查返回值0(0是好的)来做好。

请注意,要获取命令的输出,您需要将输出保存在某处。例如,执行dir命令,如下所示:

error = system("dir > temp.txt 2>&1");

然后从temp.txt检索其输出。