План нмв 2004 р. Укладачі

Вид материалаДокументы

Содержание


7 Список рекомендованої літератури
Додаток а
Додаток б
Додаток в
Додаток г
Подобный материал:
1   2   3   4   5

2.4 Мова програмування awk


Awk – це повноцінна мова опрацьовування текстової інформації, яка має синтаксис, схожий з синтаксисом мови С. Він має широке коло можливостей, деякі з них подано нижче.

У сценаріях командної оболонки awk розбиває кожний рядок на окремі поля. За умовченням поле – це послідовність символів, відокремлених один від одного прогалинами, але є можливість призначати інші символи для розділення полів. Awk аналізує та опрацьовує кожне поле окремо. Це робить його зручним інструментом для роботи зі структурованими текстовими файлами, а також з таблицями.

Всередині сценаріїв командної оболонки код awk відокремлюється “строгими” одиночними лапками та фігурними дужками:

awk '{print($3)}' $filename

# Виводить вміст третього поля з файла $filename на пристрій stdout.

awk '{print $1 $5 $6}' $filename

# Виводить вміст 1-го, 5-го, 6-го полів з файла $filename.

Для виконання даної роботи команди print мови awk буде достатньо.

У додатку Д наведено текст програми обліку трафіка.


3 Контрольні запитання

  1. Які способи оцінювання трафіка Вам відомі?
  2. Яку структуру мають команди мови shell?
  3. Які засоби групування команд виконуються мовою shell?
  4. Як зреалізовується переспрямовування команд мовою shell?
  5. Які можливості має firewall?


4 Домашнє завдання


1. Письмово відповісти на контрольні запитання.

2. Самостійно написати правила firewall (ipfw) для обліку усього вхідного та вихідного трафіку від сервера (192.168.11.15) до робочого міста бригади (192.168.11.1...39). IP-адреса робочого місця перевіряється студентом самостійно. Номери правил розподіляються залежно від комп’ютера, за яким працює студент (st1 – 5101, 5201; st2 – 5102, 5202,…).


5 Лабораторне завдання


1 За допомогою програми telnet “підімкніться” до машини під керуванням ОС сімейства UNIX (Запусканняя/Виконати/telnet 192.168.11.15).

2 Введіть ім’я та пароль (призначаються викладачем).

3 Створіть текстовий файл stat.sh, залежно від розділу 4. Вихідний текст програми розміщено в додатку Д. Для цього треба набрати:

ee stat.sh

ee — текстовий редактор

stat.sh — ім’я файлу

(для збереження натиснути Esc+Enter, потім обрати “a”).

4 Додайте до файла stat.sh право на виконання й перевірте:
  • chmod a+x stat.sh
  • ls -all

5 Створіть допоміжні бази:
  • touch tmp (створення файла)
  • echo 0 > tmp (початкове значення бази)
  • touch tmp2
  • echo 0 > tmp2

6 Запустіть написану Вами програму (для роботи з firewall слідо мати права суперкористувача, які надає викладач). Перевірка встановлених правил обліку:
  • ./stat.sh
  • ipfw show

7 Забороніть повторне запускання правил обліку. Для цього в програмі stat.sh поставте знак “#” напроти рядків запускання лічильників (/sbin/ipfw)

8 Ще кілька разів запустіть програму stat.sh

9 Перегляньте та проаналізуйте результат:
  • cat rez


6 Зміст протоколу


Протокол лабораторної роботи “Створення системи обліку трафіка ” оформлюється в робочому зошиті в послідовності, котра визначається стандартом підприємства з основ лабораторного практикуму. Протокол має містити назву лабораторної роботи та її мету; результати виконання домашнього завдання згідно з вимогами розділу 4; тексти програм stat.sh з коментарями; висновки.


7 Список рекомендованої літератури


1 Робачевский А. М. Операционная система UNIX. — СПб.: БХВ-Петербург, 2002.

2 Ивановский С. Операционная система UNIX. — М.: Познавательная книга плюс, 2000.

3 Дегтярев Е. К. Введение в UNIX. — М.: МП "Память", 1991.

4 Снейдер И. Эффективное программирование TCP/IP. СПб.: Питер, 2002.

5 sd.org.ru

