2012-03-27 70 views
0

我想知道如何在Windows命令提示符(CMD)中以编程方式执行命令(如“dir C:\”或“shutdown -r”等)并检索结果输出,而不显示黑色CMD窗口课程。如何以编程方式模拟与控制台的交互?

我怀疑->this link<-包含所需的API列表,但我不确定哪些可以选择,所以需要您的帮助。我想编写一个简单的客户端 - 服务器应用程序(WinSock),用户可以坐在客户端并在服务器的命令提示符中执行命令(并从中读取答复)。是的 - 就像Telnet一样,但没有Telnet,只是Win32 API。

假设用户想要在服务器上执行“dir”命令。他在客户端应用程序上键入“dir”,该应用程序向服务器应用程序发送请求,在该应用程序中将执行该命令(就像在服务器的命令提示符中物理键入的一样),并将输出文本发送回客户端应用程序。

回答

0

虽然这个回答是不是一个很好的便携软件,它的工作原理正是你需要的方式,如果你是确保一切正常:

int system(const char *command); 

此功能(在Windows CMD)执行command壳如果可供使用的话。通过“如果一切正常”我的意思是你的操作系统中有一个shell,它可以为你提供。一般来说,这应该适用于Windows。

如果您使用NULL调用它,如果shell可用,它将会非零。如果你给出了一个实际的命令,它会返回-1表示一个错误(例如不能产生一个进程),或者返回应该依赖OS的命令的状态。也许你最关心的是“如果命令失败”,你应该检查返回值为0(0为好)。

请注意,要获取命令的输出,并且需要将输出保存在某处。例如执行dir命令是这样的:

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

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

+0

不,那不会帮助他。他也想要输出。 – 2012-03-27 16:21:19

+0

@MikeKwan,就像我说的,他可以将输出重定向到一个文件然后检索它。 – Shahbaz 2012-03-27 16:32:48

+0

@Shahbaz,自古以来我就使用'system()',但直接读取输出的能力一直让我恼火。重定向到文件并不是真正优雅的解决方案,但如果没有更好的选择,无论如何都很好。但我仍在寻找更好的解决方案。 – 2012-03-27 17:18:51

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的壳)是极其危险的,因为没有任何类型的认证:可以连接到端口5555和机器上执行命令,有些东西你真不除非你处于一个非常受控制的环境中,否则不会允许。

+0

感谢您的回答,但Netcat不是Windows的一部分(虽然有Windows的第三方端口),即使它是,我需要以编程方式执行此操作(它必须是较大的客户端服务器程序的一部分)。尽管如此,对于手动测试,netcat似乎是非常棒的工具。 – 2012-03-27 17:02:35

+0

@TX_:然后抓住源代码。有OpenBSD和其他免费的实现。 – MSalters 2012-03-27 18:11:26

+0

@ MSalters,你不能只获取授权代码。如果他的程序没有兼容许可证,那是不可能的。 – Shahbaz 2012-03-27 21:07:57