请教一个小问题

时间:2021-11-07 14:17:57
我在实现一个远程命令执行的c/s的项目,我在服务端用一个控制台给客户端发送命令执行,客户端用CreateProcess执行cmd命令。现在有个问题,cd命令如何实现?是在服务端处理好cd命令还是在客户端处理?
比如现在路径是c:\windows\system32在服务段输入cd ..然后dir那么我是在服务段处理好这个cd命令使得发送给客户端的是dir c:\windows还是在客户端处理好cd?
大神们提供一点思路

7 个解决方案

#1


表面上看来,两种方法都有好处

客户端处理的好处:
1.减轻服务器负载
2.实现简单
3.模块划分更清楚
4.错误处理也简单(客户端很容易知道命令有没有错误)

服务器处理的好处:
1.减少客户端负担
2.降低网络流量

吐槽一个:你这服务器比客户端还像客户端 请教一个小问题

#2


_chdir, _wchdir
Change the current working directory.

int _chdir( const char *dirname );

int _wchdir( const wchar_t *dirname );

Routine Required Header Optional Headers Compatibility 
_chdir <direct.h> <errno.h> Win 95, Win NT 
_wchdir <direct.h> or <wchar.h> <errno.h> Win NT 


For additional compatibility information, see Compatibility in the Introduction.

Libraries

LIBC.LIB Single thread static library, retail version 
LIBCMT.LIB Multithread static library, retail version 
MSVCRT.LIB Import library for MSVCRT.DLL, retail version 


Return Value

Each of these functions returns a value of 0 if successful. A return value of –1 indicates that the specified path could not be found, in which case errno is set to ENOENT.

Parameter

dirname

Path of new working directory

Remarks

The _chdir function changes the current working directory to the directory specified by dirname. The dirname parameter must refer to an existing directory. This function can change the current working directory on any drive and if a new drive letter is specified in dirname, the default drive letter will be changed as well. For example, if A is the default drive letter and \BIN is the current working directory, the following call changes the current working directory for drive C and establishes C as the new default drive:

_chdir("c:\\temp");

When you use the optional backslash character (\) in paths, you must place two backslashes (\\) in a C string literal to represent a single backslash (\).

_wchdir is a wide-character version of _chdir; the dirname argument to _wchdir is a wide-character string. _wchdir and _chdir behave identically otherwise.

Generic-Text Routine Mapping:

TCHAR.H Routine  _UNICODE & _MBCS Not Defined _MBCS Defined _UNICODE Defined 
_tchdir _chdir _chdir _wchdir 


Example

/* CHGDIR.C: This program uses the _chdir function to verify
 * that a given directory exists.
 */

#include <direct.h>
#include <stdio.h>
#include <stdlib.h>

void main( int argc, char *argv[] )
{
   if( _chdir( argv[1] )   )
      printf( "Unable to locate the directory: %s\n", argv[1] );
   else
      system( "dir *.wri");
}


Output

 Volume in drive C is CDRIVE
 Volume Serial Number is 0E17-1702

 Directory of C:\write

04/21/95  01:06p                 3,200 ERRATA.WRI
04/21/95  01:06p                 2,816 README.WRI
               2 File(s)          6,016 bytes
                             71,432,116 bytes free


Directory Control Routines

See Also   _mkdir, _rmdir, system

#3


引用 1 楼 EnjoySilence 的回复:
表面上看来,两种方法都有好处

客户端处理的好处:
1.减轻服务器负载
2.实现简单
3.模块划分更清楚
4.错误处理也简单(客户端很容易知道命令有没有错误)

服务器处理的好处:
1.减少客户端负担
2.降低网络流量

吐槽一个:你这服务器比客户端还像客户端 请教一个小问题
哈哈,我问的是如何实现额

#4


引用 楼主 yiyefangzhou24 的回复:
我在实现一个远程命令执行的c/s的项目,我在服务端用一个控制台给客户端发送命令执行,客户端用CreateProcess执行cmd命令。现在有个问题,cd命令如何实现?是在服务端处理好cd命令还是在客户端处理?
比如现在路径是c:\windows\system32在服务段输入cd ..然后dir那么我是在服务段处理好这个cd命令使得发送给客户端的是dir c:\windows还是在客户端处理好cd?
大神们提供一点思路


建议你指令直接传给客户端,让客户端自己执行。
如果只有CD等固定简单指令可以用对应的系统api实现,比如_chdir + _chdrive = CD
如果指令比较多,要完全模拟CMD,可以直接对CMD开管道,直接让CMD来处理。

#5


引用 楼主 yiyefangzhou24 的回复:
我在实现一个远程命令执行的c/s的项目,我在服务端用一个控制台给客户端发送命令执行,客户端用CreateProcess执行cmd命令。现在有个问题,cd命令如何实现?是在服务端处理好cd命令还是在客户端处理?
比如现在路径是c:\windows\system32在服务段输入cd ..然后dir那么我是在服务段处理好这个cd命令使得发送给客户端的是dir c:\windows还是在客户端处理好cd?
大神们提供一点思路


都可以,看具体需求吧!各有利弊!

#6


刚看到一种东西叫远程管道

#7


引用 3 楼 yiyefangzhou24 的回复:
Quote: 引用 1 楼 EnjoySilence 的回复:

表面上看来,两种方法都有好处

客户端处理的好处:
1.减轻服务器负载
2.实现简单
3.模块划分更清楚
4.错误处理也简单(客户端很容易知道命令有没有错误)

