linux 下远程执行命令 socket实现

 

 

服务端:

 

/*************************************************************************
        > File Name: srv.c
        > Author: zhoulin
        > Mail: [email protected] 
        > Created Time: Sat 02 Jan 2016 04:39:53 PM EST
 ************************************************************************/

#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define  size 4096
#define  port 6000
#define  backlog  5
int main(void) {
    int sk;
    int rsk;
    struct sockaddr_in server;
    struct sockaddr_in client;
    char send_buf[size];
    char recv_buf[size];
    
    //open a socket
    sk= socket(AF_INET,SOCK_STREAM,0); //建立socket
    if(sk == -1) {
        perror("socket");
        return -1;
    }
    
    //seting server addr
    memset((char *)&server,0,sizeof(server));
    server.sin_family = AF_INET;
    server.sin_addr.s_addr = htonl(INADDR_ANY);
    server.sin_port =  port;

    if(bind(sk, (struct sockaddr *)&server, sizeof(server)) == -1) { //绑定到指定的port上
        perror("bind");
        return -1;
    }
    if(listen(sk, backlog) == -1) { //监听服务端的端口
        perror("listen");
        return -1;
    }
    int len=sizeof(client);
    printf("****************listen socket****************\n");
    while(1) {
        if((rsk = accept(sk,(struct sockaddr *)&client, &len)) < 0){ //循环监听
            perror("accept");
            return -1;
        }
        fprintf(stdout,"Conencted from %s\n", inet_ntoa(client.sin_addr)); //输出连接到服务端的IP地址
        printf("TCP>");
        memset(send_buf,'\0',size);
        fgets(send_buf, size, stdin); //输入命令
        size_t slen=send(rsk, send_buf, strlen(send_buf), 0); //发送指正字节到客户端
        size_t rlen=recv(rsk, recv_buf, size, 0); //接受来自客户端的信息
        if(strncmp(recv_buf,"quit",4) == 0){  //如果收到的是是quit,则退出
            break;
        }
        if(rlen > 0 ) { //重置接受信息的缓冲区
            fprintf(stdout,"%s",recv_buf);
            memset(recv_buf,'\0',size);
        }
    }
    return 0;
}

 

客户端 代码如下

/*************************************************************************
        > File Name: cli.c
        > Author: zhoulin
        > Mail: [email protected] 
        > Created Time: Sat 02 Jan 2016 06:37:32 PM EST
 ************************************************************************/
#include <stdio.h>
#include <unistd.h>
#include <time.h>
#include <string.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define size 4096
#define port 6000
#define sleep_time 1
int exec_command() {
    int exec_flag=0;
    char log[2048]={'\0'};
    time_t c_now;
    struct tm *c_tm_now;
    time(&c_now);
    c_tm_now=localtime(&c_now);
    char *wday[]={"Sun","Mon","Tue","Wed","Thu","Fri","Sat"};
    sprintf(log,"[%d-%d-%d %s %d:%d:%d] : ", (1900+c_tm_now->tm_year), (1+c_tm_now->tm_mon),\
            c_tm_now->tm_mday,wday[c_tm_now->tm_wday], c_tm_now->tm_hour, c_tm_now->tm_min, c_tm_now->tm_sec);
    char send_buf[size];
    char recv_buf[size];
    int skc = socket(AF_INET,SOCK_STREAM,0);
    if(skc == -1){
        perror("socket");
        exec_flag=-1;
        return exec_flag;
    }
    struct sockaddr_in saddr;
    memset(&saddr,0,sizeof(saddr));
    saddr.sin_family = AF_INET;
    saddr.sin_port = port;
    saddr.sin_addr.s_addr = inet_addr("192.168.100.10");

    //connect a socket
    if(connect(skc,  (struct sockaddr *)&saddr, sizeof(saddr)) <0) {
        perror("conenct");
        exec_flag=-1;
        return exec_flag;
    }
    FILE *fp = NULL;
    size_t len = recv(skc,recv_buf,sizeof(recv_buf), 0);
    if(len > 0) {
        if(strncmp(recv_buf,"quit",4) == 0) {
            strncpy(recv_buf,"quit",4);
            memset(send_buf,'\0',size);
            strncpy(send_buf,"quit",4);
            send(skc,send_buf,size,0);
            exec_flag=-1;
            return exec_flag;
        }
        recv_buf[len] = '\0';
        fp = popen(recv_buf, "r");
        memset(send_buf, 0, size);
        int rsize=fread(send_buf,1,size,fp);
        if(rsize <= 0) {
            strncpy(send_buf,"******execute command fail **********\n",size);
        }
        send(skc,send_buf,size,0);
        strncpy(log+strlen(log),recv_buf,strlen(recv_buf));
        printf("%s",log);
        memset(recv_buf,'\0',size);
        pclose(fp);
        exec_flag = 0;
    }
    return exec_flag;
}
int main(void) {
    while(1) {
        if(exec_command() == -1){
            break;
        }
        sleep(sleep_time);
    }
}

 

