linux C tcp server 后台程序 等待连接 接收指令 并执行 shell脚本
#include<stdlib.h>
#include<stdio.h>
int main()
{
printf("Running ps with system\n");
int code = system("ps au");//新进程结束后,system函数才返回
//int code = system("ps au");//system函数立即返回
printf("%d\n",code);
printf("ps Done\n");
exit(0);
}
111
Linux启动新进程的三种方法
Linux下C程序执行shell命令并获取返回结果的方法
https://blog.csdn.net/qq_27664167/article/details/82194391
2222
linux 下远程执行命令 socket实现
服务端:
/*************************************************************************
> File Name: srv.c
> Author: zhoulin
> Mail: 715169549@163.com
> 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: 715169549@163.com
> 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 /