План нмв 2004 р. Укладачі
Вид материала | Документы |
Содержание7 Список рекомендованої літератури Додаток а Додаток б Додаток в Додаток г |
- Перлина українського театру, 100.45kb.
- Конспект лекции Методика формализованного составления обзора План, 144.39kb.
- Пояснительная записка данная рабочая учебная программа составлена в соответствии, 120.81kb.
- Принят Государственной Думой 24 мая 1996 года. Одобрен Советом Федерации 5 июня 1996, 39.78kb.
- Програма дій щодо реалізації положень Болонської декларації в системі вищої освіти, 77.05kb.
- Одобрен Советом Федерации 24 сентября 2003 года Распоряжением Правительства, 2307.63kb.
- Список статей периодических изданий. Базисный план для среднего (полного) общего образования., 191.48kb.
- Краткое содержание темы, 108.84kb.
- Вестник Банка России, n 2, 14. 01. 2004; указанием Банка России от 1 июня 2004 года, 20.19kb.
- Указатель литературы, 117.65kb.
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 Контрольні запитання
- Які способи оцінювання трафіка Вам відомі?
- Яку структуру мають команди мови shell?
- Які засоби групування команд виконуються мовою shell?
- Як зреалізовується переспрямовування команд мовою shell?
- Які можливості має 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
Методично-навчальне видання
Укладачі — С. П. Главацький
І. В. Хіхловська
Редактор І. В. Ращупкіна