6 ntern.com/computer/freebsd/

7 et.ru


ДОДАТОК А

Тексти програм serverfifo та clientfifo


Лістинг 1


serverfifo:


#include

#include

#include

#define FIFO "/fifo.1"

#define MAXBUF 80

main()

{

int readfd, n;

char buff[MAXBUF];

if(mkfifo(FIFO, 0777) < 0){

printf("Nemozhlyvo stvoryty FIFO\n");

exit(1);

}

if((readfd = open(FIFO, O_RDONLY)) < 0){

printf("Nemozhlyvo vidkryty FIFO\n");

exit(1);

}

while((n = read(readfd, buff, MAXBUF)) > 0)

if(write(1, buff, n) != n){

printf("Pomylka vyvodu\n");

exit(1);

}

close(readfd);

exit(0);

}


Лістинг 2


clientfifo:


#include

#include

#include

#define FIFO "/fifo.1"

main()

{

int writefd,n;

if((writefd = open(FIFO, O_WRONLY))<0) {

printf("Nemozhlyvo vidkryty FIFO\n");

exit(1);

}

if(write(writefd,"Dobryj denj, Svite!\n",21)!=21){

printf("Pomylka zapysu\n");

exit(1);

}

close(writefd);

if(unlink(FIFO) <0){

printf("Nemozhlyvo vyluchyty FIFO\n");

exit(1);

}

exit(0);

}


ДОДАТОК Б

Тексти програм socketserver та socketclient


Лістинг 1

socketserver:


#include

#include

#include

#define MAXBUF 256

#define FILE "echo.serv"

char buf[MAXBUF];

main()

{

struct sockaddr_un serv_addr, clnt_addr;

int sockfd;

int saddrlen, caddrlen, max_caddrlen, n;

if((sockfd = socket(AF_UNIX, SOCK_DGRAM, 0)) < 0){

printf("Nemozhlyvo stvoryty socket\n");

exit(1);

}

unlink(FILE);

bzero(&serv_addr, sizeof(serv_addr));

serv_addr.sun_family = AF_UNIX;

strcpy(serv_addr.sun_path, FILE);

saddrlen=sizeof(serv_addr.sun_family)+strlen(serv_addr.sun_path);

if(bind(sockfd, (struct sockaddr*)&serv_addr, saddrlen) < 0){

printf("Pomylka svyazuvannya socketa z adresoyu\n");

exit(1);

}

max_caddrlen = sizeof(clnt_addr);

for(;;){

caddrlen = max_caddrlen;

n = recvfrom(sockfd, buf, MAXBUF, 0, (struct sockaddr*)&clnt_addr, &caddrlen);

if(n < 0){

printf("Pomylka pryjmannya\n");

exit(1);

}

if(sendto(sockfd, buf, n, 0, (struct sockaddr*)&clnt_addr, caddrlen) !=n){

printf("Pomylka peredavannya\n");

exit(1);

}

}

}


Лістинг 2

socketclient:


#include

#include

#include

#include

#define MAXBUF 256

#define FILE "echo.serv"

#define NULL 0

char *msg = "Hello world!";

char buf[MAXBUF];

main()

{

struct sockaddr_un serv_addr, clnt_addr;

int sockfd;

int saddrlen, caddrlen, msglen, n;

bzero(&serv_addr, sizeof(serv_addr));

serv_addr.sun_family = AF_UNIX;

strcpy(serv_addr.sun_path, FILE);

saddrlen=sizeof(serv_addr.sun_family)+strlen(serv_addr.sun_path);

if((sockfd = socket(AF_UNIX, SOCK_DGRAM, 0)) < 0){

printf("Nemozhlyvo stvoryty' socket\n");

exit(1);

}

bzero(&clnt_addr, sizeof(clnt_addr));

clnt_addr.sun_family = AF_UNIX;

strcpy(clnt_addr.sun_path, FILE);

mktemp(clnt_addr.sun_path);

caddrlen=sizeof(clnt_addr.sun_family)+strlen(clnt_addr.sun_path);

if(bind(sockfd, (struct sockaddr*)&clnt_addr, caddrlen) < 0){

printf("Pomylka svyazuvannya socketa\n");

exit(1);

}

msglen = strlen(msg);

if(sendto(sockfd, msg, msglen, 0, (struct sockaddr*)&serv_addr, saddrlen) != msglen){

printf("Pomylka peredavannya povidomlennya\n");

exit(1);

}

if((n = recvfrom(sockfd, buf, MAXBUF, 0, NULL, 0)) < 0){

printf("Pomylka otrymannya povidomlennya\n");

exit(1);

}

printf("Echo: %s\n", buf);

close(sockfd);

unlink(clnt_addr.sun_path);

exit(0);

}

