一個遠端系統控制檯的小工具
因為工作需要很多的遠端管理,一些現有的工具已經不能滿足實際要求。所以就 有了製作一個小型遠端控制檯的想法。
其實,它的工作原理很簡單。主要有兩部分組成,一個是對Cmd.exe 的標準輸入和輸出的重定向,另外有一個TCP連線來把本機的資訊傳送給遠端的主機。
以為手上有兩個能實現上述功能的開原始碼,所以我的工作就是把它們揉在一起。但要求是Socket和ReStdInOut必須分離,Socket要不能使用MFC(為了方便把邏輯移植到Linux或者和.Net連線),服務段程式必須是控制檯(為了把它最終變成一個NT服務)。
Socket類是一個在網上找到的一輕量級WinSocket封裝,因為覺得它寫的比我原來自己的封裝要好,而且最終要的是它已經儘可能使用的是標準C++庫(用的是Std::String,不是MFC::CString),給以後的移植方便了不少。
參考 C++ Socket Class for Windows
該類使用非常的方便
A simple Client
#include <iostream>
using namespace std;
int main() {
try {
SocketClient s("www.google.com", 80);
s.SendLine("GET / HTTP/1.0");
s.SendLine("Host: www.google.com");
s.SendLine("");
while (1) {
string l = s.ReceiveLine();
if (l.empty()) break;
cout << l;
cout.flush();
}
}
catch (const char* s) {
cerr << s << endl;
}
catch (String s) {
cerr << s << endl;
}
catch (...) {
cerr << "unhandled exception ";
}
return 0;
}
A simple echo Server
EchoServer.cpp
Copyright (C) 2002-2004 René Nyffenegger
This source code is provided 'as-is', without any express or implied
warranty. In no event will the author be held liable for any damages
arising from the use of this software.
Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it
freely, subject to the following restrictions:
1. The origin of this source code must not be misrepresented; you must not
claim that you wrote the original source code. If you use this source code
in a product, an acknowledgment in the product documentation would be
appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not be
misrepresented as being the original source code.
3. This notice may not be removed or altered from any source distribution.
René Nyffenegger rene.nyffenegger@adp-gmbh.ch
*/
#include "Socket.h"
#include <process.h>
#include <string>
unsigned __stdcall Answer(void* a) {
Socket* s = (Socket*) a;
while (1) {
std::string r = s->ReceiveLine();
if (r.empty()) break;
s->SendLine(r);
}
delete s;
return 0;
}
int main(int argc, char* argv[]) {
SocketServer in(2000,5);
while (1) {
Socket* s=in.Accept();
unsigned ret;
_beginthreadex(0,0,Answer,(void*) s,0,&ret);
}
return 0;
}
標準輸入輸入的重定向 用了一個CodeProjet 的專案
QuickWin - Turn a console application into a Windows program
專案裡的CRedirect類個人感覺非常好用,只需從他繼承一個自己的類,並且重寫4個虛擬函式
virtual void OnChildStdOutWrite(LPCSTR lpszOutput);
virtual void OnChildStdErrWrite(LPCSTR lpszOutput);
virtual void OnChildTerminate();
就輕鬆實現了標準輸入輸出的重定向。
其實核心技術都不是我自己寫的,但是得益於開源的力量,在瞭解了他們的原始碼有我覺得完全可能把它們結合成一個新的應用。
我的方法是
1、Server初始化一個TCP Listener,等待客戶端接入。
2、客戶端接入服務段。
3、服務段連線客戶端後,開啟一個cmd.exe的程式,並重導向它的標準輸入、輸出和錯誤流。(這裡可以改進一下,使用API:CreateProcessWithLogonW或API:CreateProcessWithTokenW,是cmd.exe跑在制定的使用者下,因為如果當前程式是NT服務的話,預設在System帳戶下,我問需要找到當前的登陸使用者,用它的程式跑Cmd.exe)
4、 用ReDir類的WriteStdIn和StdOut事件,反覆輸入和到處從Socket.ReandLine和Socket.SendLine的內容,以實現遠端控制檯的目的.
5、當客戶端用Exit結束cmd.exe時,服務段關閉連線自動退出。[你也改為繼續等待下個連線]
介面:(因為用的是Visual Studio 2005製作,執行需要MFC8的RunTime DLL)
先啟動服務程式:
接著使用 Telnet localhost 2000 連線服務,會得到一下狀態
你就可以向使用自己的本地控制檯一樣操作那臺機器了。
連續兩次exit指令 關閉連線、退出服務。
注意:我故意沒有隱藏開啟的cmd.exe程式,可以開原始碼裡OpenChildProcess了第二個引數為0就可隱藏了。
整個製作時間:3小時。(開源真好:))
問題:沒有過濾掉輸出重複的命令
相關文章
- JAVA控制檯下:控制檯商城購物系統Java
- 怎麼防止電腦被遠端控制?Win10系統禁用遠端控制方法Win10
- ECS控制檯診斷系統
- 遠端小工具PuTTY
- 一個關於遠端控制桌面的工具
- 簡要分析Hacking Team 遠端控制系統
- 如何建造一個安全好用的遠端測試系統
- Windows10系統禁用遠端連線控制的方法Windows
- PostgreSQL pgbackrest 怎麼設計帶遠端控制端的PG備份系統系統SQLREST
- frp p2p rdp 計算機無法連線到遠端計算機上的另一個控制檯會話原因是你正在執行一個控制檯會話FRP計算機會話
- 《遠端控制》-服務端實現(一)服務端
- 微軟私有云分享(R2)19AzurePack與遠端控制檯微軟
- VNC遠端控制,VNC遠端控制連線WindowsVNCWindows
- Ulterius能透過遠端瀏覽器控制Windows系統瀏覽器Windows
- Win10系統開啟Windows控制檯的方法Win10Windows
- 遠端控制的操作流程
- windows10系統qq怎麼發遠端_windows10qq遠端控制怎麼弄Windows
- c++控制檯寫一個計時器C++
- 超酷的Unix終端/控制檯工具小集合
- 電腦遠端控制怎麼弄 遠端控制別人的電腦
- 用Node寫的一個控制檯看股票的小程式
- 巧用 Windows 系統控制檯刪除病毒檔案Windows
- 控制檯中動態顯示系統時間
- 一個統計原始碼的小工具原始碼
- 有趣的控制檯玩法:一行程式碼繪製控制檯影像!行程
- 不一樣的控制檯程式—–在控制檯中輸出圖片薦
- 怎麼遠端控制電腦 遠端控制電腦的兩種方法分享
- Win10系統禁止本機被其他電腦遠端控制的方法Win10
- 城市景觀智慧燈控系統如何遠端監控和控制
- 分散式系統:遠端呼叫分散式
- 電腦遠端控制怎麼弄 學會遠端控制電腦
- Ubuntu系統安裝VNC虛擬網路控制檯UbuntuVNC
- FreeBSD系統中調整控制檯設定(轉)
- 巧用系統控制檯刪除死頑固病毒(轉)
- 遠端控制篇:抓取遠端螢幕影像 (轉)
- 使用遠端控制操作遠端xp sp2的問題
- 洞見RSA 2021|如何設計安全的控制系統遠端訪問
- 啟用遠端系統上的應用