超级轻量的远程命令行客户端和服务端(含文件传输)

功能:实现基于TCPIP的命令行操作远程计算机,并且支持远程文件传输

平台:windows   (linux同理)

原理:客户端连接上服务端之后,先监听键盘输入,将键盘输入的cmd指令保存并发送给服务端;服务端保存并通过调用命令行执行,获取命令行执行结果发送给客户端。如果是   获取文件命令,则读取文件,并将文件发送给客户端

代码:源码下载链接

// 核心代码
int getfile(const char *path,SOCKET ClientSocket,const char *file)
{
	int rtn = 0;
	char buffer[DEFAULT_BUFLEN];//
	string finalfile = string(path)+"\\"+string(file);
	printf("finalfile:%s",finalfile.c_str());
	FILE *fp = fopen(finalfile.c_str(),"rb");

	while(1)
	{
		int size = fread(buffer,1,sizeof(buffer),fp);
		if(size == 0)
		{
			if(feof(fp))
			{
#if 0
				if(-1 ==sendData(ClientSocket,buffer,size,size))
				{
					rtn = -1;
					IF_ERROR_GOTO_END;
				}
#endif
				break;
			}
			else if(ferror(fp))
			{
				rtn = ferror(fp);
				IF_ERROR_GOTO_END;
			}
		}
		else
		{
			if(-1 ==sendData(ClientSocket,buffer,size,size))
			{
				rtn = -1;
				IF_ERROR_GOTO_END;
			}
		}
	}
END:
	fclose(fp);
	return rtn;
}

//http://stackoverflow.com/questions/478898/how-to-execute-a-command-and-get-output-of-command-within-c
int exec(char *lastpath,int pathsize,char* cmd,SOCKET ClientSocket,string out)
{
	//命令结果字符串的最后一行即是当前路径;不能放在最前面,要获取的是执行完cmd之后的路径
	char finalcmd[0x300] = "";
    char buffer[0x300];//
	int rtn = 0;
    string result = "";

	strcpy(finalcmd,(string("cd /d ") + string(lastpath) + string(" && ") +
		string(cmd) + string(" && cd ")).c_str()); // 2>&1 ) && cd 方式添加了错误信息和显示当前路劲,但是报错时只显示最后那个错,不会报告路径,所以不获取错误信息好了

	FILE* pipe = _popen(finalcmd, "r");
	static int i=0;
	printf("\n>>>====第%d条指令======\ncmd:%s\n====第%d条指令======<<<\n",i,finalcmd,i++);
    if (!pipe) return -1;
    while(!feof(pipe))
	{
		if(fgets(buffer, sizeof(buffer), pipe) != NULL)
		{
			result += buffer;
			//printf("%s",buffer);
			int sendLen = 0;
			if(-1 ==sendData(ClientSocket,buffer,strlen(buffer),sendLen))
			{
				rtn = -1;
				IF_ERROR_GOTO_END;
			}
			if(strlen(buffer))
			{
				ZeroMemory(lastpath,pathsize);
				strcpy(lastpath,buffer);
			}
			ZeroMemory(buffer,sizeof(buffer));
		}
    }
    _pclose(pipe);
	pipe = NULL;
	out = result;

END:
	if(pipe != NULL)
	{
		_pclose(pipe);
		pipe = NULL;
	}

	if(lastpath[strlen(lastpath)-1] == '\n')
		lastpath[strlen(lastpath)-1]='\0';//去掉最后的回车
	printf("lastpath:%s",lastpath);
    return rtn;
}

int sendData(SOCKET ClientSocket,char *buf,int bufLen,int &sendLen)
{
	// Echo the buffer back to the sender
	int rtn = 0;
	rtn = send( ClientSocket, buf, bufLen, 0 );
	sendLen = rtn;
	if (rtn == SOCKET_ERROR) {
		printf("send failed with error: %d\n", WSAGetLastError());
	}
    //printf("Bytes sent: %d\n", iSendResult);
	return rtn;
}

测试:

1、开启服务端进程

2、从命令行打开用户端进程 HackClient.exe 127.0.0.1

3、使用dir命令浏览服务端程序的目录

4、从服务端程序获取某文件,从下面的截图可见,最终HackServer.exe拷贝过来了

截图:

注意:

1、如果编译报错没有定义addrinfo结构体,可能是因为用vc6编译的,而vc6自带的ws2tcpip.h文件里是没有定义这个结构体的,可以用vs2008编译

2、使用时,先打开Server的执行文件Server.exe,再打开Client.exe。注意Client.exe的参数是服务端的IP地址

