服务器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;
}
總結
以上是生活随笔為你收集整理的服务器apache远程命令,Linux实例:用socket通讯远程执行命令的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 郭明錤:苹果第一款 OLED MacBo
- 下一篇: linux nacos启动_Nacos集