服务器apache远程命令,Linux实例:用socket通讯远程执行命令
以下為引用的內(nèi)容:
服務(wù)器端程序:
/**********************************************************
* server.c
* 服務(wù)器端程序
*
*********************************************************/
#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;//服務(wù)器地址
struct sockaddr_in client;//客戶機(jī)地址
int len;//sockaddr_in的長度
int port;//服務(wù)器端口號
int s;//接收報文用描述符
int s0;//接收連接用描述符
int cn;//接收命令的字?jǐn)?shù)
int sn;//發(fā)送報文的字節(jié)數(shù)
int rn;//接收報文的字節(jié)數(shù)
char cmd1[BUFSIZE];//第一個語句命令
char cmd2[BUFSIZE];//第二個語句命令
char recv_buf[BUFSIZE];//接收緩沖區(qū)
char send_buf[BUFSIZE];//發(fā)送緩沖區(qū)
//實(shí)際參數(shù)的處理(端口號)
if(argc==2){
if((port=atoi(argv[SRC_PORT]))==0){
struct servent *se;//服務(wù)信息
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協(xié)議打開一個套接字
if((s0=socket(AF_INET,SOCK_STREAM,0))<0){
perror("socket");
exit(EXIT_FAILURE);
}
//設(shè)定服務(wù)器地址
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);
//接收連接循環(huán)
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
//服務(wù)器處理的主要子程序
while(1){
int i=0;//接收字符的計數(shù)器
sn=sprintf(send_buf,"TCP>");
send(s,send_buf,sn,0);
receive://流型數(shù)據(jù)的接收處理
if((rn=recv(s,&recv_buf[i],1,0))<0)
break;
//以換行為單位進(jìn)行接收處理
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);
*
*功能
*執(zhí)行命令,將結(jié)果存儲到緩沖區(qū)中
*實(shí)際參數(shù)
*char *command;所執(zhí)行的命令
*char *buf;存儲輸出結(jié)果的緩沖區(qū)
*int bufmax緩沖區(qū)的大小
*返回值
*int存儲到緩沖區(qū)的字符數(shù)
*/
int execute(char *command,char *buf,int bufmax)
{
FILE *fp;//文件指針
int i;//輸入數(shù)據(jù)的字節(jié)數(shù)
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;
}
總結(jié)
以上是生活随笔為你收集整理的服务器apache远程命令,Linux实例:用socket通讯远程执行命令的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 郭明錤:苹果第一款 OLED MacBo
- 下一篇: 围棋选手的出路,会是全面转型主播吗