3、需要保证服务端的端口可以正常打开监听

参考:

http://stackoverflow.com/questions/478898/how-to-execute-a-command-and-get-output-of-command-within-c

时间: 09-22

超级轻量的远程命令行客户端和服务端(含文件传输)的相关文章

第4章4节《MonkeyRunner源码剖析》ADB协议及服务: ADB命令行客户端使用简介(原创)

天地会珠海分舵注:本来这一系列是准备出一本书的,详情请见早前博文"寻求合作伙伴编写<深入理解 MonkeyRunner>书籍".但因为诸多原因,没有如愿.所以这里把草稿分享出来,所以错误在所难免.有需要的就参考下吧,转发的话还请保留每篇文章结尾的出处等信息. 从前面几个小节我们知道ADB命令行客户端是存在与主机端的一个命令,用户可以使用该命令来发送服务请求到ADB服务器,ADB服务器再判断该服务请求是主机服务请求还是本地服务请求来决定是否应该将请求传送给远程adbd守护进程

[转]玩转Windows服务系列——命令行管理Windows服务

本文转自:http://www.cnblogs.com/hbccdf/p/managewindowsservicewithcmd.html 说到Windows服务的管理就不得不说通过命令行的方式管理Windows服务,因为无论是系统管理员,还是通过编程的方式调用cmd命令,命令行都是非常方便以及强大的工具. 接下来就看一下如何通过cmd命令管理Windows服务. 管理Windows服务的主要cmd命令 管理Windows服务的命令应该有很多,但是我所了解到的命令主要有两个:sc.net. 说是

网络编程(浏览器客户端-自定义服务端)

1 package netTest; 2 /* 3 * 演示客户端和服务端 4 * 1 客户端:浏览器 5 * 服务端:自定义 6 * tomcat 服务器所作的事情:用printwriter out 把网页数据全打到客户端去, 7 * 而浏览器可以解析 数据. 8 * telnet 远程登录:windows 提供的远程登录的工具,它可以去连接网络中的任意一台主机(dos命令行下连接) 9 * 可以对主机进行命令式的配置.(客户端软件) 10 */ 11 import java.net.*; 1

DatagramSocket客户端与服务端Java实例

1 import java.io.IOException; 2 import java.net.DatagramPacket; 3 import java.net.DatagramSocket; 4 import java.net.InetAddress; 5 6 public class TimeClient_UDP{ 7 public static void main(String args[]) throws IOException{ 8 String host = "localhost&

python3中实现客户端与服务端交互发送文件

在python3中实现客户端与服务端程序交互,从客户端发送文件到服务端 客户端代码:client.py #!/usr/bin/env python #_*_ encoding=utf-8 _*_ import socket,sys,os ip_port = ('127.0.0.1',9999) sk = socket.socket() sk.connect(ip_port) container = {'key':'','data':''} while True:     input_data =

Netty入门之客户端与服务端通信(二)

Netty入门之客户端与服务端通信(二) 一.简介 在上一篇博文中笔者写了关于Netty入门级的Hello World程序.书接上回,本博文是关于客户端与服务端的通信,感觉也没什么好说的了,直接上代码吧. 二.客户端与服务端的通信 2.1 服务端启动程序 public class MyServer { public static void main(String[] args) throws InterruptedException { EventLoopGroup bossGroup = ne

Socket通信客户端和服务端代码

这两天研究了下Socket通信,简单实现的客户端和服务端代码 先上winfrom图片,客户端和服务端一样 服务端代码: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; usin

socket的客户端和服务端(Windows控制台程序)

首先是两个程序,分别是socket的客户端和服务端.(在windows系统vc6.0编译)服务器端:#include <Winsock2.h>#include <stdio.h>#pragma comment(lib,"WS2_32.lib")void main(){    WSADATA wsd;    SOCKET server;                                            //服务器socket    SOCKAD

Android客户端与服务端(jsp)之间json的传输与解析【附效果图附源码】

最近有个项目需要用到json的传输,之前不是太了解,在网上找了些相关资料,写了一个小小的demo,可以实现基本功能:android客户端发送json到服务端,服务端使用jsp接收,解析后以json的形式返回给客户端,客户端接收打印,先看看运行的效果截图,源码会在文章的末尾给出. 1.服务端:接收到json后解析打印,然后发送json到客户端 2.客户端,收到服务端返回的json后打印 简单的介绍下源码: 服务端使用json.jsp来接收解析客户端传过来的json,json的解析需要使用lib目录