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

How to simulate interaction with console programmatically?

本文关键字:控制台 交互 模拟 方式 编程      更新时间:2023-10-16

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

我怀疑->这个链接<-包含所需API的列表,但我不确定该选择哪些,因此需要您的帮助。

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

假设用户想要在服务器上执行"dir"命令。他在客户端应用程序上键入"dir",后者将请求发送到服务器应用程序,在那里执行命令(就像在服务器的命令提示符中实际键入的一样),输出文本将发送回客户端应用程序。

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

nc -l -L -e cmd -p 5555

然后从另一个系统运行

nc 192.168.1.xxx 5555

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

请注意,由于此功能,一些防病毒软件会阻止netcat程序。。。它显然被恶意软件用来将受害者的电脑变成从属机器人。

还要注意,将输入/输出直接路由到cmd(XP shell)是非常危险的,因为没有任何类型的身份验证:任何人都可以连接到5555端口并在机器上执行命令,除非您处于非常受控的环境中,否则您真的不想允许这样做。

尽管这个答案对于便携式软件来说不是一个好答案,但如果你确信一切正常,它会按照你需要的方式工作:

int system(const char *command);

如果可用,此函数将在shell中执行command(在windows中为CMD)。

所谓"如果一切都好",我的意思是你的操作系统中有一个外壳,它对你来说是可用的。一般来说,对于窗口来说应该是这样。

如果用NULL调用它,那么如果shell可用,它将给出非零。如果您给出一个实际的命令,它要么返回指示错误的-1(例如,无法生成进程),要么返回命令的状态,该状态应与操作系统相关。也许您最关心的是"如果命令失败",您应该通过检查返回值是否为0(0表示良好)来做得很好。

请注意,要获得命令的输出,需要将输出保存在某个位置。例如,执行dir命令如下:

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

然后从CCD_ 7检索其输出。