ДОДАТОК В

Тексти програм servertcp та clienttcp


Лістинг 1


servertcp:


#include

#include

#include

#include

#include

#include

#include

#include

/*Номер порту сервера, відомий клієнтам*/

#define PORTNUM 1500

int main(int argc, char* argv[])

{

int s, ns, pid, nport;

struct sockaddr_in serv_addr, clnt_addr;

struct hostent *hp;

char buf[80], hname[80];

/*Перетворімо порядок слідування байтів на мережний формат*/

nport = PORTNUM;

nport = htons((u_short)nport);

/*Створімо сокет, який використовує протокол ТСР*/

if((s = socket(AF_INET, SOCK_STREAM, 0)) == -1){

perror("Pomylka vyklyku socket()");

exit(1);

}

/*Задамо адресу комунікаційного вузла*/

bzero(&serv_addr, sizeof(serv_addr));

serv_addr.sin_family = AF_INET;

serv_addr.sin_addr.s_addr = INADDR_ANY;

serv_addr.sin_port = nport;

/*Зв'яжемо сокет з цією адресою*/

if(bind(s, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) == -1){

perror("Pomylka vyklyku bind()");

exit(1);

}

/*Передамо повідомлення із зазначенням адреси сервера*/

fprintf(stderr, "Server gotov: %s\n", inet_ntoa(serv_addr.sin_addr));

/*Сервер готовий приймати запити на встановлення з'єднання. Максимальна кількість запитів, які очікують на опрацювання - 5. Як правило, цієї кількості вистачає, щоби встигнути виконати ассерt(2) та породити дочірній процес*/

if(listen(s, 5) == -1){

perror("Pomylka vyklyku listen()");

exit(1);

}

/*Нескінченний цикл отримування запитів та їхнього опрацьовування*/

while(1){

int addrlen;

bzero(&clnt_addr, sizeof(clnt_addr));

addrlen = sizeof(clnt_addr);

/*Приймемо запит. Новий сокет ns стає комунікаційним вузлом створеного віртуального каналу*/

if((ns = accept(s, (struct sockaddr*) &clnt_addr, &addrlen)) ==

-1){

perror("Pomylka vyklyku accept()");

exit(1);

}

/*Виведемо інформацію про клієнта*/

fprintf(stderr, "Client = %s\n", inet_ntoa(clnt_addr.sin_addr));

if((pid = fork()) == -1){

perror("Pomylka vyklyku fork()");

exit(1);

}

if(pid == 0){

int nbytes, fout;

/*Дочірній процес: цей сокет нам не потрібен. Він використовується, як і раніше, для отримання запитів*/

close(s);

/*Отримаємо повідомлення від клієнта й повернемо його назад*/

while((nbytes = recv(ns, buf, sizeof(buf), 0)) != 0){

send(ns, buf, sizeof(buf), 0);

}

close(ns);

exit(0);

}

/*Батьківський процес: цей сокет нам не потрібен. Він використовується дочірнім процесом для обміну даними*/

close(ns);

}

}

Лістинг 2


clienttcp:


#include

#include

#include

#include

#include

#include

#include

#include

/*Номер порту, який обслуговується сервером*/

#define PORTNUM 1500


int main(int argc, char* argv[])

