如何以编程方式模拟与控制台的交互?
我想知道如何在Windows命令提示符(CMD)中以编程方式执行命令(如“dir C:\”或“shutdown -r”等)并检索结果输出,而不显示黑色CMD窗口课程。如何以编程方式模拟与控制台的交互?
我怀疑->this link<-包含所需的API列表,但我不确定哪些可以选择,所以需要您的帮助。我想编写一个简单的客户端 - 服务器应用程序(WinSock),用户可以坐在客户端并在服务器的命令提示符中执行命令(并从中读取答复)。是的 - 就像Telnet一样,但没有Telnet,只是Win32 API。
假设用户想要在服务器上执行“dir”命令。他在客户端应用程序上键入“dir”,该应用程序向服务器应用程序发送请求,在该应用程序中将执行该命令(就像在服务器的命令提示符中物理键入的一样),并将输出文本发送回客户端应用程序。
虽然这个回答是不是一个很好的便携软件,它的工作原理正是你需要的方式,如果你是确保一切正常:
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
检索其输出。
你基本上试图重新实现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和机器上执行命令,有些东西你真不除非你处于一个非常受控制的环境中,否则不会允许。
不,那不会帮助他。他也想要输出。 – 2012-03-27 16:21:19
@MikeKwan,就像我说的,他可以将输出重定向到一个文件然后检索它。 – Shahbaz 2012-03-27 16:32:48
@Shahbaz,自古以来我就使用'system()',但直接读取输出的能力一直让我恼火。重定向到文件并不是真正优雅的解决方案,但如果没有更好的选择,无论如何都很好。但我仍在寻找更好的解决方案。 – 2012-03-27 17:18:51