运行结果 :

  服务端的输出:

****************listen socket****************
Conencted from 192.168.100.20
TCP>pwd
/home/zhoulin/socket
Conencted from 192.168.100.20
TCP>ls -l -a
total 64
drwxrwxr-x. 2 zhoulin zhoulin  4096 Jan  3 15:38 .
drwx------. 4 zhoulin zhoulin  4096 Jan  3 15:38 ..
-rw-rw-r--. 1 zhoulin zhoulin     0 Jan  2 22:48 1
-rw-rw-r--. 1 zhoulin zhoulin     0 Jan  2 22:49 1.log
-rwxrwxr-x. 1 zhoulin zhoulin  9839 Jan  3 15:38 cli
-rw-rw-r--. 1 zhoulin zhoulin  2494 Jan  2 22:59 cli.c
-rw-rw-r--. 1 zhoulin zhoulin 13483 Jan  2 16:12 sp
-rw-rw-r--. 1 zhoulin zhoulin  2602 Jan  2 16:12 spair.c
-rw-rw-r--. 1 zhoulin zhoulin 13546 Jan  2 22:54 srv
-rw-rw-r--. 1 zhoulin zhoulin  1930 Jan  2 22:47 srv.c
Conencted from 192.168.100.20
TCP>du /
1512    /usr/lib64/nss/unsupported-tools
4       /usr/lib64/nss/saved
2216    /usr/lib64/nss
68      /usr/lib64/pm-utils/sleep.d
16      /usr/lib64/pm-utils/module.d
32      /usr/lib64/pm-utils/bin
8       /usr/lib64/pm-utils/power.d
148     /usr/lib64/pm-utils
140     /usr/lib64/libuser
248     /usr/lib64/pango/1.6.0/modules
252     /usr/lib64/pango/1.6.0
256     /usr/lib64/pango
76      /usr/lib64/traceevent/plugins
80      /usr/lib64/traceevent
56      /usr/lib64/gettext
10276   /usr/lib64/atlas
312     /usr/lib64/ibdiagnet1.5.7
108     /usr/lib64/pygtk/2.0/demos/images
588     /usr/lib64/pygtk/2.0/demos
616     /usr/lib64/pygtk/2.0
620     /usr/lib64/pygtk
5008    /usr/lib64/ibdm1.5.7/ibnl
5684    /usr/lib64/ibdm1.5.7
8       /usr/lib64/tk8.5
12      /usr/lib64/p11-kit
48      /usr/lib64/libnfsidmap
704     /usr/lib64/pkgconfig
88      /usr/lib64/libfakeroot
200     /usr/lib64/ldb/modules/ldb
204     /usr/lib64/ldb/modules
208     /usr/lib64/ldb
392     /usr/lib64/ibdiagui1.5.7
16      /usr/lib64/apr-util-1
52      /usr/lib64/sssd/modules
2076    /usr/lib64/sssd
820     /usr/lib64/evolution-data-server-1.2/camel-providers
1020    /usr/lib64/evolution-data-server-1.2/extensions
1844    /usr/lib64/evolution-data-server-1.2
36      /usr/lib64/bonobo-2.0/samples
40      /usr/lib64/bonobo-2.0
1512    /usr/lib64/graphviz/tcl
2248    /usr/lib64/graphviz
4       /usr/lib64/tcl8.5
60      /usr/lib64/perl5/Time
268     /usr/lib64/perl5/B
100     /usr/lib64/perl5/HTML
12      /usr/lib64/perl5/DBI/Util
84      /usr/lib64/perl5/DBI/Const/GetInfo
96      /usr/lib64/perl5/DBI/Const
20      /usr/lib64/perl5/DBI/Gofer/Transport
16      /usr/lib64/perl5/DBI/Gofer/Serializer
88      /usr/lib64/perl5/DBI/Gofer
20      /usr/lib64/perl5/DBI/DBD
28      /usr/lib64/perl5/DBI/SQL
12      /usr/lib64/perl5/DBI/ProfileDumper
664     /usr/lib64/perl5/DBI
60      /usr/lib64/perl5/Compress/Raw
108     /usr/lib64/perl5/Compress
24      /usr/lib64/perl5/IO/Socket
8       /usr/lib64/perl5/IO/Compress/Zip
8       /usr/lib64/perl5/IO/Compress/Gzip
16      /usr/lib64/perl5/IO/Compress/Zlib
16      /usr/lib64/perl5/IO/Compress/Adapter
28      /usr/lib64/perl5/IO/Compress/Base
248     /usr/lib64/perl5/IO/Compress
16      /usr/lib64/perl5/IO/Uncompress/Adapter
272     /usr/lib64/perl5/IO/Uncompress
628     /usr/lib64/perl5/IO
12      /usr/lib64/perl5/gnu
20      /usr/lib64/perl5/Filter/Util
24      /usr/lib64/perl5/Filter
12      /usr/lib64/perl5/Text
24      /usr/lib64/perl5/threads
36      /usr/lib64/perl5/Digest
36      /usr/lib64/perl5/IPC
4       /usr/lib64/perl5/machine
8       /usr/lib64/perl5/DBD/SQLite
24      /usr/lib64/perl5/DBD/Gofer/Policy
44      /usr/lib64/perl5/DBD/Gofer/Transport
72      /usr/lib64/perl5/DBD/Gofer
308     /usr/lib64/perl5/DBD
84      /usr/lib64/perl5/sys
12      /usr/lib64/perl5/I18N
36      /usr/lib64/perl5/Hash/Util
56      /usr/lib64/perl5/Hash
228     /usr/lib64/perl5/Devel
3480    /usr/lib64/perl5/CORE
100     /usr/lib64/perl5/asm
4       /usr/lib64/perl5/5.10.0/x86_64-linux-thread-multi/CORE
8       /usr/lib64/perl5/5.10.0/x86_64-linux-thread-multi
12      /usr/lib64/perl5/5.10.0
20      /usr/lib64/perl5/PerlIO
44      /usr/lib64/perl5/Data
16      /usr/lib64/perl5/linux
20      /usr/lib64/perl5/Unicode
20      /usr/lib64/perl5/Encode/JP
12      /usr/lib64/perl5/Encode/CN
8       /usr/lib64/perl5/Encode/KR
8       /usr/lib64/perl5/Encode/Unicode
8       /usr/lib64/perl5/Encode/MIME/Header
24      /usr/lib64/perl5/Encode/MIME
184     /usr/lib64/perl5/Encode
160     /usr/lib64/perl5/bits
8       /usr/lib64/perl5/Scalar/Util
20      /usr/lib64/perl5/Scalar
40      /usr/lib64/perl5/asm-generic
36      /usr/lib64/perl5/File
8       /usr/lib64/perl5/Bundle
8       /usr/lib64/perl5/Math/BigInt
12      /usr/lib64/perl5/Math
24      /usr/lib64/perl5/XML/Parser/Style
300     /usr/lib64/perl5/XML/Parser/Encodings
368     /usr/lib64/perl5/XML/Parser
400     /usr/lib64/perl5/XML
12      /usr/lib64/perl5/List/Util
24      /usr/lib64/perl5/List
16      /usr/lib64/perl5/MIME
24      /usr/lib64/perl5/vendor_perl/Crypt/SSLeay
44      /usr/lib64/perl5/vendor_perl/Crypt
20      /usr/lib64/perl5/vendor_perl/Net
44      /usr/lib64/perl5/vendor_perl/auto/Crypt/SSLeay
48      /usr/lib64/perl5/vendor_perl/auto/Crypt
52      /usr/lib64/perl5/vendor_perl/auto
120     /usr/lib64/perl5/vendor_perl
52      /usr/lib64/perl5/Sys
24      /usr/lib64/perl5/auto/Time/Piece
32      /usr/lib64/perl5/auto/Time/HiRes
60      /usr/lib64/perl5/auto/Time
152     /usr/lib64/perl5/auto/B
20      /usr/lib64/perl5/auto/DynaLoader
36      /usr/lib64/perl5/auto/NDBM_File
44      /usr/lib64/perl5/auto/GDBM_File
68      /usr/lib64/perl5/auto/DB_File
20      /usr/lib64/perl5/auto/Cwd
5du /
Conencted from 192.168.100.20
TCP>qui

 

客户端的执行日志:

zhoulin@:~/socket:./cli
[2016-1-3 Sun 15:38:38] : pwd
[2016-1-3 Sun 15:38:43] : ls -l -a
[2016-1-3 Sun 15:39:11] : du /

 

 

你可能感兴趣的:(linux 下远程执行命令 socket实现)