2012-03-27 69 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