服务器apache远程命令,Linux实例:用socket通讯远程执行命令

以下为引用的内容:

服务器端程序:

/**********************************************************

* server.c

* 服务器端程序

*

*********************************************************/

#include

#include

#include

#include

#include

#include

#include

#include

#define BUFSIZE 8192

#define DEFAULT_PORT 5320

enum{CMD_NAME,SRC_PORT};

int execute(char *command,char *buf,int bufmax);

int main(int argc,char *argv[])

{

struct sockaddr_in server;//服务器地址

struct sockaddr_in client;//客户机地址

int len;//sockaddr_in的长度

int port;//服务器端口号

int s;//接收报文用描述符

int s0;//接收连接用描述符

int cn;//接收命令的字数

int sn;//发送报文的字节数

int rn;//接收报文的字节数

char cmd1[BUFSIZE];//第一个语句命令

char cmd2[BUFSIZE];//第二个语句命令

char recv_buf[BUFSIZE];//接收缓冲区

char send_buf[BUFSIZE];//发送缓冲区

//实际参数的处理(端口号)

if(argc==2){

if((port=atoi(argv[SRC_PORT]))==0){

struct servent *se;//服务信息

if((se=getservbyname(argv[SRC_PORT],"tcp"))!=NULL)

port=(int) ntohs((u_short)se->s_port);

else{

fprintf(stderr,"getservbyname error");

exit(EXIT_FAILURE);

}

}

}else

port=DEFAULT_PORT;

//使用TCP协议打开一个套接字

if((s0=socket(AF_INET,SOCK_STREAM,0))<0){

perror("socket");

exit(EXIT_FAILURE);

}

//设定服务器地址

memset((char *)&server,0,sizeof(server));

server.sin_family=AF_INET;

server.sin_addr.s_addr=htonl(INADDR_ANY);

server.sin_port=htons(port);

if(bind(s0,(struct sockaddr *)&server,sizeof(server))<0){

perror("bind");

exit(EXIT_FAILURE);

}

//开始接受建立连接请求

listen(s0,5);

//接收连接循环

while(1){

//接收连接处理

len=sizeof(client);

if((s=accept(s0,(struct sockaddr *)&client,&len))<0){

perror("accept");

exit(EXIT_FAILURE);

}

printf("Connected From '%s'",inet_ntoa(client.sin_addr));

#ifdef FORK_SERVER

if(fork()!=0){

close(s);

continue;

}

close(s0);

#endif

//服务器处理的主要子程序

while(1){

int i=0;//接收字符的计数器

sn=sprintf(send_buf,"TCP>");

send(s,send_buf,sn,0);

receive://流型数据的接收处理

if((rn=recv(s,&recv_buf[i],1,0))<0)

break;

//以换行为单位进行接收处理

if(recv_buf[i]!=''){

i++;

if(i

goto receive;

}

recv_buf[i]=' ';

printf("receive '%s'",recv_buf);

//接收命令的处理

if((cn=sscanf(recv_buf,"%s%s",cmd1,cmd2))<=0)

continue;

else if(cn==2 && strcmp(cmd1,"show")==0){

if(strcmp(cmd2,"route")==0)

#ifdef _linux

sn=execute("/usr/bin/netstat -rn",send_buf,BUFSIZE);

#else

sn=execute("/bin/netstat -rn",send_buf,BUFSIZE);

#endif

else if(strcmp(cmd2,"arp")==0)

#ifdef _linux

sn=execute("/usr/sbin/arp -an",send_buf,BUFSIZE);

#else

sn=execute("/sbin/arp -an",send_buf,BUFSIZE);

#endif

else if(strcmp(cmd2,"tcp")==0)

#ifdef _linux

sn=execute("/usr/bin/netstat -tn",send_buf,BUFSIZE);

#else

sn=execute("/bin/netstat -tn",send_buf,BUFSIZE);

#endif

else if(strcmp(cmd2,"nic")==0)

sn=execute("/sbin/ifconfig -a",send_buf,BUFSIZE);

else

sn=sprintf(send_buf,"parameter error '%s'"

"show[route|arp|tcp|nic]",cmd2);

}else if(cn==1){

if(strcmp(cmd1,"quit")==0)

break;

send_buf[0]=' ';

if(strcmp(cmd1,"help")!=0)

sprintf(send_buf,"command error '%s'",cmd1);

strcat(send_buf,"command:"

"show route"

"show arp"

"show tcp"

"show nic"

"quit"

"help");

sn=strlen(send_buf);

}else

sn=sprintf(send_buf,"command error '%s'",cmd1);

if(sn==0)

sn=sprintf(send_buf,"");

if(send(s,send_buf,sn,0)<0)

break;

printf("%s",send_buf);

}

printf("Connection closed.");

close(s);

}

close(s0);

return EXIT_SUCCESS;

}

/*

*int execute(char *command,char *buf,int bufmax);

*

*功能

*执行命令,将结果存储到缓冲区中

*实际参数

*char *command;所执行的命令

*char *buf;存储输出结果的缓冲区

*int bufmax缓冲区的大小

*返回值

*int存储到缓冲区的字符数

*/

int execute(char *command,char *buf,int bufmax)

{

FILE *fp;//文件指针

int i;//输入数据的字节数

if((fp=popen(command,"r"))==NULL){

perror(command);

i=sprintf(buf,"server error: '%s' cannot execute.",command);

}else{

i=0;

while((buf[i]=fgetc(fp))!=EOF && i

i++;

pclose(fp);

}

return i;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值