-
Notifications
You must be signed in to change notification settings - Fork 0
/
server.c
199 lines (178 loc) · 5.98 KB
/
server.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <fcntl.h>
#include <arpa/inet.h>
#include <time.h>
#include <pwd.h>
#include<sys/stat.h>
#include<netdb.h>
#include<stdbool.h>
#define MAXLINE 127
int init(struct sockaddr_in servaddr, char * port, int listen_sock, struct sockaddr_in cliaddr);
void red() {
printf("\033[1;31m");
}
void yellow() {
printf("\033[1;33m");
}
void purple() {
printf("\033[0;35m");
}
void green() {
printf("\033[0;32m");
}
void blue() {
printf("\033[0;34m");
}
void reset() {
printf("\033[0m");
}
int main(int argc, char * argv[]) {
struct sockaddr_in servaddr, cliaddr;
int listen_sock, accp_sock,
nbyte, nbuf;
char buf[MAXLINE + 1];
char filename[20];
int filesize = 0, filenamesize;
int total = 0, sread, fp;
int sel;
char systemarg[100];
int topcnt = 0,euid;
struct stat tmp_stat;
bool hasInfo = false;
uid_t my_uid = getuid();
if (argc != 2) {
printf("usage: %s port ", argv[0]);
exit(0);
}
// 소켓 생성
// servaddr을 ''으로 초기화
euid = geteuid();
if(euid != 0 ){
red();
puts("현재 일반 유저로 서버 프로그램을 실행하고 있습니다.");
puts("sudo 로 실행 하면 더 자세한 lshw를 볼 수 있습니다.");
reset();
}
accp_sock = init(servaddr,argv[1],listen_sock,cliaddr);
send(accp_sock, & my_uid, sizeof(my_uid), 0);
while (1) {
printf("명령어를 기다리고 있습니다.\n");
read(accp_sock, & sel, sizeof(int));
printf("got %d\n",sel);
//여기는 클라이언트에서 입력을 넘기면 그 입력 된 숫자를 받음
switch (sel) {
case 21://ps 만들어서 클라로 보내주기
sprintf(filename,"ps%ld.txt",time(NULL));
sprintf(systemarg, "ps -fa > %s",filename);
system(systemarg);
break;
case 1:
case 22: //top 만들어서 클라로 보내주기
sprintf(filename, "top%ld.txt", time(NULL));
sprintf(systemarg, "top -b -n 1 -o PID > %s", filename);
system(systemarg);
break;
case 3: //lshw 명령어 결과를 클라로 보내주기
if(hasInfo) continue;
strcpy(filename,"lshw.txt");
sprintf(systemarg,"lshw -short > %s",filename);
send(accp_sock,&euid,sizeof(euid),0);//euid를 보내서 정보를 알림
system(systemarg);
hasInfo = true;
break;
case 4:
case 5:
continue;//이건 클라 혼자서 하는 것이니 여기서는 그냥 continue 하자구?
break;
case -1:
system("rm lshw.txt");
for(int i = 0;i<topcnt;i++){
sprintf(systemarg,"rm top%d.txt",i);
system(systemarg);
}//clear exit
printf("클라이언트가 종료 요청을 보냈습니다.\n종료합니다.\n");
exit(0);//임시방편 . 소켓 닫는것좀 구현해줘
// close(accp_sock);
//accp_sock = init(servaddr,argv[1],listen_sock,cliaddr);
continue;
}
filenamesize = strlen(filename);
if ((fp = open(filename, O_RDONLY)) < 0) {
printf("open failed");
exit(0);
}
send(accp_sock, filename, sizeof(filename), 0); //파일의 이름과
fstat(fp,&tmp_stat);
filesize = tmp_stat.st_size;
printf("filename : %s filesize : %d",filename,filesize);
send(accp_sock, & filesize, sizeof(filesize), 0); //파일의 사이즈를 전송
lseek(fp, 0, SEEK_SET);
printf("file is sending now.. \n");
while (total != filesize) {
sread = read(fp, buf, 100);
total += sread;
buf[sread] = 0;
write(accp_sock, buf, sread);
printf("processing :%4.2f%%\r", total * 100 / (float) filesize);
}
printf("\n");
total = 0;
if(sel == 1){
int tokill;
recv(accp_sock,&tokill,sizeof(int),0);
if(tokill == -1){
continue;
}
sprintf(systemarg,"kill -9 %d",tokill);//pid 받아서 그걸로 ps kill함
system(systemarg);
}
if(sel != 3 && sel !=1)
read(accp_sock, & sel, sizeof(int));
//do something later
}
printf("접속을 종료합니다.\n");
return 0;
}
int init(struct sockaddr_in servaddr, char * port, int listen_sock, struct sockaddr_in cliaddr) {
int accp_sock;
char cli_ip[20];
char hostname[256];
int hostlen = 256;
struct hostent *hp;
if ((listen_sock = socket(PF_INET, SOCK_STREAM, 0)) < 0) {
perror("socket fail");
exit(0);
}
// servaddr 세팅
bzero((void *) &servaddr, sizeof(servaddr));
gethostname(hostname,hostlen);
hp = gethostbyname(hostname);
bcopy((void*) hp->h_addr,(void*) &servaddr.sin_addr,hp->h_length);
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(atoi(port));
// bind() 호출
if (bind(listen_sock, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0) {
perror("bind fail");
exit(0);
}
// 소켓을 수동 대기모드로 세팅
listen(listen_sock, 5);
puts("서버가 연결요청을 기다림..");
// 연결요청을 기다림
accp_sock = accept(listen_sock, NULL, NULL);
if (accp_sock < 0) {
perror("accept fail");
exit(0);
}
puts("클라이언트가 연결됨..");
inet_ntop(AF_INET, & cliaddr.sin_addr.s_addr, cli_ip, sizeof(cli_ip));
printf("IP : %s ", cli_ip);
printf("Port : %d \n", ntohs(cliaddr.sin_port));
return accp_sock;
}