{

int s, pid, i, j;

struct sockaddr_in serv_addr;

struct hostent *hp;

char buf[80] = "Hello, World!\n";

/*Клієнтові як аргумент передається доменне ім'я хоста, на якому запущено сервер. Доменне ім'я транслюється у адресу*/

if((hp = gethostbyname(argv[1])) == 0)

{

perror("Pomylka vyklyku gethostbyname()");

exit(3);

}


bzero(&serv_addr, sizeof(serv_addr));

bcopy(hp->h_addr, &serv_addr.sin_addr, hp->h_length);

serv_addr.sin_family = hp->h_addrtype;

serv_addr.sin_port = htons(PORTNUM);

/*Створімо сокет*/.

if((s = socket(AF_INET, SOCK_STREAM, 0)) == -1){

perror("Pomylka vyklyku socket()");

exit(1);

}

fprintf(stderr, "Addresa clienta: %s\n", inet_ntoa(serv_addr.sin_addr));


/*Створімо віртуальний канал*/

if(connect(s, (struct sockaddr*) &serv_addr, sizeof(serv_addr)) ==

-1){

perror("Pomylka vyklyku connect()");

exit(1);

}

/*Передамо серверові повідомлення й отримаємо його назад*/

send(s, buf, sizeof(buf), 0);

if(recv(s, buf, sizeof(buf), 0) < 0){

perror("Pomylka vyklyku recv()");

exit(1);

}

/*Виведемо отримане повідомлення на екран*/

printf("Otrymano vid servera: %s\n", buf);

close(s);

printf("Client zavershyv robotu \n\n");

}

ДОДАТОК Г

Тексти програм simpletcpserv та simpletcpclient


Лістинг 1


simpletcpserv:


#include

#include

#include

#include

int main( void )

{

struct sockaddr_in local;

int s;

int s1;

int rc;

char buf[ 1 ];

local.sin_family = AF_INET;

local.sin_port = htons( 7500 );

local.sin_addr.s_addr = htonl( INADDR_ANY );

s = socket( AF_INET, SOCK_STREAM, 0 );

if ( s < 0 )

{

perror( "socket call failed" );

exit( 1 );

}

rc = bind( s, ( struct sockaddr * )&local, sizeof( local ) );

if ( rc < 0 )

{

perror( "bind call failed" );

exit( 1 );

}

rc = listen( s, 5 );

if ( rc )

{

perror( "listen call failed" );

exit( 1 );

}

s1 = accept( s, NULL, NULL );

if ( s1 < 0 )

{

perror( "accept call failed" );

exit( 1 );

}

rc = recv( s1, buf, 1, 0 );

if ( rc <= 0 )

{

perror( "recv call failed" );

exit( 1 );

}

printf( "%c\n", buf[ 0 ] );

rc = send( s1, "2", 1, 0 );

if ( rc <= 0 )

perror( "send call failed" );

exit( 0 );

}


Лістинг 2


simpletcpclient:


#include

#include

#include

#include

#include

int main( void )

{

struct sockaddr_in peer;

int s;

int rc;

char buf[ 1 ];

peer.sin_family = AF_INET;

peer.sin_port = htons( 7500 );

peer.sin_addr.s_addr = inet_addr( "127.0.0.1" );

s = socket( AF_INET, SOCK_STREAM, 0 );

if ( s < 0 )

{

perror( "socket call failed" );

exit( 1 );

}

rc = connect( s, ( struct sockaddr * )&peer, sizeof( peer ) );

if ( rc )

{

perror( "connect call failed" );

exit( 1 );

}

rc = send( s, "1", 1, 0 );

if ( rc <= 0 )

{

perror( "send call failed" );

exit( 1 );

}

rc = recv( s, buf, 1, 0 );

if ( rc <= 0 )

perror( "recv call failed" );

else

printf( "%c\n", buf[ 0 ] );

exit( 0 );

}


ДОДАТОК Д


Лістинг програми обліку трафіку


#!/bin/sh

/sbin/ipfw add 5101 count all from 192.168.11.23 to any

/sbin/ipfw add 5102 count all from any to 192.168.11.23

a=`/bin/cat tmp`

b=`/sbin/ipfw show | grep 5101 | awk '{print($2)}'`

c=`expr $a + $b` && echo "$c" > tmp

d=`/bin/cat tmp2`

e=`/sbin/ipfw show | grep 5102 | awk '{print($2)}'`

f=`expr $d + $e` && echo "$f" > tmp2

echo "Vhod = $c " "Ishod = $f" > rez


Методично-навчальне видання


Укладачі — С. П. Главацький

І. В. Хіхловська


Редактор І. В. Ращупкіна