服务器处理的好处:
1.减少客户端负担
2.降低网络流量

吐槽一个:你这服务器比客户端还像客户端 请教一个小问题
哈哈,我问的是如何实现额


我不是回答如何实现么?你仔细看看。

#1


表面上看来,两种方法都有好处

客户端处理的好处:
1.减轻服务器负载
2.实现简单
3.模块划分更清楚
4.错误处理也简单(客户端很容易知道命令有没有错误)

服务器处理的好处:
1.减少客户端负担
2.降低网络流量

吐槽一个:你这服务器比客户端还像客户端 请教一个小问题

#2


_chdir, _wchdir
Change the current working directory.

int _chdir( const char *dirname );

int _wchdir( const wchar_t *dirname );

Routine Required Header Optional Headers Compatibility 
_chdir <direct.h> <errno.h> Win 95, Win NT 
_wchdir <direct.h> or <wchar.h> <errno.h> Win NT 


For additional compatibility information, see Compatibility in the Introduction.

Libraries

LIBC.LIB Single thread static library, retail version 
LIBCMT.LIB Multithread static library, retail version 
MSVCRT.LIB Import library for MSVCRT.DLL, retail version 


Return Value

Each of these functions returns a value of 0 if successful. A return value of –1 indicates that the specified path could not be found, in which case errno is set to ENOENT.

Parameter

dirname

Path of new working directory

Remarks

The _chdir function changes the current working directory to the directory specified by dirname. The dirname parameter must refer to an existing directory. This function can change the current working directory on any drive and if a new drive letter is specified in dirname, the default drive letter will be changed as well. For example, if A is the default drive letter and \BIN is the current working directory, the following call changes the current working directory for drive C and establishes C as the new default drive:

_chdir("c:\\temp");

When you use the optional backslash character (\) in paths, you must place two backslashes (\\) in a C string literal to represent a single backslash (\).

_wchdir is a wide-character version of _chdir; the dirname argument to _wchdir is a wide-character string. _wchdir and _chdir behave identically otherwise.

Generic-Text Routine Mapping:

TCHAR.H Routine  _UNICODE & _MBCS Not Defined _MBCS Defined _UNICODE Defined 
_tchdir _chdir _chdir _wchdir 


Example

/* CHGDIR.C: This program uses the _chdir function to verify
 * that a given directory exists.
 */

#include <direct.h>
#include <stdio.h>
#include <stdlib.h>

void main( int argc, char *argv[] )
{
   if( _chdir( argv[1] )   )
      printf( "Unable to locate the directory: %s\n", argv[1] );
   else
      system( "dir *.wri");
}


Output

 Volume in drive C is CDRIVE
 Volume Serial Number is 0E17-1702

 Directory of C:\write

04/21/95  01:06p                 3,200 ERRATA.WRI
04/21/95  01:06p                 2,816 README.WRI
               2 File(s)          6,016 bytes
                             71,432,116 bytes free


Directory Control Routines

See Also   _mkdir, _rmdir, system

#3


引用 1 楼 EnjoySilence 的回复:
表面上看来,两种方法都有好处

客户端处理的好处:
1.减轻服务器负载
2.实现简单
3.模块划分更清楚
4.错误处理也简单(客户端很容易知道命令有没有错误)

服务器处理的好处:
1.减少客户端负担
2.降低网络流量

吐槽一个:你这服务器比客户端还像客户端 请教一个小问题
哈哈,我问的是如何实现额

#4


引用 楼主 yiyefangzhou24 的回复:
我在实现一个远程命令执行的c/s的项目,我在服务端用一个控制台给客户端发送命令执行,客户端用CreateProcess执行cmd命令。现在有个问题,cd命令如何实现?是在服务端处理好cd命令还是在客户端处理?
比如现在路径是c:\windows\system32在服务段输入cd ..然后dir那么我是在服务段处理好这个cd命令使得发送给客户端的是dir c:\windows还是在客户端处理好cd?
大神们提供一点思路


建议你指令直接传给客户端,让客户端自己执行。
如果只有CD等固定简单指令可以用对应的系统api实现,比如_chdir + _chdrive = CD
如果指令比较多,要完全模拟CMD,可以直接对CMD开管道,直接让CMD来处理。

#5


引用 楼主 yiyefangzhou24 的回复:
我在实现一个远程命令执行的c/s的项目,我在服务端用一个控制台给客户端发送命令执行,客户端用CreateProcess执行cmd命令。现在有个问题,cd命令如何实现?是在服务端处理好cd命令还是在客户端处理?
比如现在路径是c:\windows\system32在服务段输入cd ..然后dir那么我是在服务段处理好这个cd命令使得发送给客户端的是dir c:\windows还是在客户端处理好cd?
大神们提供一点思路


都可以,看具体需求吧!各有利弊!

#6


刚看到一种东西叫远程管道

#7


引用 3 楼 yiyefangzhou24 的回复:
Quote: 引用 1 楼 EnjoySilence 的回复:

表面上看来,两种方法都有好处

客户端处理的好处:
1.减轻服务器负载
2.实现简单
3.模块划分更清楚
4.错误处理也简单(客户端很容易知道命令有没有错误)

服务器处理的好处:
1.减少客户端负担
2.降低网络流量

吐槽一个:你这服务器比客户端还像客户端 请教一个小问题
哈哈,我问的是如何实现额


我不是回答如何实现么?你仔细看看。