Учебное пособие по операционным системам

123 мин на чтение (147.932 символов)

Практическая работа - установка Linux на виртуальную машину

Цель работы

Научиться основным приемам работы с виртуальной машиной. Освоить процесс установки операционной системы Linux. Познакомиться с механизмом создания образов виртуальной машины.

Основное задание

  1. Скачать дистрибутив Linux Mint;
  2. Создать гостевую машину;
  3. Запустить виртуальную машину;
  4. Установить на неё Linux;
  5. Выключить виртуальную машину;
  6. Экспортировать её в .OVA образ;
  7. На его основе создать ещё одну виртуальную машину;
  8. Поменять название второй виртуальной машины;
  9. Запустить обе;
  10. Удалить вторую виртуальную машину (вместе со всеми файлами).

Методические указания

Для успешного выполнения данной работы необходимо познакомиться с понятием виртуализации, виртуальной машины. Пример материалов по теме:

Пошаговое описание процесса создания виртуальной машины и установки Linux Mint в нее описан в предыдущей главе.

Задания для самостоятельного выполнения

  1. Создайте новую виртуальную машину с жестким диском на 50 ГБ.
  2. Установите на нее Windows, задав размер раздела 30 ГБ. Если у Вас нет дистрибутива Windows, создайте пустой раздел такого размера с файловой системой NTFS.
  3. Установите Linux mint на эту виртуальную машину, используя ручной режим разметки диска так, чтобы не стереть существующий раздел NTFS.
  4. Убедитесь что обе операционные системы загружаются и функционируют.
  5. С помощью образа виртуальной машины попробуйте перенести ваш виртуальный компьютер на другой физический компьютер. Все настроенные ОС должны сохраниться.
  6. Удалите созданные виртуальные машины.

Контрольные вопросы

  1. В чем преимущества работы в виртуальной машине?
  2. В чем недостатки работы в виртуальной машине?
  3. Для чего нужен образ виртуальной машины?
  4. Что такое установка операционной системы?
  5. Можно ли запустить две виртуальные машины одновременно?

Практическая работа - десять основных команд Linux

Цель работы

Познакомиться с основными приемами работы в командной строке Linux, основные приемы адресации файлов и освоить основные и самые распространенные команды - pwd, cd, ls, touch, rm, mkdir, cp, mv, cat, man

Основное задание

  1. Запустите виртуальную машину; познакомьтесь со справкой к изучаемым в данной работе командам. Обратите внимание на используемые ключи данных команд.
  2. Запустите текстовый терминал или программу-эмулятор терминала;
  3. Выведите на экран содержимое корневой директории файловой системы;
  4. Перейдите в свою домашнюю директорию, задав относительный путь;
  5. Выведите содержимое файла /etc/passwd;
  6. Создайте текстовый файл с именем user.txt в домашнем каталоге.
  7. Создайте директорию test в текущей.
  8. Переместите только что созданный файл в нее.
  9. Скопируйте директорию под именем test2.
  10. Удалите обе директории.

Методические указания

Для успешного выполнения работы необходимо ознакомиться со справочными материалами по командам pwd, cd, ls, touch, rm, mkdir, cp, mv, cat. Сделать это можно используя универсальную справочную команду man. Таким образом, набрав в командной строке:

1
$ man pwd

мы получим полную и актуальную справку (мануал) по команде pwd, включая все возможные ее ключи и опции. Команда man может показать мануал по любой команде bash.

Некоторые команды завершаются моментально (pwd), а другие (ping) - выполняются продолжительное время. Кроме того, некоторые команды запускают интерактивные программы (top).

Для успешной и быстрой работы в командной строке существует большое количество сочетаний клавиш. Ознакомьтесь с ними на практике и попробуйте запомнить наиболее полезные:

  • <Ctrl>+<C> - завершение текущей команды;
  • <Ctrl>+<D> - выход из текущего сеанса (разлогин);
  • <Tab> - подсказки и множественное дополнение;
  • clear, <Ctrl> + <L> - очистка экрана (перемотка вперед);
  • <↑> - переход к предыдущей команде;
  • <Ctrl> + <A> - переход к началу команды;
  • <Ctrl> + <E> - переход к концу команды;
  • <Alt> + <F>, <Alt> + <B> - переход к следующему и предыдущему слову в команде;
  • history - вывод истории команд в текущем сеансе;
  • <Ctrl> + <R> - поиск команды в истории;

В Linux, как и во многих других Unix-подобных системах принята единая система адресации файлов. Все файлы в Linux имеют имя и организуются в каталоги, образуя иерархическое дерево папок. В данном контексте, мы будем использовать понятия “каталог”, “папка” и “директория” как синонимы. Для того, чтобы идентифицировать файл, вы должны указать путь к нему, то есть порядок вложенности папок, позволяющий найти этот файл.

Все пути в Linux отсчитываются от корня файловой системы, обозначаемого прямым слешем /. Корень всегда один, не существует никаких букв дисков, как в Windows. Корень еще называют корневой папкой или директорией, так как именно в нем содержаться все другие папки.

В пути к файлу последовательно указываются папки, которые нужно пройти, чтобы найти файл, а затем - имя самого файла. Имена папок и файла разделяются прямым слешем. Так, в пути /etc/passwd первый символ / обозначает корневой каталог, etc - имя папки в корневом каталоге, passwd - имя нужного нам файла. Обратите внимание, что в Linux не принято использовать расширения в именах файлов (но, впрочем, и не запрещено, так что ими многие пользуются).

Находясь в командной строке, вы всегда находитесь в какой-то директории. По умолчанию, это домашний каталог пользователя (обычно находящийся по адресу /home/<login>). Текущий каталог можно изменить командой cd.

Путь к файлу можно задавать двумя способами - абсолютным или относительным. Абсолютный путь начинается с символа / и отсчитывается от корневого каталога. Относительный путь начинается с имени папки и отсчитывается от текущего каталога. Это сделано для удобства указания пути, чтобы не повторять одно и то же, если вы работаете в данный момент преимущественно с файлами в одной папке.

При указании путей к файлам можно пользоваться некоторыми сокращениями. Вы можете использовать два специальных имени: точку (.), означающую текущую директорию, и пару точек (..), означающую родительскую директорию текущей директории. Также вы можете использовать символ тильды (~), который означает вашу домашнюю директорию, и сочетание ~username, означающее домашнюю директорию пользователя с именем username.

Помните, что нужно четко представлять себе, где лежит тот или иной файл для того, чтобы с ним работать. Часто /etc/passwd и etc/passwd - это два совершенно разных файла в разных местах.

Контрольные вопросы

  1. Как происходит авторизация пользователя в текстовом режиме?
  2. Как посмотреть рабочую директорию?
  3. Как посмотреть содержимое текущей директории?
  4. Чем отличается абсолютный и относительные пути к директориям?
  5. Как перейти в другую директорию в командной строке?
  6. Какие основные стандартные каталоги существуют в Linux?

Задания для самостоятельного выполнения

  1. Выяснить, какой каталог является текущим (см. man pwd).
  2. Выяснить, в каком терминале выполняется текущий сеанс.
  3. Перейдите в директорию /var;
  4. С помощью команды узнайте, в какой директории находимся;
  5. Прочитайте мануал по команде ls (только основное положение и про флаги -l, -t, -r, -A);
  6. Отобразите список директорий и файлов;
  7. Перейдите в директорию /var/log (без упоминания “var” в команде);
  8. Перейдите в директорию /var (снова без упоминания “var”);
  9. Создайте директорию ~/tmp/lesson/;
  10. Перейдите туда, задав абсолютный путь;
  11. Создайте текстовый файл txt_file с произвольным содержимым;
  12. Удалите созданную папку lesson;
  13. Сохраните подробное описание полного содержимого домашней директории (по команде ls -la) в файл home.dir.
  14. (*) Определить границы файлового пространства, где система позволяет создавать собственные файлы и каталоги (возможно использование автоматического скрипта).
  15. (*) Проверить, возможно ли вмешательство в личное файловое пространство другого пользователя? Пользователя root?

Практическая работа - служебные команды терминала

Цель работы

Научиться основным навыкам работы в многопользовательском режиме, переключению между терминалами и самым базовым командам - tty, who, whoami, sudo, su, less, who, exit, shutdown, grep.

Основное задание

  1. Откройте первый виртуальный терминал и залогиньтесь.
  2. Выполните команду tty.
  3. Выполните команду pwd.
  4. Повторите предыдущие пункты для второго и третьего виртуального терминала.
  5. Откройте эмулятор терминала в графическом режиме и введите команду tty.
  6. Выполните команду who. Посмотрите в справке, что она показывает.
  7. Выполните команду whoami. Прочитайте справку про нее.
  8. Перейдите в первый виртуальный терминал и разлогиньтесь.
  9. Вернитесь в графическое окружение и еще раз просмотрите вывод команды who. Объясните ее результат.
  10. Откройте файл /etc/passwd при помощи программы-пейджера.
  11. Найдите в этом файле запись о вашем текущем пользователе при помощи команды grep.
  12. Изучите команду man и прочитайте справку по всем командам, использованным в данной лабораторной.

Методические указания

Операционная система Linux, как и ее предшественник - UNIX изначально создавалась для многопользовательской работы. Для организации многопользовательской работы при загрузки системы создается семь виртуальных устройств (это число может меняться в зависимости от дистрибутива, но семь - это стандартное количество). Раньше предполагалось, что за ними будут работать из разных мест при помощи оконечных устройств (терминалов или тонких клиентов), но сейчас это уже не очень актуально. Обычно на последнем, седьмом терминале запускается графическая оболочка, если она установлена в данном дистрибутиве.

Для того, чтобы узнать, номер текущего терминала, можно использовать команду tty (см. man tty). Команда очень проста и не требует параметров. Пример работы tty:

1
2
$ tty  
/dev/tty1

Чтобы узнать, какие пользователи в каких терминалах залогинены в системе, можно использовать команду who:

1
2
3
4
$ who 
root tty1 Feb 17 17:11 
user tty2 Feb 17 17:12 
user tty5 Feb 17 17:40

Иногда возникает необходимость выполнить некоторые действия от имени другого пользователя (например, от имени root). Это можно сделать, открыв новый терминальный сеанс, но можно и иначе, в текущем сеансе. Для этого используется команда su. Эта команда по умолчанию (без параметров) открывает сеанс суперпользователя, выполняющийся внутри сеанса непривилегированного пользователя. Пример выполнения команды su:

1
2
3
$ su 
Password: 
[root@localhost user]#

Еще один пример, с явным указанием имени пользователя:

1
2
3
$ su stud 
Password:  
[stud@localhost ~]$

Для окончания пользовательского сеанса, запущенного командой su, или выхода из терминала, используется команда exit или комбинация клавиш Ctrl+D. В любом случае система закроет сеанс и отобразит строку приглашения.

Очень часто при работе с командной строкой приходится просматривать довольно длинные файлы. Для того, чтобы можно было перемещаться по файлу, содержимое которого не помещается на одном экране были созданы специальные программы-пейджеры. Это не текстовый редактор, а только средство просмотра. Самый стандартный на сегодня - программа less. Ей можно передать имя файла таким образом:

1
$ less filename

Познакомьтесь с ней, прочитав интерактивную справку. Для того, чтобы закрыть ее необходимо нажать кнопку q.

Также часто приходится искать определенную строку в файле или в выводе других команд. Для этого используют утилиту grep. Ей передаётся два параметра - строка поиска и имя файла вот так:

1
grep koroteev /etc/passwd

Дополнительная информация об указанных командах доступна в справочном руководстве формата man или info.

Еще одно важное замечание. При работе с эмулятором терминала в графическом режиме, копирование и вставка работают с комбинациями клавиш Ctrl + Shift+C и Ctrl + Shift+V. Это потому, что комбинацией клавиш Ctrl + C аварийно завершается (прерывается) выполнение текущей команды.

Контрольные вопросы

  1. Какой каталог будет установлен текущим сразу же после входа пользователя в систему?
  2. Какой каталог будет установлен текущим после выполнения команды su?
  3. Какой терминал (tty) будет открыт по нажатию Ctrl+F7?
  4. Как и где в Linux можно вводить команды командной строки?

Задания для самостоятельного выполнения

  1. Подключитесь к данной машине через ssh и введите команду who. Объясните, что значит ее результат.
  2. Загрузить систему в текстовом режиме и войти с собственной учетной записью
  3. Ознакомиться со справкой по команде shutdown;
  4. С её помощью перезагрузить виртуальную машину;
  5. С её помощью выключить виртуальную машину;
  6. Запустить отложенное выключение виртуальной машины на 2 минуты.

Практическая работа - работа с файлами в Linux

Цель работы

Ознакомиться со структурой файловой системы Линукс, типами файлов и командами управления файловой системой.

Основное задание

  1. В домашнем каталоге создать подкаталоги src, dst и temp;
  2. В каталоге temp создать файлы user.txt, root. txt и stud.txt произвольного содержания;
  3. В каталог src скопировать файлы user.txt, root. txt и stud.txt, различного содержания;
  4. В каталоге dst создать «жесткие» ссылки на все файлы из каталога src;
  5. В домашнем каталоге создать «мягкие» ссылки на файлы из каталога src;
  6. Вывести рекурсивно расширенную информацию о содержимом домашнего каталога. Обратить внимание на поле размера для физических файлов и ссылок;
  7. Из домашнего каталога выполнить команды:
1
2
3
cat src/user.txt
cat dst/user.txt
cat user.txt
  1. Заархивируйте содержимое папки src/ в архив .tar.gz.
  2. Распакуйте этот архив в директорию ~/backup
  3. Выведите названия всех файлов домашней директории, имеющих в названии .txt (подсказка: используйте команду find);
  4. Удалите файл user.txt. Что произошло со ссылками на него?
  5. Удалите каталог dst;
  6. Переместите каталог temp в src;
  7. Рекурсивно удалите каталог src

Методические указания

Организация файловой системы

Файловая система ОС Линукс (как и прочих unix-подобных систем) устроена так, что все ресурсы представлены единообразно, в виде файлов. Такой подход позволяет обеспечить универсальный интерфейс доступа к любым ресурсам: от физических устройств, до процессов, выполняющихся в системе. С точки зрения пользователя файловая система представляет логическую структуру каталогов и файлов. С другой стороны, невидимой пользователю, внутреннее устройство файловой системы реализует физические операции чтения/записи файлов на различные носители, алгоритмы доступа и многое другое.

Типы файлов

Для обеспечения единообразного доступа к файлам их прежде всего необходимо классифицировать. В Линукс это сделано следующим образом:

  • обычные (regular) файлы - текстовые, исполняемые, графические и пр. файлы, создаваемые пользователями и прикладными программами;
  • каталоги (directories) - именованные группы файлов и вложенных каталогов (т.е. содержимое каталога - файлы и другие каталоги);
  • файлы устройств (devices) - соответствуют присутствующим в системе реальным (жесткие диски, принтеры, мыши, ЦП и т.д.) устройствам и т. н. псевдоустройствам (например, /dev/null). Файлы устройств представляют символьные (последовательного доступа) и блочные (произвольного доступа) устройства. К первыми относятся, например, параллельные и последовательные порты, ко вторым - жесткие диски;
  • специальные файлы - сокеты (sockets) и именованные каналы (named pipes), которые предназначены для обмена информацией между процессами;
  • символьные ссылки (symlinks) - именованные указатели на физические файлы (аналог ярлыков ОС Windows), содержащие только путь к некоторому файлу. Символьные ссылки могут указывать на файлы, хранящиеся как локальных, так и в сетевых каталогах.
  • Символьные ссылки (или “мягкие”) не нужно путать с “жесткими”, которые указывают на inode файла. Inode (идентификатор узла) - это уникальный числовой идентификатор узла (файла или каталога) файловой системы, по которому и осуществляется доступ к нему. Символьное имя файла (включая полный путь) ориентировано на пользовательское восприятие. Для человека-оператора проще запомнить осмысленные имена файлов (например: report.txt, myfoto.jpg и т.п.), чем абстрактные числовые значения. Прочие отличия “жестких” и “мягких” ссылок вам предстоит выяснить в ходе выполнения этой лабораторной работы.
Каталоги Линукс

Все файлы упорядочены по каталогам. Структура и назначение каждого из каталогов, созданных на этапе установке предопределены, хотя и могут быть (что не стоит делать без крайней необходимости) изменены суперпользователем.

Файловая система имеет иерархическую структуру и начинается от корневого каталога (/). Его подкаталогами являются:

  • /bin - исполняемые файлы общего назначения;
  • /boot - содержит образ загружаемого ядра;
  • /dev - файлы устройств;
  • /etc - конфигурационные файлы общего пользования;
  • /home - домашние каталоги пользователей, включая программы и файлы личных предпочтений;
  • /lib - общесистемные библиотеки;
  • /mnt - каталог монтирования внешних файловых систем;
  • /proc - виртуальная файловая система для чтения информации о процессах;
  • /root - домашний каталог суперпользователя;
  • /sbin - программы системного администрирования;
  • /tmp - каталог для хранения временной информации;
  • /usr - каталог пользовательских прикладных программ со всеми их исполнимыми и конфигурационными файлами. Например, в подкаталог /usr/local инсталлируются программы, не входящие в дистрибутив Линукс, или собираемые из исходных текстов.
  • /var - каталог для хранения часто изменяющихся файлов. Например, спулера печати, различных лог-файлов, почтовых сообщений и т.п.
  • /lost+found - каталог для нарушенных фрагментов файлов, обнаруженных в результате проверки файловой системы после сбоя.

Такая структура типична для большинства дистрибутивов Линукс, но могут иметься и дополнительные каталоги. Например, /opt - для дополнительных компонентов, /selinux - расширение системы безопасности и т.п.

Именование файлов и каталогов

Файловая система Линукс поддерживает “длинные” имена, содержащие символы латиницы, национальных алфавитов, знаки пунктуации и спецсимволы. Абсолютно запрещенными к использованию в имени являются прямой и обратный слэши (/ и ). Максимальное количество символов в имени - 255. Понятие “расширения файла” в unix-системах отсутствует как таковое, поэтому в имени может быть несколько частей, разделенных точками. Все имена - регистрозависимые.

Приведенные выше правила справедливы и для каталогов.

Файлы и каталоги, названия которых начинаются с точки (т.н. dot-файлы), являются аналогами “скрытых” файлов Windows. То есть по умолчанию они не отображаются при просмотре содержимого файловой системы.

Для быстрого доступа к файлам в оболочке имеются несколько переменных окружения, хранящих соответствующие пути. Это, например, переменная $HOME, в которой содержится пути к домашнему каталогу текущего пользователя. Т.е. действия команд

1
$ cd /home/usr1

и

1
$ cd $HOME

приведут к одному результату - переходу в домашний каталог пользователя usr1. Более того, в оболочке определен псевдоним для домашнего каталога - символ ~ (тильда) можно использовать аналогично $HOME. Например:

1
2
3
$ cd ~ 
$ pwd 
/home/usr1 

Некоторые другие возможности оболочки будут рассмотрены в следующих лабораторных работах. Дополнительная информация доступна в справочном руководстве bash (man bash).

Команды управления файловой системой

Для управления файловой системой имеются различные команды, реализующие операции по созданию, чтению, копированию, переименованию/перемещению, изменению и удалению файлов и каталогов. Как правило, это специализированные команды, хорошо выполняющие свою задачу, однако некоторые функции могут частично дублироваться другими командами, что только добавляет гибкости управлению файлами.

Основными командами для выполнения файловых операций являются: pwd, ls, cp, mv, dir, rm, cd, rmdir, mkdir, ln. Информацию о их назначении и параметрах доступна в формате man и info.

Несколько слов о способах создания файлов в Линукс:

  • во-первых, файлы могут быть созданы как результаты работы прикладных программ и иметь определенный формат (например, графические файлы, созданные редактором GIMP);
  • во-вторых, файлы могут быть созданы пользователем путем ввода информации с клавиатуры, например так:
1
2
3
$ cat > f1 
Hello, world! // нажатие Ctrl+D завершает ввод команд 
aag@stilo:~> 
  • в-третьих, файлы могут быть созданы путем перенаправления вывода команды со стандартного потока, например так:
1
# echo "Hello, World!" > f1 

В первом и втором случаях символ “>” - это команда перенаправления стандартных потоков ввода/вывода, встроенная в оболочку. В первом случае она получает информацию со стандартного потока ввода (клавиатура) и, по окончании ввода (Ctrl+D), отправляет ее в файл. Во втором - принимает строку, переданную командой echo и также отправляет ее в файл. Если файл отсутствует, то он будет создан, если имеется, то будет перезаписан. Для добавления информации в файл следует использовать команду “»”. Больше информации о командах перенаправления можно получить в справке о возможностях оболочки.

Контрольные вопросы

  1. Чем отличаются жесткие и символические ссылки?
  2. Что произойдет с жесткой ссылкой, если удалить исходный файл? А с символической?
  3. Совпадает ли размер символьных и жестких ссылок?
  4. Пусть в системе имеется каталог “~/test”. Что произойдет при попытке выполнить следующую команду: “cp ~/test ~/test/newdir”?
  5. Какие основные форматы архивов принято использовать в Linux? Какими командами можно пользоваться для создания / открытия этих архивов?

Задания для самостоятельного выполнения

  1. Настройте автоматическую инкрементальную архивацию домашнего каталога. Для этого создайте команду архивирования всех файлов, измененных за последние сутки и добавьте ее на автоматическое выполнение при помощи службы cron.
  2. Измените программу из предыдущего пункта так, чтобы пользователь мог опциями изменять настройки программы:
    1. Задавать папку, откуда происходит копирование;
    2. Задавать расположение архивов;
    3. Задавать частоту архивации;
    4. Исключать определенные типы файлов;
    5. (*) Передавать список папок и типов файлов, которые включаются в общий архив.

Практическая работа - удаленная работа с Linux через SSH

Цель работы

Продемонстрировать умение работать с командной строкой Linux с удаленной машиной по протоколу SSH.

Основное задание

  1. Убедитесь, что на виртуальной машине установлен и запущен SSH-сервер.
  2. В программе Putty (или любом другом SSH-клиенте), запущенной на хост-машине подключаемся по SSH на нужный IP к виртуальной машине и далее работаем с системой только через SSH
  3. Отображаем содержимое /etc/apt/sources.list, используя команду cat
  4. С её же помощью и символа “>” создаем файл в домашней директории пользователя.
  5. Отображаем список процессов.
  6. Запускаем мониторинг ресурсов системы.
  7. Обновляем кэш менеджера пакетов apt-get.
  8. Установите удаленно какой-либо пакет из репозитория на ваш выбор.
  9. Выполните копирование файла по протоколу SSH с одного компьютера на другой.
  10. Перезагрузить удаленный сервер через SSH.

Методические указания

ssh-agent

При работе с ключами возможны две неудобные ситуации:

  1. Если при созданиия ключа вы указали passphrase (пароль для ключа), то вам придется вводить пароль при каждом подключении.
  2. Если у вас есть несколько ключей для разных целей, то при соединении по ssh придется указывать нужный ключ вручную

ssh-agent решает эти проблемы. Этот агент аутентификации (authentication agent) работает на фоне в *nix-системах. В зависимости от системы, вам, возможно, придется установить и настроить его автозапуск самостоятельно.

Если добавить ключ к агенту, то:

  1. для него больше не будет спрашиваться passphrase
  2. не нужно будет вводить ключ вручную — он будет автоматически использован при соответствующем подключении

ssh-add /home/demo/.ssh/id_rsa добавит ключ id_rsa в запущенный в системе агент. Если у него есть passphrase, то агент попросит ввести его.

Если запустить ssh-add без аргументов, то будут добавлены ключи ~/.ssh/id_rsa, ~/.ssh/id_dsa, ~/.ssh/id_ecdsa, ~/.ssh/id_ed25519 и ~/.ssh/identity.

Список добавленных в агент ключей можно посмотреть командой ssh-add -L:

1
2
3
$ ssh-add -L
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC91r/+5WEQHcxVMrxpP9jKuONjlrnEHshfG3v/ab2NKDSljdskODOIsdhaaoDoiSADhAaoDISHasoiDiASisjadOHISDdKJDASHSidshIHDSIHDIAsdjasAs7XG/drBhi16zQ2e8VcLD7bVQS1Cpo0O1tP+93YQBvcIE02RltqVKYo7BlgCaJzpdowK8fHSzpfCYsEFjdjosOjfdsjdjkAJOKkKKHJHhaIiAiaihsiIoqkpqdmlnvnuuUSCaAS8aDhajiadiiAahhakKAKDHAKurmD08jnX9HfH/d15pLK/Glo1Su6iEOU3bW8k92QlY54pPFLKiNRPFuUryE5md7T /Users/demo/.ssh/some_key.pem
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAsLC9WpSZ/9YpQ2z1FTSsORcP+ohzCdVjYaoc3C0fRnUbkp4SnvMHFTHNFFod0FhV0cQcOLvBsZAK/0tUPIXeDDFvYD70r5i0AsQbqA0k7gK3b3MP7tmnPxMHd607TI+1FMO54Yig0vnpZOgKmgCsxWq6tckwyLB91BlPiGxLBZiu5yPDIguEQCSnAwkF0vjqrNGsoHB4+fkj0USfjiifsjihf39hifSIHiJFHSijshfj39jfsjisfiisfiissr893IFsifijfsjSOIiAShadfhssU0q0JpjaDEWcMmYXmuz3xSnbhkueGLBXMU2zXDFDWCDSHq9/oRr29UAfVaHAMw== /Users/demo/.ssh/id_rsa

ssh-agent привязан к сессии. Поэтому, например, если перезагрузить компьютер, то ключи нужно будет добавлять в агент заново.

Форвардинг (проброс) ключей

Если вы подключились к удаленному серверу X, и с него хотите подключиться к другому серверу Y, например, чтобы сделать git pull с GitHub’а, то придется держать копию ваших ключей на сервере X.

Утилита ssh с флагом -A позволяет «пробросить» ключи с подключаемой машины в удаленную:

1
$ ssh -A ivan@52.307.149.244

Ключи, добавленные к агенту аутентификации (ssh-agent) станут доступными на удаленном сервере. При этом файлы-ключи физически не будут находиться на сервере.

Контрольные вопросы

  1. Для чего нужен протокол SSH?
  2. Почему этот протокол называют защищенным?
  3. Какая информация нужна для того, чтобы подключиться к удаленной машине?
  4. Из чего состоит пара ключей?
  5. Каковы рекомендуемые действия по безопасному использованию SSH?
  6. Как установить и настроить пакета OpenSSH в Linux и Windows?

Задания для самостоятельного выполнения

  1. Выполните настройку Вашего и виртуального компьютеров так, чтобы возможно было входить с одного на другой по открытому ключу, без явного запроса пароля, по протоколу SSH.
  2. Создайте файл в домашней директории локальной машины. Скопируйте его на удаленную машину при помощи утилиты scp. Удалите исходный файл. Скопируйте файл обратно.
  3. Измените порт по умолчанию на удаленной машине для сервера SSH. Перезапустите сервер. Проверьте корректность подключения.
  4. Сохраните свое подключение на локальной машине при помощи конфигурационного файла. Проверьте работоспособность подключения по имени.
  5. (*) Проанализировать сравнительную скорость ssh-соединения, выполнив следующие замеры:
    1. Выполнить передачу файла через FTP с помощью утилиты wget. Проанализировать проходящие пакеты с помощью утилиты tcpdump(-ХХ). Запомнить скорость передачи.
    2. Выполнить передачу через ssh. Проанализировать проходящие пакеты с помощью утилиты tcpdump(-ХХ). Запомнить скорость передачи. Сравнить передаваемые пакеты и скорости передачи данных.
    3. Включить сжатие ssh и повторить замер скорости. В каждом тесте анализировать результаты для файла состоящего из нулей и для файла состоящего из случайных последовательностей (dd if= /dev/urandom of=file ds=1M count=10), для текстового конфигурационного файла или бинарного файла.

Практическая работа - основы работы с программой tmux

Цель работы

Освоить основные приемы работы с программой tmux при удаленной работе с машиной по протоколу ssh.

Задания для выполнения

  1. Начните рабочую сессию.
  2. При необходимости установите программу tmux.
  3. Запустите программу tmux.
  4. Создайте новое окно. Назовите его window1.
  5. Запустите в первом окне программу htop. Назовите его htop.
  6. Второе окно разделите вертикально.
  7. Разделите одну из этих панелей горизонтально.
  8. Выйдите из одного из сеансов для того, чтобы закрыть соответствующую панель.
  9. Выйдите из tmux.
  10. Запустите tmux, указав имя новой сессии.
  11. Запустите htop.
  12. Отсоединитесь от сессии.
  13. Убедитесь, что процесс htop еще запущен.
  14. Выйдите из сессии.
  15. Начните сессию заново.
  16. Выведите список активных сессий.
  17. Подключитесь к той же сессии.

Контрольные вопросы

  1. Для чего применяется программа tmux?
  2. Будет ли выполняться процесс, запущенный в сеансе удаленного доступа после разъединения?

Задания для самостоятельного выполнения

  1. Создайте новую сессию tmux. Используйте ее для совместной работы нескольких пользователей на одной и той же удаленной машине.

Практическая работа - управление учетными записями

Цель работы

Научиться основным действиям и командам, связанным с управлением пользователями Linux - добавление, удаление пользователя, изменение пароля, добавление в группу. Основные изучаемые команды - adduser, passwd, su, sudo.

Основное задание

  1. Ознакомиться с содержимым файлов:
1
2
3
/etc/passwd
/etc/shadow
/etc/group
  1. Создать следующие группы:
1
2
3
workers
teachers
students
  1. Создать пользователей user_N, где N =1, 2, .., 5, uid учетной записи должен быть равен 2000+N.
  2. Пользователей с N равным 1 и 2 добавить в группу workers вручную внеся изменения в конфигурационный файл.
  3. Пользователей с N равным 3, 4 и 5 добавить в группу students при помощи команд администрирования.
  4. Создать пользователя student. В комментарии к учетной записи должны быть Ваше имя и фамилия. uid учетной записи должен быть равен 3000. Пользователя добавить в группу students.
  5. Для всех пользователей задайте пароли, используя команду passwd.
  6. Создать директорию labs в корневом каталоге. В нем создать каталоги library и tests
  7. Создать файлы book_[фамилия студента]_N и поместить их в library
  8. Создать текстовый файл test_[имя студента], и поместить в tests. Файлы должны содержать скрипт на создание пользователя user[номер варианта] и задание ему пароля pass[номер варианта]. Сделайте эти файлы исполняемыми для пользователей группы students.
  9. В директории labs создать файл list, который должен содержать список файлов директории /etc.
  10. Дать право на изменение файла только пользователю teacher, а на чтение пользователям группы workers.
  11. Настроить права доступа к каталогу library и tests, таким образом, чтобы пользователи группы teachers могли изменять и создавать там файлы, а пользователи группы students имели доступ на чтение

Методические указания

Linux, как и любая unix-подобная система, является не только многозадачной, но и многопользовательской, т.е. эта операционная система позволяет одновременно нескольким пользователям работать с ней. Но система должна как-то узнавать, какой или какие из пользователей работают в данный момент. Именно для этих целей в Linux существует два понятия – учетные записи и аутентификация, которые являются частями одного механизма.

Учетная запись пользователя – это необходимая для системы информация о пользователе, хранящаяся в специальных файлах. Информация используется Linux для аутентификации пользователя и назначения ему прав доступа.

Аутентификация – системная процедура, позволяющая Linux определить, какой именно пользователь осуществляет вход.

Вся информация о пользователе обычно хранится в файлах /etc/passwd и /etc/group.

/etc/passwd – этот файл содержит информацию о пользователях. Запись для каждого пользователя занимает одну строку:

  • имя пользователя – имя, используемое пользователем на все приглашения типа login при аутентификации в системе.
  • зашифрованный пароль – обычно хешированный по необратимому алгоритму MD5 пароль пользователя или символ ‘!’, в случаях, когда интерактивный вход пользователя в систему запрещен.
  • UID – числовой идентификатор пользователя. Система использует его для распределения прав файлам и процессам.
  • GID – числовой идентификатор группы. Имена групп расположены в файле /etc/group. Система использует его для распределения прав файлам и процессам.
  • Настоящее имя пользователя – используется в административных целях, а также командами типа finger (получение информации о пользователе через сеть).
  • Домашний каталог – полный путь к домашнему каталогу пользователя.
  • Оболочка – командная оболочка, которую использует пользователь при сеансе. Для нормальной работы она должна быть указана в файле регистрации оболочек /etc/shells.

/etc/group – этот файл содержит информацию о группах, к которым принадлежат пользователи:

  • Имя группы – имя, применяемое для удобства использования таких программ, как newgrp .
  • Шифрованный пароль – используется при смене группы командой newgrp. Пароль для групп может отсутствовать.
  • GID – числовой идентификатор группы. Система использует его для распределения прав файлам и процессам.
  • Пользователи, включенные в несколько групп – В этом поле через запятую отображаются те пользователи, у которых по умолчанию (в файле /etc/passwd ) назначена другая группа.

На сегодняшний день хранение паролей в файлах passwd и group считается ненадежным.

В новых версиях Linux применяются так называемые теневые файлы паролей – shadow и gshаdow. Права на них назначены таким образом, что даже чтение этих файлов без прав суперпользователя невозможно. Нужно учесть, что нормальное функционирование системы при использовании теневых файлов подразумевает одновременно и наличие файлов passwd и group. При использовании теневых паролей в /etc/passwd и /etc/group вместо самого пароля устанавливается символ ‘x’, что и является указанием на хранение пароля в /etc/shadow или /etc/gshadow.

Файл shadow хранит защищенную информацию о пользователях, а также обеспечивает механизмы устаревания паролей и учетных записей. Вот структура файла shadow :

  • имя пользователя ;
  • шифрованный пароль – применяются алгоритмы хеширования, как правило MD5 или символ ‘!’, в случаях, когда интерактивный вход пользователя в систему запрещен;
  • число дней с последнего изменения пароля, начиная с 1 января 1970 года;
  • число дней, перед тем как пароль может быть изменен;
  • число дней, после которых пароль должен быть изменен;
  • число дней, за сколько пользователя начнут предупреждать, что пароль устаревает;
  • число дней, после устаревания пар

В Linux, кроме обычных пользователей, существует один (и только один) пользователь с неограниченными правами. Идентификаторы UID и GID такого пользователя всегда 0 . Его имя, как правило, root, однако оно может быть изменено (или создано несколько символьных имен с одинаковым GID и UID), так как значение для применения неограниченных прав доступа имеет только GID 0 . Для пользователя root права доступа к файлам и процессам не проверяются системой. При работе с использованием учетной записи root необходимо быть предельно осторожным, т.к. всегда существует возможность уничтожить систему.

В Linux используется развитая система распределения прав пользователям. Но для точного опознания пользователя одного имени недостаточно с точки зрения безопасности. Именно поэтому используется и пароль – произвольный набор символов произвольной длины, обычно ограниченной лишь используемыми методами шифрования.

Сегодня в большинстве версий Linux пароли шифруются по алгоритмам 3DES и MD5 (устарело, теперь SHA512). Когда алгоритм 3DES является обратимым, то есть такой пароль можно расшифровать, MD5 – это необратимое преобразование. Пароли, зашифрованные по алгоритму 3DES не применяются при использовании теневых файлов для хранения паролей.

При аутентификации, пароль, введенный пользователем, шифруется тем же методом, что и исходный, а потом сравниваются уже зашифрованные копии. Если они одинаковые, то аутентификация считается успешной.

Учитывая ежедневно увеличивающиеся требования к безопасности, в Linux есть возможность использовать скрытые пароли. Файлы /etc/passwd и /etc/group доступны для чтения всем пользователям, что является довольно большой брешью в безопасности системы. Именно поэтому в современных версиях Linux предпочтительнее использовать скрытые пароли. Такие пароли располагаются в файлах /etc/shadow и /etc/gshadow, для паролей пользователей и групп соответственно.

Команда login запускает сеанс интерактивной работы в системе. Она проверяет правильность ввода имени и пароля пользователя, меняет каталог на домашний, выстраивает окружение и запускает командный интерпретатор. Команду login как правило не запускают из командной строки — это обычно за пользователя делают менеджеры консоли — например getty или mgetty.

Команда su (switch user) позволяет сменить идентификатор пользователя уже в процессе сеанса. Синтаксис ее прост: su username, где username – имя пользователя, которое будет использоваться. После этого программа запросит пароль. При правильно введенном пароле, su запустит новый командный интерпретатор с правами пользователя, указанного su и присвоит сеансу его идентификаторы. Если имя пользователя опущено, то команда su использует имя root.

1
2
3
su root 
	Password: 
#_ 

При использовании команды su пользователем root она, как правило, не запрашивает пароль.

Команда newgrp аналогична по своим возможностям su с той разницей, что происходит смена группы. Пользователь должен быть включен в группу, которая указывается в командной строке newgrp . При использовании команды newgrp пользователем root она никогда не запрашивает пароль. Синтаксис команды аналогичен синтаксису команды su: newgrp groupname, где groupname – имя группы, на которую пользователь меняет текущую.

Команда passwd является инструментом для смены пароля в Linux. Для смены своего пароля достаточно набрать в командной строке passwd:

1
2
3
4
5
6
7
passwd 
	Changing password for student 
	(current) UNIX password: 
	New password: 
	Retype new password: 
	passwd: all authentication tokens updated successfully 
$_ 

Для смены пароля группы и управления группой используется команда gpasswd Для смены пароля достаточно набрать в командной строке gpasswd GROUPNAME . Сменить пароль вам удастся только если Вы являетесь администратором группы. Если пароль не пустой,то для членов группы вызов newgrp пароля не требует, а не члены группы должны ввести пароль. Администратор группы может добавлять и удалять пользователей с помощью параметров -a и -d соответственно. Администраторы могут использовать параметр -r для удаления пароля группы. Если пароль не задан, то только члены группы с помощью команды newgrp могут войти в группу. Указав параметр - R можно запретить доступ в группу по паролю с помощью команды newgrp (однако на членов группы это не распространяется). Системный администратор ( root ) может использовать параметр -A, чтобы назначить группе администратора.

Команда change управляет информацией об устаревании пароля и учетной записи. Обычный пользователь (не root ) может использовать команду только для просмотра своих параметров устаревания пароля:

1
2
3
4
5
6
7
8
change -l gserg 
	Last password change : Май 03, 2007 
	Password expires : never 
	Password inactive : never 
	Account expires : never 
	Minimum number of days between password change : 0 
	Maximum number of days between password change : 99999 
	Number of days of warning before password expires : 7 

Суперпользователь же может использовать также иные параметры, такие как:

  • -d дата (в формате системной даты, например ДД.ММ.ГГГГ) – устанавливает дату последней смены пароля пользователем.
  • -E дата – установить дату устаревания учетной записи пользователя
  • -I N – установить количество дней неактивности N с момента устаревания пароля перед тем как учетная запись будет заблокирована
  • -m N – задает минимальное количество дней (N) между сменами пароля
  • -M N – задает максимальное количество дней (N) между сменами пароля
  • -W N – задает количество дней, за которые будет выдаваться предупреждение об устаревании пароля.

Задания для самостоятельного выполнения

  1. Определить значение umask, при котором создаваемые файлы будут доступны для исполнения всем.
  2. Создать в домашнем каталоге подкаталог tmp, в котором сможет создавать, удалять и переименовывать файлы любой пользователь, входящий в группу student, но при этом его содержимое не должно быть видимым никому кроме владельца. Проверить правильность настроек доступа.
  3. Создать в домашнем каталоге папку shared, в которой могут создавать файлы любые пользователи, но удалять файлы могут только те, кто их создал. Проверить правильность настроек доступа.

Контрольные вопросы

  1. Какие основные файлы хранят информацию о зарегистрированных в системе пользователях?
  2. Как добавить пользователя в систему?
  3. Зачем операционная система отслеживает дату назначения пароля пользователю?
  4. Для чего служит пароль группы?
  5. Каково назначения файла /etc/shadow?
  6. Как поменять пароль пользователю? Кто может это сделать?
  7. Почему возникает необходимость выполнить команду от имени другого пользователя?

Практическая работа - управление правами доступа

Цель работы

Получить навыки по управлению правами доступа к файловым ресурсам системы, освоить основные команды - chmod, chown, chgrp.

Основное задание

  1. Войти в систему с собственной учетной записью
  2. Создать в домашнем каталоге 2-3 файла произвольного содержания (имена файлов - u1, u2, u3).
  3. Получить развернутый список файлов домашнего каталога и сохранить его в файле listing1
  4. Просмотреть файл listing1, обратив внимание на поля прав доступа, владельца и группы
  5. Повторить п. 2 от имени пользователя root в новом сеансе или по команде su (имена файлов - r1, r2, r3). Завершить сеанс root
  6. Повторить п.3, результат дописать в файл listing1
  7. Открыть файл listing1 и сравнить права доступа для файлов, созданных от вашего имени и от имени суперпользователя
  8. Изменить содержимое файлов, созданных вами и суперпользователем. Сохранить изменения
  9. Открыть сеанс root
  10. Перейти в каталог /home/ваша_учетная_запись
  11. Изменить права доступа к файлам u1 и r1 следующим образом:
    • u1: запретить запись для владельца и группы
    • r1: разрешить запись для всех
  12. Переключиться в сеанс пользователя и изменить содержимое файлов u1 и r1. Сохранить изменения
  13. Перейти в сеанс root и изменить владельца файлов u1 и u2 на root, а группу - на stud
  14. Из tty1 попробовать изменить файл u2
  15. Из tty2 создать каталоги /home/shared, home/shared/pub, /home/shared/upload, /home/shared/temp. Установить на них следующие права:
каталог владелец группа права
pub root users 775
upload nobody users 130
temp stud users 777
  1. Выполнить копирование, чтение, удаление файлов u1, u2, u3, r1, r2, r3 в каталоги, созданные в п. 15 из сеансов root, stud и вашего. Сравнить и проанализировать результаты.

Методические указания

Выполняя предыдущие лабораторные работы вы уже сталкивались с разграничением прав доступа в ОС Линукс. Такое разграничение обусловлено многозадачностью и многопользовательским режимом Линукс и призвано повысить безопасность и надежность системы, а также обеспечить защиту конфиденциальной информации.

Каждый файл в Линукс характеризуется набором атрибутов, определяющих его принадлежность и права доступа. Отношение принадлежности файла определено для:

  • владельца файла(user) - пользователя, создавшего (что не обязательно) этот файл;
  • группы (group) - в состав которой входит владелец;
  • прочих (other) пользователей.

Для каждого объекта в файловой системе Linux существует набор прав доступа, определяющий взаимодействие пользователя с этим объектом. Такими объектами могут быть файлы, каталоги, а также специальные файлы (например, устройства) — то есть по сути любой объект файловой системы. Так как у каждого объекта в Linux имеется владелец, то права доступа применяются относительно владельца файла. Они состоят из набора 3 групп по три атрибута:

  • чтение( r ), запись( w ), выполнение( x ) для владельца;
  • чтение, запись, выполнение для группы владельца;
  • чтение, запись, выполнение для всех остальных.

Атрибуты файла могут быть представлены в символьном или числовом виде. Символьное представление атрибутов - это строка, где последовательно записаны права доступа в следующем виде:

1
rwxrwxrwx

где каждая тройка символов определяет права на чтение (r), запись (w) и исполнение (x) для соответствующих пользователей (первая тройка - для владельца (user), вторая - для группы (group), третья - для прочих (other).

К правам доступа относятся: чтение (read), изменение (write), исполнение (execute). Понимание этих прав будет различным и зависеть от содержания файла. Наибольшие различия - между обычными (regular) файлами и каталогами. Эти различия приведены в табл. 1.

Файлы Каталоги
Чтение Просмотр содержимого файла (например, текста) в соответствующей программе и возможность его копирования Обзор списка файлов и возможность копирования каталога (в общем случае, вместе со всем содержимым)
Изменение Редактирование содержимого файла и его копирование, но не удаление или переименование/перемещение Обеспечивает возможность записи и удаления файлов
Исполнение Разрешает запуск программ и сценариев оболочки Разрешает переход в каталог и перемещение по нему

Таким образом появляется возможность создания так называемых “скрытых” каталогов, когда невозможно получить список файлов, но пользователь точно знающий имя файла может скопировать его из “скрытого” каталога.

Вот пример отображения списка файлов с правами доступа, представленными в символьном виде:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
dir -L1 
	итого 2722316 
	-rw-r--r-- 1 aag users 498444757 Ноя 27 16:15 aag.asoiu.tar.gz 
	drwxr-xr-x 2 aag users 4096 Июн 1 2007 bin 
	-rw-r--r-- 1 aag users 26 Фев 20 10:20 description.txt 
	drwxr-xr-x 5 aag users 4096 Мар 2 20:01 Desktop 
	drwx------ 2 aag users 4096 Фев 23 09:50 Documents 
	drwxr-xr-x 4 aag users 4096 Фев 28 00:03 downloads 
	-rwxrwxr-x 1 aag users 7523 Окт 20 2006 Dz19.jpg 
	-rw-r--r-- 1 aag users 8336 Фев 24 01:12 httpd.myconf 
	-rw-r--r-- 1 aag users 20 Фев 25 16:32 index.html 
	-rw-r--r-- 1 aag users 30296 Фев 23 10:05 logofish.xcf 
	drwxr-xr-x 2 aag users 4096 Сен 28 22:53 Music 
	drwxr-xr-x 3 aag users 4096 Дек 3 13:45 Projects 
	drwxr-xr-x 4 aag users 4096 Фев 26 00:05 public_html 
	-rw-r--r-- 1 aag users 1088 Фев 20 10:18 readme.txt 
	drwxr-xr-x 4 aag users 4096 Фев 27 23:41 scrapbook 
	-rw------- 1 root root 0 Июн 2 2007 session_mm_cli0.sem

Обратите внимание на первые символы в записи прав доступа. В приведенном листинге первый символ d указывает, что файл является каталогом. Признаком специального символьного и блочного устройств являются символы с и b, а для каналов (pipes) соответственно p.

Числовое представление прав доступа - это трехзначное число, каждая цифра которого определяет (слева направо) права для владельца, группы и прочих. Права определяются как сумма цифр 4 (чтение), 2 (запись) и 1 (исполнение). Таким образом, например файл f1, создателем которого является user1 и разрешенный для чтения и изменения членам группы users и только для чтения всем прочим, будет иметь следующие атрибуты:

  • в символьном виде: rw-rw-r–

  • в числовом виде: 664

Вновь создаваемый файл обычно получает права rw-r–r– (зависит от установок системы и значения umask (см. man umask). Для изменения атрибутов используется команда chmod, которая может принимать как символьное, так и числовое представление атрибутов в качестве параметра. Ниже приведены примеры использования команды:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
dir hello.txt 
	**-rw-r--r--** 1 aag users 17 Мар 2 22:32 hello.txt 
chmod **go+w** hello.txt // _разрешить запись для группы и прочих_ 
dir hello.txt 
	**-rw-rw-rw-** 1 aag users 17 Мар 2 22:32 hello.txt  
chmod **ug+x** hello.txt // _разрешить выполнение для владельца и группы_ 
dir hello.txt 
	**-rwxrwxrw-** 1 aag users 17 Мар 2 22:32 hello.txt 
chmod **a-x** hello.txt // _запретить выполнение для всех (**a** == ugo)_ 
dir hello.txt 
	**-rw-rw-rw-** 1 aag users 17 Мар 2 22:32 hello.txt 
chmod **go-w** hello.txt // _запретить запись для группы и прочих_ 
dir hello.txt 
	**-rw-r--r--** 1 aag users 17 Мар 2 22:32 hello.txt 
chmod **755** hello.txt // _разрешить чтение и выполнение всем и запись владельцу_ 
dir hello.txt 
	**-rwxr-xr-x** 1 aag users 17 Мар 2 22:32 hello.txt 
chmod **644** hello.txt // _запретить выполнение всем_ 
dir hello.txt 
	**-rw-r--r--** 1 aag users 17 Мар 2 22:32 hello.txt 
chmod **711** hello.txt // _разрешить только выполнение для группы и прочих_ 
dir hello.txt 
	**-rwx--x--x** 1 aag users 17 Мар 2 22:32 hello.txt

Для распределения прав доступа в Linux существует множество команд. Основные из них – это chmod, chown и chgrp. Для смены владельца файла и группы (опционально) используется команда chown, а для смены группы - команда chgrp (см. man chown, man chgrp).

В символьном виде использование команды chmod будет выглядеть следующим образом:

1
chmod [ugoa] [+-] [rwx] filename

где: u,g,o,a – установка прав для пользователя, группы, остальных пользователей, всех групп прав доступа соответственно.

+,-,= – добавить, удалить, установить разрешение соответственно.

r,w,x,X,u,g,o – право чтения, записи, выполнения, выполнения если есть такое право еще у какой либо из групп доступа, такие же как у владельца, такие же как у группы, такие же как у остальных пользователей.

filename - Имя файла, у которого изменяются права.

Просмотр разрешений, установленных на файл осуществляется командой ls с ключом -l:

1
2
3
4
5
6
7
8
9
10
11
ls -l lesson5.txt
	-rw------- 1 student student 39 Nov 19 15:17 lesson5.txt 
chmod g+rw lesson5.txt 
ls -l lesson5.txt 
	-rw-rw---- 1 student student 39 Nov 19 15:18 lesson5.txt 
chmod o=u lesson5.txt 
ls -l lesson5.txt 
	-rw-rw-rw- 1 student student 39 Nov 19 15:18 lesson5.txt 
chmod o-w lesson5.txt 
ls -l lesson5.txt 
	-rw-rw-r-- 1 student student 39 Nov 19 15:19 lesson5.txt 

Для использования абсолютного режима необходимо представить права доступа к файлу в виде 3-х двоичных групп. Так например:

rwx r-x r– будет выглядеть как: 111 101 100

Теперь каждую двоичную группу перевести в 8-ричное число: 111 – 7, 101 – 5, 100 – 4 .

Чтобы задать файлу такие права необходимо выполнить команду:

1
2
3
4
5
ls -l lesson5.txt 
	-rw-rw-r-- 1 student student 39 Nov 19 15:19 lesson5.txt 
chmod 754 lesson5.txt 
ls -l lesson5.txt 
	-rwxr-xr-- 1 student student 39 Nov 19 15:19 lesson5.txt 

Также предложить им проделать то же самое в символьном виде.

Команда chown (CHange OWNer – сменить владельца) – позволяет сменить владельца файла. Для использования этой команды необходимо либо иметь права владельца текущего файла или права root . Синтаксис команды прост:

1
chown username:groupname filename 

где username – имя пользователя – нового владельца файла; groupname – имя группы – нового владельца файла; filename – имя файла, у которого сменяется владелец.

Имя группы в синтаксисе команды можно не указывать, тогда будет изменен только владелец файла.

Команда chgrp используется для изменения владельца-группы файла. Синтаксис ее таков:

1
chgrp groupname filename

где: groupname – имя группы, которой будет принадлежать файл filename – имя изменяемого файла

Имейте в виду, что использовать команды chown и chmod может только пользователь-владелец файла и root , а команду chgrp - пользователь-владелец файла, группа-владелец файла и root .

Существуют еще несколько особых прав, которые могут устанавливаться на файлы и каталоги. О некоторых из них мы поговорим при изучении темы “процессы”. Но один рассмотрим сейчас. Это так называемый sticky bit (бит прикрепления).

В первых версиях Юникс этот бит использовался для того, чтобы заставить систему при работе программы оставлять образ ее кода в памяти. Тогда при следующем обращении к программе на ее запуск тратилось намного меньше времени так как чтение кода с устройства более не требовалось. Для файлов и сегодня в Linux осталось прежнее значение этого бита. А вот для каталогов этот атрибут приобрел новое значение. Если sticky bit установлен на каталог, то удалить файлы из такого каталога может только пользователь-владелец файла, и то только если у него есть право на запись в файл. Группа-владелец и остальные пользователи даже при наличии прав на запись в файл не смогут удалить его при установленном на каталог sticky bit. Бит прикрепления устанавливается командой chmod в символьном виде:

1
chmod +t filename 

Задания для самостоятельного выполнения

  1. В текущей папке создать файл hello следующего содержания
1
2
3
4
#!/bin/sh \
echo Hello, World! \
echo -n "I'm " \
whoami
  1. Выполнить следующие действия и проанализировать результаты:
    • набрать в командной строке имя файла hello и нажать Enter
    • набрать в командной строке sh hello и нажать Enter
    • установить для файла hello права на исполнение (x), ввести имя файла в командной строке (./hello) и нажать Enter
  2. Разберитесь, как в Linux можно организовать специальные каталоги-файлообменники - такие, что создавать в них файлы могут любые пользователи, а удалять - только владельцы файлов (тот, кто их создал).

Контрольные вопросы

  1. Зачем у файла нужны атрибуты доступа?
  2. Для каких трех категории пользователей задаются права доступа каждого конкретного файла?
  3. Для чего в UNIX-подобных системах используются пользовательские группы?
  4. Какие действия с файлами регламентируются правами доступа?
  5. На какой системе счисления основывается числовое представление прав доступа?
  6. Чем отличается назначение прав доступа к простому файлу и к директории?
  7. Кто может менять права доступа определенного файла?
  8. Каково назначение специальных битов прав доступа?

Практическая работа - управление пакетами Linux

Цель лабораторной работы

Научиться устанавливать новое программное обеспечение, как при помощи специальных программ инсталляторов, так и путем компилирования из исходных файлов.

Основное задание

  1. Откройте окно менеджера программ и познакомьтесь с набором программного обеспечения, входящего в стандартный репозиторий вашей операционной системы.
  2. Найдите и установите программу chromium-browser. Проверьте ее работоспособность.
  3. Удалите установленную программу firefox.
  4. Произведите обратные действия (установку firefox и удаление chromium) командами в терминале.
  5. Откройте менеджер пакетов Synaptic в графическом режиме.
  6. Выведите полный список пакетов, установленных в системе. Подсчитайте общее количество пакетов, установленных в системе.
  7. Выберите из общего списка все пакеты, имеющие в названии слово gnome (т.е. те пакеты, которые принадлежат интегрированной среде GNOME) и подсчитайте их количество.
  8. Проверьте, установлен ли в системе пакет mc и получите расширенную информацию об этом пакете.
  9. Выполните имитацию удаления (НЕ УДАЛЕНИЕ!) пакета perl. Подсчитайте количество пакетов, которые от него зависят.
  10. Выполните имитацию установки пакетов httpd, vsftpd и webmin, проанализировать результаты (убедиться, что все зависимости удовлетворены).
  11. Повторите задания 6-10 в консольном режиме с использованием программы dpkg.
  12. Установите программу PyCharm, следуя инструкциям на сайте производителя. Добавьте ярлык программы на рабочий стол или панель и убедитесь, что программа работает правильно.

Методические указания

Одна из первых вещей, на которые вы обращаете внимание при установке Linux – это большое количество входящих в дистрибутив пакетов. Большинство дистрибутивов содержат операционную систему Linux, средства для инсталляции и средства администрирования. Кроме того, в них включаются средства для работы в Интернете, средства разработки, офисные пакеты, игры, а также некоторые средства, о которых вы даже не слышали. Дистрибутивы Linux, содержащие тысячи доступных пакетов, не редкость. Если вы не выбрали “установить все”, будет установлено некоторое подмножество этих пакетов.

Теперь у вас могут возникнуть вопросы “Как удалить ненужные пакеты? Как установить что-то недостающее? Могу ли я использовать программное обеспечение, не входящее в мой дистрибутив?”

Зависимости

Разные разработчики разрабатывают разные программы и библиотеки. Определенная программа может зависеть от десятка библиотек, которые разработали разные люди. Следить за всем этим вручную — неблагодарное занятие.

К счастью для нас, проблема эта решена. Каждый раз когда вы ставите какое-либо ПО из репозитория или вручную при помощи пакета-установщика, программа-установщик разбирает эти зависимости и устанавливает их вместе с нужным вам приложением. Но иногда бывает и такая ситуация, когда репозитории не подключены (например, если нет интернета) и единственный способ поставить программу — скачать ее предварительно где-нибудь и потом ставить вручную. В любом случае при установке вы будете предупреждены, если нужная зависимость не установлена и не может быть найдена в репозиториях, так что теперь вы знаете в чем дело.

И напоследок о зависимостях: допустим, вам надо скачать какую-то программу. Она тянет за собой 5 зависимостей. Каждый из них тянет за собой по 5 зависимостей еще. В итоге может получиться так, что сама программа занимает 1 мегабайт, а скачать надо 50.

.deb = setup.exe

В Windows, чтобы установить программу, необходимо скачать некий файл, наподобие setup.exe, который сам все установит. В дистрибутивах, основанных на Debian используется похожая система, только вместо setup.exe используются файлы с расширением .deb

Это пакет-установщик. В разных линукс-системах установщики могут быть разные. Например, в системе RedHat Linux для установки используются пакеты с расширением .rpm

Зачем это нужно знать? Когда вы ищите ПО в интернете (если его нету в репозиториях) — обычно на странице загрузки предоставляются различные пакеты. Вам нужен deb! Даже когда вы устанавливаете что-либо из репозитория, невидимо от вас программа скачивает deb файл (или несколько файлов, если имеются зависимости) и потом устанавливает его.

Программа apt.

Все архивы программного обеспечения, компакт-диски и т. д. не принесут никакой пользы, если вы не умеете устанавливать программы. Итак, вы хотите знать, как установить новый пакет в Debian.

Воспользуйтесь командой apt install:

1
sudo apt install tuxkart 

Установка пакета с перезаписью файлов:

1
sudo apt install --reinstall tuxkart 

Чтобы установить сразу несколько программ, перечислите их, разделяя пробелами:

1
sudo apt install tuxkart gltron frozen-bubble tuxracer nethack galaga 

Загрузка программ без установки или распаковки:

1
sudo apt -d install tuxkart 

Чтобы протестировать команду перед выполнением, присоедините к строке ключ - dry-run:

1
sudo apt install tuxkart gltron frozen-bubble tuxracer nethack galaga --dry-run 
Удаление пакетов

Для удаления одного или нескольких пакетов воспользуйтесь командой apt remove:

1
sudo apt remove tuxpaint 

Предварительное тестирование команды remove:

1
sudo apt remove tuxpaint -dry-run 

Удаление всех следов существования пакета, включая конфигурационные файлы:

1
sudo # apt --purge remove tuxpaint 

Чтобы удалить сразу несколько программ, перечислите их, разделяя пробелами:

1
sudo apt remove tuxkart gltron frozen-bubble tuxracer nethack galaga
Обновление пакетов

Часто требуется обновить пакет в системе Debian, потому что новая версия обладает расширенными возможностями или в ней исправлены ошибки. Воспользуйтесь командой apt install:

1
sudo apt install gltron 

Обновление нескольких пакетов:

1
sudo apt install tuxkart gltron frozen-bubble tuxracer nethack galaga 

Команды обновления отдельных пакетов не существует. Команда apt install всегда устанавливает последнюю версию пакета.

Обновление системы

При обновлении системы полностью требуется обновить все пакеты в системе и заменить их новейшими версиями. Убедитесь в том, что файл /etc/apt/sourcs.list содержит ссылки на нужные источники, а затем выполните команду apt upgrade.

Всегда начинайте с обновления списков пакетов:

1
sudo apt update 

Следующая команда обновляет все установленные пакеты, но не удаляет пакеты для разрешения зависимостей:

1
sudo apt -u upgrade 

Обновление всех установленных пакетов с удалением или установкой пакетов по мере необходимости для разрешения всех зависимостей:

1
sudo apt -u dist-upgrade 

Флаг -u позволяет заранее просмотреть список всех изменений. Обновление может занять несколько часов, в зависимости от скорости подключения к Интернету и количества загружаемых пакетов.

Чтобы флаг -u применялся по умолчанию, отредактируйте (или создайте) файл /etc/apt/apt.conf:

1
2
3
// Всегда перечислять обновляемые пакеты 
// и запрашивать подтверждение у пользователя 
APT::Get::Show-Upgraded "true"; 

Перед каждым выполнением команды apt_get dist_upgrade сначала выполните команду apt upgrade, чтобы снизить вероятность ошибок при выполнении distupgrade

Поиск установленных программ

Следующая команда выводит список всех установленных пакетов и направляет его в файл:

1
dpkg -l | tee dpkglist 

Поиск всех пакетов, удовлетворяющих критерию поиска, и вывод информации об их состоянии:

1
dpkg -l '*gnome*' 

Поиск установленных пакетов, удовлетворяющих критерию поиска:

1
dpkg -l | grep gnome 

Вывод списка файлов, входящих в пакет:

1
dpkg -L gnome-applets
Операции с кэшем пакетов

Время от времени требуется обеспечить актуальность кэша пакетов и списков пакетов, чтобы программа apt работала правильно, без возникновения ложных проблем с зависимостями.

Воспользуйтесь программами apt и dpkg. Не забывайте выполнять команду apt update после модификации файла /etc/apt/sources.list, а также регулярно выполняйте ее, чтобы список пакетов оставался актуальным.

Следующая команда выводит список загруженных, но не установленных пакетов:

1
dpkg --yet-to-unpack 

Проверка нарушенных зависимостей:

1
apt check 

Удаление кэшированных пакетов, которые стали ненужными:

1
$ apt-cache autoclean 

Удаление всех кэшированных пакетов:

1
apt-cache clean 

Вывод списка частично установленных пакетов:

1
dpkg -audit 

Если вызов dpkg –audit возвращает какие-либо результаты, как в следующем случае:

1
2
dpkg --audit
vpw (no information available) 

для начала убедитесь в том, что возвращаемый пакет существует:

1
2
dpkg -l 
vpw Package 'vpw' is not installed and no info is available 

Если пакет существует, либо завершите установку, либо удалите ее. Если пакет не установлен, поищите соответствующую запись в /var/lib/dpkg/available и /var/lib/dpkg/status и удалите ее

Разрешение конфликтов зависимостей

Иногда может произойти такая ситуация, что какая-либо программа не устанавливается из-за проблем с зависимостями, или команда apt dist-upgrade оставляет пакеты, которые нужно удалить. Существует несколько команд, которые могут пригодиться для решения этой задачи; в этом разделе они перечисляются в том порядке, в котором их стоит попробовать.

Допустим, проблемы возникли с пакетом libpam-modules, который не желает обновляться:

1
2
3
4
5
sudo  apt install libpam-modules 
	... 
	The following packages have unmet dependencies: 
	libpam-modules: Depends: libdb3 (>=3.2.9-19.1) but 3.2.9-19 is to be installed 
	E: Broken packages 

Если вы работаете в смешанной системе, для начала попробуйте указать версию:

1
sudo  apt install -t stable libpam-modules 

Если это не помогает или система не является смешанной, попробуйте воспользоваться системой разрешения конфликтов Debian:

1
sudo apt -f install 

Затем выполните команду:

1
sudo  dpkg --configure -a 

И снова повторите команду:

1
sudo apt -f install 

Если будет получен следующий ответ, значит, попытка завершилась неудачей:

1
2
3
Reading Package Lists... Done 
Building Dependency Tree... Done 
0 upgraded, 0 newly installed, 0 to remove and 1 not upgraded. 

Теперь проверьте, что произойдет при удалении существующего пакета libpammodules:

1
2
3
4
5
6
7
8
sudo apt remove --dry-run libpam-modules 
	Reading Package Lists... Done 
	Building Dependency Tree... Done 
	The following packages will be REMOVED: adduser adminmenu apache at base-config courier-imap courier-imap-ssl courier-pop courier-pop-ssl cron cupsys cupsys-driver-gimpprint dict-elements dict-foldoc dict-gcide dict-jargon dict-vera dict-wn dictd gdm2... 
	.... 
	WARNING: The following essential packages will be removed 
	This should NOT be done unless you know exactly what you are doing! 
	login libpam-modules (due to login) 

В данном случае исправление конфликтов зависимостей потребует едва ли не полной перестройки системы. Чаще проблемы ограничиваются несколькими пакетами. В этом случае начинайте удалять наименее важные из них, пока конфликты зависимостей не будут разрешены, а затем переустановите все пакеты, которые вам нужны.

Если apt -u dist-upgrage отображает какие-либо задержанные (held) пакеты, от них лучше избавиться. Пакеты удерживаются из-за конфликтов зависимостей, которые не удается разрешить apt. Попробуйте воспользоваться следующей командой для поиска и исправления конфликтов:

1
sudo apt -o Debug::pkgProblemResolver=yes dist-upgrade 

Если исправить конфликты не удается, команда завершается с сообщением

1
	0 upgraded, 0 newly installed, 0 to remove and 6 not upgraded. 

Удаляйте held-пакеты один за одним, каждый раз запуская dist-upgrade, пока не останется ни одного задержанного пакета. Затем установите заново все необходимые пакеты. Не забудьте использовать ключ –dry-run, чтобы заранее знать обо всех последствиях: # apt remove –dry-run libsdl-perl В «монолитных» системах подобные конфликты версий встречаются редко. Пользователи смешанных систем сталкиваются с ними чаще. Чтобы предотвратить их, будьте чрезвычайно осмотрительны при выборе устанавливаемых программ — при первой установке Debian потратьте немного времени и выберите каждый необходимый пакет.

Самостоятельное изучение

  1. Установка пакетов из исходных кодов. Команды compile, make, make install
  2. Установка и запуск программ Windows в системе Linux. Программа-эмулятор Wine
  3. Контейнерные пакеты snap и flatpack.

Задания для самостоятельного выполнения

  1. Установите другой менеджер рабочего стола (например, KDE или XFCE). Проверьте его работоспособность, залогинившись в него.
  2. Установите какую-либо программу по вашему выбору из исходных кодов.
  3. Установите на вашу Linux-машину библиотеку tensorflow-gpu. Проверьте правильность установки, запустив в командной строке интерактивную консоль Python командой python и затем введя команду
1
import tensorflow

Вы не должны получить сообщение об ошибке импорта.

Контрольные вопросы

  1. Чем отличаются команды apt и apt-get?
  2. В чем различие программ для управления пакетами apt и dpkg?
  3. Какие менеджеры пакетов применяются в других дистрибутивах? В чем их особенности?
  4. Как устанавливать пакеты из исходных кодов?
  5. Зачем нужны контейнерные менеджеры пакетов? В чем их преимущества и недостатки?

Практическая работа - управление процессами в Linux

Цель работы

Получить представление о процессах, как о способе управления ресурсами в Линукс. Научиться получать и анализировать информацию о процессах и управлять состоянием выполняющихся процессов.

Основное задание

  1. Войти в систему с собственной учетной записью
  2. Получить справку о команде ps
  3. Командой ps вывести краткую информацию о выполняющихся процессах в текущем терминале и определить PID текущей оболочки
  4. Получить подробную информацию о загруженных процессах и выяснить, какой из них использует максимальный объем памяти, а какой - максимально загружает процессор
  5. Из таблицы, полученной в п.4 выяснить, какой PID имеет процесс init и от чьего имени он запущен
  6. Открыть новый сеанс с собственной учетной записью в и запустить в нем текстовый редактор nano
  7. Вернуться в исходный сеанс и снова просмотреть список процессов. Определить PID программы nano, запущенной от вашего имени
  8. Командой kill снять все процессы nano
  9. В tty1 выполнить команду top. Сравнить ее возможности с возможностями ps
  10. Используя top или ps определить, какие процессы порождены (поле PPID) процессом init (PID=1)
  11. Запустить поиск всех файлов .html от каталога /. Приостановить этот процесс (Ctrl+Z).
  12. Запустить команду man bash и приостановить ее выполнение
  13. Командой jobs определить номера задач, запущенных в предыдущих пунктах.
  14. Командой fg продолжить выполнение man bash.
  15. Принудительно (kill) завершить команду find.

Методические указания

Понятие процесса

Под процессами во всех unix-подобных системах подразумевается любая независимо выполняющаяся программа со всеми используемыми ресурсами. Процесс - одно из ключевых понятий, на которых базируется Линукс, как unix-подобная система, и оно тесно связано с такими понятиями, как учетные записи, права доступа и файловая система. Эта связь неразрывна и, вдобавок, рекурсивна:

  • пользователь (реальный или виртуальный) запускает процессы, порождающие файлы;
  • права доступа процесса соответствуют правам доступа запустившего его пользователя;
  • порожденные процессом файлы получают права, соответствующие правам процесса;
  • права пользователя определены параметрами его учетной записи.

Каждый процесс уникален. Для идентификации процесса используется числовое значение, т.н. идентификатор процесса (PID, Process Identificator). Для каждого процесса известен владелец(пользователь, запустивший процесс). Если процесс создан реальным пользователем, то он привязан к терминалу, из которого был запущен. Для виртуальных (системных) пользователей такой ассоциации не производится. Помимо собственного идентификатора, каждый процесс имеет еще и идентификатор родительского процесса (PPID, Parent PID). В каждый момент времени системе известно состояние процесса - степень его исполнения. Процесс может быть:

  • выполняемым в текущий момент (R, Runned);
  • находящимся в режиме ожидания (S, Suspended);
  • прерванным (T, Terminated), например, при использовании клавиш Ctrl+Z;
  • “зомби” (Z, Zombied) - завершившимся, но от которого родительский процесс еще не принял сигнала завершения. Спустя некоторое время “зомби” завершаются окончательно и освобождают ресурсы;
  • зависшим, или в состоянии непрерывного ожидания (uninterruptible sleep). Такой процесс не реагирует на какие-либо сигналы и может быть снят только перезагрузкой системы.

Все запущенные процессы условно (в зависимости от выполняемой ими функции) можно разделить на три типа: Системные процессы являются частью ядра и всегда расположены в оперативной памяти. Они часто не имеют соответствующих им программ в виде исполняемых файлов и всегда запускаются особым образом при загрузке ядра системы. Процессы-демоны – это неинтерактивные процессы, которые выполняются в фоновом режиме. К прикладным относятся все остальные процессы, выполняющиеся в системе. Интерактивные процессы связаны с определѐнным терминалом и через него взаимодействуют с пользователем. Фоновые процессы выполняются независимо от пользователя и (псевдо)параллельно. Каждый процесс в операционной системе Linux может находиться в одном из четырѐх состояний: работоспособный, спящий (или ожидающий), остановленный и завершившийся.

Еще одной характеристикой процессов является уровень приоритета (NI, NIce value, “степень дружественности”). Уровень приоритета влияет на количество системных ресурсов, выделяемых процессу.

Основными командами для получения сведений о выполняемых процессах являются ps и top. Фрагмент вывода сведений командой ps с параметрами a (расширенный вывод), u (с указанием UID), x (в т.ч для виртуальных пользователей):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
ps aux 
	USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND 
	root 1 0.0 0.0 744 284 ? Ss 14:27 0:00 init [5]  
	root 2 0.0 0.0 0 0 ? S< 14:27 0:00 [kthreadd] 
	root 3 0.0 0.0 0 0 ? S< 14:27 0:00 [migration/0] 
	root 4 0.0 0.0 0 0 ? SN 14:27 0:00 [ksoftirqd/0] 
	root 5 0.0 0.0 0 0 ? S< 14:27 0:00 [events/0] 
	root 6 0.0 0.0 0 0 ? S< 14:27 0:00 [khelper]
	root 25 0.0 0.0 0 0 ? S< 14:27 0:00 [kblockd/0] 
	... 
	root 141 0.0 0.0 0 0 ? S< 14:27 0:00 [kswapd0] 
	root 142 0.0 0.0 0 0 ? S< 14:27 0:00 [aio/0] 
	root 367 0.0 0.0 0 0 ? S< 14:27 0:00 [kpsmoused] 
	root 377 0.0 0.0 0 0 ? S< 14:27 0:00 [kondemand/0] 
	... 
	root 991 0.0 0.0 0 0 ? D< 14:28 0:01 [kjournald] 
	root 1682 0.0 0.0 0 0 ? S< 14:28 0:01 [ipw2200/0] 
	root 1694 0.0 0.0 0 0 ? S< 14:28 0:00 [khpsbpkt] 
	 
	wwwrun 3323 0.0 2.4 104548 12804 ? S 14:28 0:00 /usr/sbin/httpd 
	wwwrun 3324 0.0 2.4 104540 12816 ? S 14:28 0:00 /usr/sbin/httpd 
	 
	...

Дополнительная информация о команде ps доступна при указании параметра --help или в справке man.

Управление процессами

Чтобы запустить программу достаточно ввести ее имя в командной строке и нажать «Enter». Однако не все команды запускают единственный процесс.

Интерактивные процессы, запущенные в терминале, занимают терминальную сессию, и оболочка не выводит пользователю строку приглашения до тех пор, пока программа не завершится.

1
firefox csc.sibsutis.ru 

Работу некоторых запущенных в терминале программ можно прервать с помощью сочетания клавиш «Ctrl + c» в окне терминала. В этот момент программе посылается сигнал INT (Interrupt).

Чтобы запустить программу в фоновом режиме необходимо завершить команду символом амперсанд «&». После этого в терминал выводится информация о запущенном процессе включая номер задания терминала, и приглашения пользователю на ввод новой команды.

1
top & 

Используя команду jobs мы можем получить список заданий которые запущены через терминал.

1
jobs 

Чтобы вернуть запущенный в фоне процесс на передний план используется команда fg с указанием номера задания из списка заданий.

1
fg %2 

Если мы хотим перевести процесс в состояние остановленный, используется сочетание клавиш «Ctrl + z». В этот момент программе посылается сигнал TSTP (Terminal Stop).

После этого мы можем либо переместить задание на передний план командой fg, либо продолжить его выполнение в фоновом режиме командой bg.

1
bg %2

Пользователь может управлять только теми процессами, владельцем которых является. Суперпользователь может управлять всеми процессами.

Управление запущенными процессами сводится к приостановке выполнения, изменению приоритета и принудительному завершению.

Приостановить выполнение активного процесса можно сочетанием клавиш Ctrl+Z. Для продолжения его работы можно использовать команду fg. Если имеется несколько приостановленных процессов, то для команды fg необходимо указать порядковый номер задания в текущей оболочке, (не путать с PID), работу которого нужно продолжить. Узнать номер задания можно командой jobs.

Изменение приоритета процесса - задача, возникающая (нечасто) при необходимости перераспределения ресурсов системы. Значения уровня приоритета (nice value) изменяется от -20 (наименьшая “дружественность”, высший приоритет) до +20 (низший приоритет). Все пользовательские (и большинство системных) процессы запускаются с равным приоритетом (nice value = 0). Это значение может быть изменено двояко:

  • Во-первых, при запуске программы командой nice с указанием необходимого уровня приоритета и именем запускаемой программы. Например:
1
nice -5 find / *.html
  • Во-вторых, для ранее запущенной задачи, командой renice с указанием уровня и PID задачи. Например, так:
1
renice --7 20117

Пользователь имеет право понижать приоритет собственных задач. Повышать уровень приоритета любой задачи может только суперпользователь.

Гораздо чаще, чем изменение приоритета, возникает необходимость принудительного завершения (снятия) процесса. Такая ситуация возникает, например тогда, когда процесс “зависает”, т.е. перестает воспринимать нажатия клавиш и не отвечает на системные события. Для снятия “зависшей” программы предназначена команда kill, которая передает ей один из сигналов завершения. Список сигналов доступен по команде kill -l, а их подробное описание - по команде man 7 signal. Здесь же отметим, что без явного указания имени (или номера), процессу будет передан сигнал SIGTERM (номер 15), предписывающий по возможности корректно, с сохранением информации, завершить работу. Примеры использования команды:

Вызов со значением сигнала по умолчанию (SIGTERM):

1
2
3
4
5
6
7
find / *.html 
ps 
	PID TTY TIME CMD 
	2663 pts/1 00:00:00 bash 
	20712 pts/1 00:00:00 find 
	20762 pts/1 00:00:00 ps 
kill 20712

Явное указание номера сигнала:

1
kill -15 20712

Явное указание имени сигнала (номер 9, SIGKILL, требующий немедленного завершения работы программы):

1
kill -SIGKILL 20712
Команда top

Большей гибкостью и универсальностью по сравнению с командой ps обладает команда top. Она позволяет не только получить информацию о процессах, но и выполнять мониторинг через заданные интервалы времени. Также эта команда позволяет управлять процессами, объединяя возможности команд j_obs, nice, fg_ и kill. Все параметры и действия команды top являются настраиваемыми. Для команды доступна как справка в формате man, так и интерактивная справка по нажатию клавиш H или ?.

Задания для самостоятельного выполнения

  1. В заданиях 3,4,5 и 7 написать команды, которые выводят только нужную информацию (идентификатор процесса). Используйте команды работы с текстом.
  2. Установите программу htop и познакомьтесь с ней. Используя ее в процессе повседневной работы ответьте на несколько вопросов:
    1. Какие программы потребляют больше всего оперативной памяти?
    2. Насколько часто центральный процессор бывает загружен полностью и при выполнении каких задач?
    3. Сколько памяти потребляет система в режиме простоя?
    4. Требуется ли системе апгрейд и каких компонентов в первую очередь?

Контрольные вопросы

  1. В системе зарегистрированы и работают пользователи user1 и user2. Может ли user1 завершить работу процесса, запущенного пользователем user2?
  2. Может ли user1 понизить приоритет процесса, запущенного user2?
  3. Может ли user1 повысить приоритет собственного процесса?

Практическая работа - создание и запуск собственного сервиса

Цель работы

Познакомиться с механизмом управления службами и автозапуском в Linux, создать и запустить собственноручно написанную программу как сервис операционной системы.

Основное задание

  1. Создайте скрипт на языке Python, который выполняет какую-нибудь операцию в фоне.
  2. Зарегистрируйте этот скрипт как системную службу (демона), которая стартует при запуске системы с помощью инициализатора systemd.

Методические указания

На большинстве современных дистрибутивов Linux за автозапуск системных служб отвечает специальная программа systemd. Она постепенно заменяет более старую систему инициализации операционной системы init. В настоящее время init считается устаревшей системой и постепенно ожидается, что все основные дистрибутивы перейдут на systemd. Эта система инициализации предоставляет больше возможностей и гибче в настройке.

Создание программы

Для начала создадим простой скрипт. Он использует сокеты для создания простейшего эхо сервера на порту 9988. Вы можете модифицировать этот скрипт на свое усмотрение.

1
2
3
4
5
6
7
8
9
10
#!/usr/bin/python3
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(("localhost", 9988))
s.listen(1)
while True:
	conn, addr = s.accept()
	data = conn.recv(1024)
	conn.send(data)
	conn.close()

Для того, чтобы система могла запустить нашу программу при старте нужно указать команду запуска, включающую полный путь к файлу. Вы можете скопировать его в одну из системных папок (например, /usr/bin/) или вызывать его из домашней директории. В любом случае, нужно запомнить команду запуска нашей программы.

Обратите внимание на шебанг в начале скрипта. Он позволяет запускать его непосредственно командой ./server.py, без указания пути к интерпретатору. В принципе, вы можете обойтись без шебанга и включить в команду запуска и путь к интерпретатору Python.

Настройка автозапуска

Чтобы создать сервис, вы должны создать соответствующий конфигурационный файл. Он содержит все необходимые настройки для запуска сервиса в виде текста в определенном формате. Он должен называться <servicename>.service, где <servicename> - это системное имя вашего демона. Этот файл должен располагаться в одном из определенных директорий, которые сканируются программой systemd. Полный список таких директорий вы можете найти в документации. Некоторые из них являются системными и для доступа к ним нужны права суперпользователя. Некоторые - специфичны для текущего пользователя. В данном примере мы будем использовать папку /etc/systemd/system/.

Давайте создадим текстовый файл /etc/systemd/system/dummy.service. В него запишем такие директивы:

1
2
3
4
5
6
[Unit]
Description=Dummy Service

[Service]
Type=simple
ExecStart=/home/user/dummy.py

Файл юнитов организован, как и многие конфигурационные файлы Linux в виде разделов. Главный раздел называется Unit. Подробное описание всех разделов и директив можете почитать, например, здесь. После этого вы можете управлять этим сервером используя команды systemctl.

Команды управления демоном

Теперь вы можете использовать команду systemctl, чтобы управлять своим сервисом. Для начала введите

1
systemctl status dummy

Эта команда покажет информацию о вашем сервисе. Главное, что здесь можно узнать, это то, запущен ли он в данный момент. Запустить сервис можно командой systemctl start dummy:

Запущенный сервис

Кроме этих двух могут быть полезными еще другие команды из семейства systemctl:

  • enable - включение автозапуска сервиса при старте системы;
  • disable - отключение автозапуска;
  • restart - перезапуск сервиса: сервис будет остановлен и заново запущен;
  • stop - остановка сервиса;
  • reload - обновление конфигурации сервиса без перезапуска.
Дополнительные настройки

При помощи директив в файле юнита можно довольно гибко настроить поведение сервиса при запуске. Например, можно указать, что данный сервис должен запускаться только после указанных. Это может быть полезно, если ваш демон зависит от каких-то других. Например, если при старте ваша программа подключается к базе данных, она должна быть запущена только после демона СУБД. Для этого используются директивы After, Requires, Wants.

Можно настроить запуск сервиса с привилегиями определенного пользователя при помощи директив User и Group и задать рабочий каталог для программы сервиса (WorkingDirectory).

При помощи директивы Restart можно настроить перезапуск процесса при его завершении. Здесь же можно указать, в каких случаях нужно заново запускать программу, также настроить интервал ожидания.

Задания для самостоятельного выполнения

  1. Настройте автозапуск вашего демона таким образом, чтобы он автоматически перезапускался через 2 секунды после завершения процесса вследствие, например, программной ошибки.
  2. Создайте скрипт установки вашей программы, который автоматически копирует ее в системный каталог и настраивает автовыполнение как службы Linux.
  3. (*) Создайте скрипт установки, который автоматически распознает программу управления службами (systemd, init, upstart) и регистрирует программу соответственно.

Контрольные вопросы

  1. Чем процесс-демон отличается от обычного процесса?
  2. Какие основные программы управляют автозапуском систем Linux?
  3. Какие действия можно проделать с помощью команды systemctl?
  4. Чем отличается включение и запуск службы?
  5. Как зарегистрировать программу как службу операционной системы?

Практическая работа - работа с файловыми системами и памятью

Цель работы

Познакомиться с работой с файловой системой из командной строки - научиться производить простые операции - монтирование и размонтирование файловых систем, мониторинг свободного места.

Освоить команды free, du, dd, df, mount, umount.

Основное задание

  1. Выведите в командной строки информацию о заполненности оперативной памяти и файла подкачки.
  2. Выведите в консоли объем занимаемой домашней папкой, папкой /etc и папкой /tmp
  3. Найдите в домашней папке все файлы с расширением txt.
  4. Выведите в консоль общее количество файлов в домашней папке и всех подпапках
  5. Познакомьтесь с файлом /etc/fstab найдите в нем строки, соответствующие корневой файловой системе и разделу подкачки;
  6. Если в данном файле есть и другие файловые системы, то покажите их идентификатор и точку монтирования;
  7. Найдите в файле /etc/fstab или в графической утилите управления дисками параметры монтирования, а именно: имя файла устройства, точку монтирования, тип файловой системы.

Методические указания

Команда du

Команда Linux du (Disk Usage, т.е. использование диска) – это стандартная команда Unix/Linux, используется для показа суммарной информации об использовании диска файлами и директориями. Команда du имеет много опций параметров и может выводить результаты в различных форматах. Команда du также отображает размеры файлов и директорий в рекурсивной манере.

Для определения информации о сводном использовании диска деревом директории и каждой поддиректорией, введите команду вида:

1
du путь/до/директории

Использование с командой du опции -h предоставляет результаты в формате, понятном человеку. Имеется ввиду, что размеры будут представлены в байтах, килобайтах, мегабайтах, гигабайтах и т.д.

Чтобы узнать общий размера директории, т.е. сколько место занимает папка и её подпапки, используется опция -s.

Использование с командой du флага -a отображает использование диска всеми файлами, а не только каталогами.

Узнать размер папки /home/user/data/backup/:

1
sudo du -sh /home/user/data/backup/

Размеры папок, включая файлы внутри папки:

1
du -sh /var/log/*

Тоже самое, но с сортировкой по занимаемому месту:

1
sudo du -sh /var/log/* | sort -hr
Команда free

Команда free предоставляет информацию об использованной и неиспользованной памяти, а так же о разделе подкачки (swap). В этой статье разберем несколько полезных примеров использования этой команды.

Синтаксис команды free весьма прост:

1
free [параметры]

Если требуется узнать какое количество памяти и свопа используется, наберите команду free в терминале. Информация отобразится в килобайтах:

1
free

Чтобы увидеть всю информацию в байтах, укажите ключ -b:

1
free -b

Для вывода в мегабайтах используйте ключ -m:

1
free -m

Для гигабайтов -g:

1
free -g

Если вы хотите увидеть полную память (включая своп), используйте ключ -t, который выведет информацию типа той, что приведена ниже.

1
free -t

Ключ -s используется для указания времени обновления информации. К примеру, для того, чтобы выводить информацию в мегабайтах каждые 5 секунд, запустите команду.

1
free -ms 5

Ключ -с указывает количество раз, доступных для обновления информации, инициируемой командой -s. Нижеприведенная команда отобразит всего 2 вывода информации о памяти с 5 секундным интервалом в мегабайтах

1
free -m -s 5 -c 2

Теперь разберем, что означают значения в выводе команды free

Строки:

  • Mem – физическая память
  • Swap – виртуальная память

Колонки:

  • total – общий размер ОЗУ
  • used – реально использующая в данный момент и зарезервированная системой память
  • free – свободная память (total - used)
  • shared – разделяемая память
  • buffers – буферы в памяти – страницы памяти, зарезервированные системой для выделения их процессам, когда им это потребуется
  • cached – файлы, которые недавно были использованы системой/процессами и хранящиеся в памяти на случай, если они снова потребуются.

Больше информации доступно в справочной информации man free.

Команда df

Утилита df поставляется по умолчанию во всех дистрибутивах Linux и имеет очень простой синтаксис. Фактически вы можете просто набрать df и уже получить результат, но чтобы сделать вывод более читаемым используются дополнительные опции. Вот основной синтаксис:

1
df опции устройство

Устройство указывать необязательно, но можно указать раздел диска, о котором мы хотим посмотреть информацию. А теперь рассмотрим основные опции утилиты:

  • -a, –all - отобразить все файловые системы, в том числе виртуальные, псевдо и недоступные;
  • -B - изменить размер одного блока перед выводом данных, например, можно использовать BM, чтобы вывести все данные в мегабайтах;
  • -h - выводить размеры в читаемом виде, в мегабайтах или гигабайтах;
  • -H - выводить все размеры в гигабайтах;
  • -i - выводить информацию об inode;
  • -k - выводить размеры в килобайтах;
  • –output - использовать специальный формат вывода, если не задано, выводит все поля. Доступны такие варианты: ‘source’, ‘fstype’, ‘itotal’, ‘iused’, ‘iavail’, ‘ipcent’, ‘size’, ‘used’, ‘avail’, ‘pcent’, ‘file’ и ‘target’;
  • -P - использовать формат вывода POSIX;
  • –total - выводить всю информацию про использованное и доступное место;
  • -t, –type - выводить информацию только про указанные файловые системы;
  • -x - выводить информацию обо всех, кроме указанных файловых систем;

Для получения информации о свободном пространстве в смонтированных разделах достаточно использовать параметр -h, активирующий режим генерации читаемого человеком вывода:

1
df -h

Для того, чтобы получить информацию о свободном пространстве в разделе с заданной директорией достаточно передать утилите путь к этой директории:

1
df -h /home

Для того, чтобы получить информацию о свободном пространстве в разделах с файловой системой заданного типа следует использовать параметр -t и указать тип этой файловой системы:

1
df -h -T -t ext4

Для получения более подробной информации смотрите страницу man.

1
man df
Команда dd

Довольно часто системным администраторам приходится копировать различные двоичные данные. Например, иногда может понадобиться сделать резервную копию жесткого диска, создать пустой файл, заполненный нулями для организации пространства подкачки или другой виртуальной файловой системы.

Фактически, это аналог утилиты копирования файлов cp только для блочных данных. Утилита просто переносит по одному блоку данных указанного размера с одного места в другое. Поскольку в Linux все, в том числе, устройства, считается файлами, вы можете переносить устройства в файлы и наоборот.

Обычные пользователи используют команду dd чаще всего для создания образов дисков DVD или CD. Например, чтобы сохранить образ диска в файл можно использовать такую команду:

1
sudo dd if=/dev/sr0 of=~/CD.iso bs=2048 conv=noerror

Фильтр noerror позволяет отключить реагирование на ошибки. Дальше, вы можете создать образ жесткого диска или раздела на нем и сохранить этот образ на диск. Только смотрите не сохраните на тот же жесткий диск или раздел, чтобы не вызвать рекурсию:

1
dd if=/dev/sda of=~/disk.img

Мы можем создать файл размером 512 мегабайт, заполнив его нулями из /dev/zero или случайными цифрами из /dev/random:

1
sudo dd if=/dev/zero of=file.img bs=1M count=512

Если образ диска слишком большой, можно перенаправить весь вывод на стандартный поток вывода утилиты gzip:

1
dd if =/dev/sda2 | bzip2 disk.img.bz2

Также можно использовать утилиту dd linux для копирования файлов, хотя это и не является ее прямым предназначением:

1
dd if=/home/sergiy/test.txt of=/home/sergiy/test1.txt

Как вы знаете, команда dd linux пишет данные на диск непосредственно в двоичном виде, это значит, что записываются нули и единицы. Они переопределяют то, что было раньше размещено на устройстве для записи. Поэтому чтобы стереть диск вы можете просто забить его нулями из /dev/zero.

1
sudo dd if=/dev/zero of=/dev/sdb

Такое использование dd приводит к тому что весь диск будет полностью стерт.

MBR расположена в первых 512 байтах жесткого диска, и состоит из таблицы разделов, загрузчика и пары доп. байт. Иногда, ее приходится бекапить, восстанавливать и т.д. Бекап выполняется так:

1
dd if=/dev/sda of=mbr.img bs=512 count=1

Восстановить можно проще:

1
dd if=mbr.img of=/dev/sda
Монтирование файловых систем

Для использования какой-либо файловой системы в операционной системе она должна быть смонтирована (подключена) к ней. Монтирование - это многоэтапный процесс, включающий проверку файловой системы на ошибки, загрузку драйверов для конкретной файловой системы, подключение новой файловой системы к точке монтирования - какому-либо существующему каталогу. К счастью для пользователя, все это можно произвести всего одной командой - mount.

Некоторые файловые системы монтируются автоматически, при загрузке ОС. Их список вместе с параметрами монтирования указан в специальном конфигурационном файле /etc/fstab. Типичный пример - корневая файловая система - раздел жесткого диска, на котором, собственно, и лежит сама ОС всегда автоматически монтируется. Его точка монтирования - корневой каталог. Вы можете изменять этот, чтобы управлять процессом автомонтирования файловых систем.

Чтобы вручную смонтировать файловую систему (например, подключенный к компьютеру сменный носитель, или новый раздел на жестком диске) нужно ввести команду mount с двумя обязательными параметрами - именем файла-устройства с нужным разделом диска и имя каталога, который послужит точкой монтирования. например:

1
mount /dev/sda5 /media/user/volume

В данном примере мы подключаем пятый раздел на первом жестком диске (устройство sda - serial disk A) к каталогу /media/user/volume. Стандартный каталог /media/ часто используется в некоторых дистрибутивах для хранения точек монтирования. Как мы можем видеть, они также разделены для разных пользователей. По поводу принятых соглашений в отношении точек монтирования обратитесь к документации к вашему дистрибутиву.

Большинство современных дистрибутивов автоматически монтирует разделы на сменных носителях при их подключении, поэтому вам не надо будет вводить команды каждый раз, когда вы вставляете флешку в разъем.

Для отключения файловой системы используется команда размонтирования - umount. Изучите ее синтаксис и основные параметры самостоятельно.

Задания для самостоятельного выполнения

  1. Переустановите операционную систему. При разметке диска выберите ручной режим и создайте отдельные разделы для папок /, /home, /boot и /tmp. Также создайте отдельный раздел для файла подкачки. Загрузите систему и в командной строке посмотрите размер свободного места на каждом разделе.
  2. Если вы работаете на физической машине, вставьте в компьютер флешку или другой извлекаемый носитель данных. Убедитесь, что файловая система на нем подмонтировалась автоматически. Отмонтируйте сменный носитель вручную и затем примонтируйте его в другой каталог.
  3. Если вы работаете в виртуальной машине, установите дополнения гостевой ОС и настройте общую папку между хостовой и гостевой операционными системами. Убедитесь, что она функционирует в обе стороны.
  4. (*) Если на вашей системе не настроена гибернация, настройте ее. При необходимости, увеличьте размер файла подкачки.

Контрольные вопросы

  1. Как можно из командной строки узнать размер свободного места на жестком диске?
  2. В чем разница между файлом устройства и разделом жесткого диска?
  3. Как можно настроить автоматическое монтирование разделов при загрузке системы?
  4. Что такое файл подкачки? Чем он отличается от раздела подкачки? Для чего они служат?
  5. Чем отличается механизм подключения файловых систем в Linux и Windows?

Практическая работа - первый сценарий bash

Основное задание

В данной работе мы напишем для вывода фразы “Hello world!” специальный сценарий.

  1. Создайте файл hello.sh.
  2. Откройте данный файл для редактирования в текстовом редакторе.
  3. Запишите первую строку файла: #!/bin/bash. Это так называемый “шебанг” - специальная инструкция, сообщающая операционной системе, что данный файл нужно воспринимать именно как Bash-сценарий и использовать для его выполнения командную оболочку Bash.
  4. Запишите вторую строку в файл: echo “Hello world!”. Данная команда выводит на экран фразу “Hello world!”.
  5. Выполните полученный сценарий: bash hello.sh
  6. Для того чтобы сценарий можно было выполнить как обычную программу, нужно сделать файл сценария исполняемым: chmod +x hello.sh
  7. Попробуйте запустить сценарий как обычную программу: ./hello.sh.
  8. Попробуйте запустить сценарий без указания пути: hello.sh. Данная команда не работает, так как она отсутствует в перечне путей в переменной $PATH. $PATH содержит список каталогов, разделенных “:”, в которых командная оболочка последовательно ищет исполняемый файл.
  9. Создайте в домашнем каталоге каталог bin и переместите туда файл hello.sh.
  10. Добавьте директорию ~/bin в переменную $PATH оператором конкатенации строк bash.
  11. Попробуйте запустить сценарий без указания пути: hello.sh. Так как сценарий теперь расположен по пути, который есть в $PATH, команда должна сработать и вывести на экран “Hello world!”.

Примечание. Данный сценарий будет доступен только текущему пользователю. Для того чтобы сценарий работал у всех пользователей системы, его нужно скопировать в каталог /usr/local/bin (для этого потребуются права root).

Задания для самостоятельного выполнения

  1. Разработать сценарий, который создаёт каталог /tmp/shared и устанавливает на него права доступа rwxrwxrwx.
  2. Получите и выведите на экран, используя переменные окружения, имена текущего каталога и домашнего каталога.
  3. Создайте новую переменную NEWVAR со значением 1982.
  4. Создайте скрипт, который создает пользователя с именем, переданным скрипту как первый параметр и паролем, который передан скрипту как второй параметр.
  5. (*) Создать скрипт, осуществляющий вывод меню, состоящего из следующих пунктов :
    1. текущий пользователь,
    2. объем используемой памяти,
    3. объем дискового пространства,
    4. запущенные процессы,
    5. процессы, запущенные текущим пользователем,
    6. системная дата и время,
    7. время запуска системы
    8. выход,

    и вывод соответствующей информации в зависимости от выбранного пункта меню. Процесс повторять до тех пор, пока не будет выбран пункт меню «выход».

  6. (*) Создайте скрипт, который устанавливает в систему СУБД PostgerSQL, создает нового пользователя, заводит соответствующую роль в базе данных, создает базу данных в PostgerSQL, дает данному пользователю все права в этой базе, открывает к СУБД доступ по сети с удаленных машин.

Необходимые команды следует добавить в тот же файл сценария, который создавался для выполнения основного задания. Также необходимо добавить комментарии (пояснения, где какое задание выполнено).

Практическая работа - запуск задач по расписанию

Цель работы

Изучить работу стандартного планировщика задач cron, научиться использовать его для регулярного выполнения административных задач.

Основное задание

  1. Пишем пустой скрипт с расширением .sh и запускаем его. Скрипт - это простой текстовый файл, в первой строке которого содержится шебанг:
1
#!/usr/bin/bash
  1. Делаем так, чтобы скрипт можно было запускать без указания пути
  2. Делаем так, чтобы скрипт инициализировал DATE и записывал туда значение времени, затем выводил на экран
  3. Делаем так, чтобы вместо вывода на экран создавался файл в директории подобный /tmp/14-05-01.txt
  4. Делаем так, чтобы в файл записывалось время создания
  5. Используя CRON заставляем скрипт исполняться ежеминутно
  6. Через 10 минут проверяем, чтобы в директории было столько же файлов, сколько прошло минут
  7. Обнаруживаем ошибку
  8. Используя find делаем так, чтобы директория проверялась раз в 10 минут и удаляла файлы, созданные больше, чем 17 минут назад

Методические указания1

Cron используется для планирования задач, которые будут выполняться периодически. Вы можете настроить команды или сценарии, которые будут повторяться в заданное время. Cron — один из самых полезных инструментов в Linux или UNIX. Служба(daemon) cron работает в фоновом режиме и постоянно проверяет файл /etc/crontab и каталог /etc/cron.*/. Он также проверяет каталог /var/spool/cron/.

Crontab — это команда, используемая для установки, удаления или вывода файла конфигурации cron, используемого для управления демоном cron. Каждый пользователь может иметь свой собственный файл задач crontab, и хотя эти файлы хранятся в /var/spool/cron/crontabs, они не предназначены для прямого редактирования. Вам нужно использовать команду crontab для редактирования или настройки ваших собственных заданий, чтобы планировщик Cron работал корректно.

Существуют различные типы файлов конфигурации:

Системный Сrontab: Обычно используется системными службами и критическими заданиями, требующими привилегий root доступа. Шестое поле (см. ниже описание поля) — это имя пользователя которое по умолчанию присвоено команде. Это дает системе возможность запускать команды от разных пользователей.

Пользовательский crontab: Пользователь может установить свои собственные задания в программе планировщик Cron, используя команду crontab. Шестое поле — это команда для запуска, и все команды будут выполняться от пользователя, который задал их в своем собственном crontab.

Чтобы отредактировать файл crontab, введите следующую команду в командной строке оболочки Unix / Linux:

1
crontab -e
Синтаксис crontab (описание полей)
1
1 2 3 4 5 /path/to/command arg1 arg2

Где цифры обозначают:

  • 1: Минуты (0-59)
  • 2: Часы (0-23)
  • 3: День (0-31)
  • 4: Месяц (0-12 [12 == Декабрь])
  • 5: День недели (0-7 [7 или 0 == sunday])
  • /path/to/command — имя скрипта или команды для выполнения по расписанию

Легко запоминаемый формат:

1
2
3
4
5
6
7
8
* * * * * Команда, которая будет выполнена
- - - - -
| | | | |
| | | | - День недели (0 - 7) (воскресенье = 0 или 7)
| | | --- Месяц (1 - 12)
| | --- День месяца (1 - 31)
| ---- Час (0 - 23)
----- Минута (0 - 59)

Пример

1
2
3
4
5
6
7
8
# выполнять скрипт backupscript каждые 5 минут #
*/5 * * * * /root/backupscript.sh

# выполнять скрипт backupscript каждый день в час ночи #
0 1 * * * /root/backupscript.sh

# выполнять скрипт каждый месяц первого числа в три часа ночи пятнадцать минут #
15 3 1 * * /root/backupscript.sh
Как использовать операторы?

Оператор позволяет указать несколько значений в поле. Существует три оператора:

Звездочка (*): этот оператор задает все возможные значения для поля. Например, звездочка в поле «Часы» будет эквивалентна каждому часу, а звездочка в поле месяца будет эквивалентна каждому месяцу и т.д.

Запятая (,): Этот оператор задает список значений, например: «1,5,10,15,20,25».

Тире (-): Этот оператор задает диапазон значений, например: «5-15» дней, что эквивалентно набору «5,6,7,8,9 … …, 13,14,15», при использования оператора «Запятая».

Слеш (/): этот оператор задает значение шага, например: «0-23 /» можно использовать в поле часов, чтобы указывать выполнение команды каждый час. Шаги также разрешены после звездочки, поэтому, если вы хотите выполнять что-то каждые два часа, просто используйте «*/2».

Используйте специальную строку, чтобы сэкономить время

Вместо первых пяти полей вы можете использовать любую из восьми специальных строк. Планировщик Cron позволяет такую настройку. Это не только сэкономит ваше время, но и улучшит читаемость.

Специальная строка Значение
@reboot Запускается только один раз при запуске.
@yearly Запускается раз в год, «0 0 1 1 *».
@annually Такое же, как у @yearly
@monthly Запускается раз в месяц, «0 0 1 * *».
@weekly Выполняется раз в неделю, «0 0 * * 0».
@daily Выполняется один раз в день, «0 0 * * *».
@midnight Такое же, как у @daily.
@hourly Запускается один раз в час, «0 * * * *».

Пример:

1
2
# Запуск команды ntpdate каждый час #
@hourly /path/to/ntpdate

Задания для самостоятельного выполнения

  1. После выполнения работы просмотрите системный журнал и найдите в нем (автоматически) записи, соответствующие выполнению вашего скрипта. Подсчитайте количество запусков.
  2. Напишите скрипт автоматического архивирования домашней папки. Напишите установочный скрипт, который спрашивает пользователя о периодичности архивации и автоматический добавляет скрипт в расписание.

Контрольные вопросы

  1. Как можно запретить определенным пользователям запуск заданий планировщика?
  2. Как можно просмотреть или удалить расписание текущего пользователя?
  3. Что такое демонизация процесса? Зачем оно нужно?
  4. Как можно пользоваться специальными папками cron для планирования задач?

Notes

Практическая работа - работа с контрольными суммами

Цель работы

Научиться работать с контрольными суммами для отслеживания изменений и целостности файлов пакетов.

Основное задание

  1. Создаём пустой файл и вписываем что-нибудь
  2. Копируем с сохранением всех прав в другой файл с любым названием и содержимым
  3. Сравниваем контрольные суммы
  4. Меняем содержимое любого из файлов и смотрим разницу в контрольных суммах
  5. Создаём пользователя и задаём ему пароль
  6. Разбираемся с /etc/passwd, /etc/shadow, /etc/group
  7. Делаем так, чтобы, если нет файла /tmp/passwd.backup, /etc/passwd копировался в /tmp/passwd.backup, а если /tmp/passwd.backup есть, то сравнивался с /etc/passwd
  8. Если различаются, то пусть копируется, если нет, пусть завершает работу скрипта

Методические указания1

Контрольная сумма - это цифра или строка, которая вычисляется путем суммирования всех цифр нужных данных. Ее можно использовать в дальнейшем для обнаружения ошибок в проверяемых данных при хранении или передаче. Тогда контрольная сумма пересчитывается еще раз и полученное значение сверяется с предыдущим.

Контрольные суммы Linux с вычисляемые по алгоритму MD5 (Message Digest 5) могут быть использованы для проверки целостности строк или файлов. MD5 сумма - это 128 битная строка, которая состоит из букв и цифр. Суть алгоритма MD5 в том, что для конкретного файла или строки будет генерироваться 128 битный хэш, и он будет одинаковым на всех машинах, если файлы идентичны. Трудно найти два разных файла, которые бы выдали одинаковые хэши.

В Linux для подсчета контрольных сумм по алгоритму md5 используется утилита md5sum. Вы можете применять ее для проверки целостности загруженных из интернета iso образов или других файлов.

Эта утилита позволяет не только подсчитывать контрольные суммы linux, но и проверять соответствие. Она поставляется в качестве стандартной утилиты из набора GNU, поэтому вам не нужно ничего устанавливать.

Синтаксис команды md5sum очень прост:

1
md5sum опции файл

Опций всего несколько и, учитывая задачи утилиты, их вполне хватает:

-c - выполнить проверку по файлу контрольных сумм;

-b - работать в двоичном формате;

-t - работать в текстовом формате;

-w - выводить предупреждения о неверно отформатированном файле сумм;

–quiet - не выводить сообщения об успешных проверках.

Сначала скопируйте файл /etc/group в домашнюю папку чтобы на нем немного поэкспериментировать:

1
cp /etc/group groups

Например, давайте подсчитаем контрольную сумму для файла /etc/group:

1
md5sum groups

Или вы можете сохранить сразу эту сумму в файл для последующей проверки:

1
md5sum groups > groups.md5

Затем каким-либо образом измените этот файл, например, удалите первую строчку и снова подсчитайте контрольные суммы:

1
md5sum groups

Как видите, теперь значение отличается, а это значит, что содержимое файла тоже изменилось. Дальше верните обратно первую строчку root:x:0: и скопируйте этот файл в groups_list и

1
cp groups groups_list

Затем опять должна быть выполнена проверка контрольной суммы linux:

1
md5sum groups_list

Сумма соответствует первому варианту, даже несмотря на то, что файл был переименован. Обратите внимание, что md5sum работает только с содержимым файлов, ее не интересует ни его имя, ни его атрибуты. Вы можете убедиться, что оба файла имеют одинаковые суммы:

1
md5sum groups groups_list

Вы можете перенаправить вывод этой команды в файл, чтобы потом иметь возможность проверить контрольные суммы:

1
md5sum groups groups_list > groups.md5

Чтобы проверить, не были ли файлы изменены с момента создания контрольной суммы используйте опцию -c или –check. Если все хорошо, то около каждого имени файла появится слово OK или ЦЕЛ:

1
md5sum -c groups.md5

Но теперь вы не можете переименовывать файлы, потому что при проверке утилита будет пытаться открыть их по имени и, естественно, вы получите ошибку. Точно так же все работает для строк:

1
2
echo -n "Losst" | md5sum -
echo -n "Losst Q&A" | md5sum -

Из этой статьи вы узнали как выполняется получение и проверка контрольной суммы linux для файлов и строк. Хотя в алгоритме MD5 были обнаружены уязвимости, он все еще остается полезным, особенно если вы доверяете инструменту, который будет создавать хэши.

Проверка целостности файлов Linux - это очень важный аспект использования системы. Контрольная сумма файла Linux используется не только вручную при проверке загруженных файлов, но и во множестве системных программ, например, в менеджере пакетов.

Задания для самостоятельного выполнения

  1. Возьмите скрипт, который был создан на предыдущей лабораторной работе. Создайте установочный скрипт, который проверяет целостность скрипта, сравнивая контрольную сумму с заранее сохраненным значением. При совпадении он должен создать задачу по расписанию, а при несовпадении - выдать ошибку и завершиться.
  2. Создайте скрипт, который проверяет целостность основных системных конфигурационных файлов и при обнаружении ошибки восстанавливает их из архивной копии. Добавьте возможность пересчета контрольных сумм при санкционированных изменениях (одновременное сохранение новых копий в архиве). Добавьте возможность регулярной проверки. Реализуйте все функции в одном скрипте, использующем несколько опций.

Контрольные вопросы

  1. Какие еще существуют алгоритмы вычисления контрольных сумм?
  2. Для чего применяются контрольные суммы?

Notes

Практическая работа - утилиты обработки текста

Цель работы

Ознакомиться со стандартными средствами UNIX-подобных операционных систем, предназначенными для обработки текстовой информации.

Основное задание

  1. Войти в систему с собственной учетной записью.
  2. Вывести расширенный список процессов (ps aux) и сохранить эту информацию в файл ps.out
  3. Выполнить сортировку файла ps.out по имени пользователя-владельца процесса, сохранить результат в файл sorted.ps
  4. Разделить сортированную информацию из файла sorted.ps по нескольким файлам, в каждом файле - один ключ сортировки (например, файл root.ps - содержит строки, начинающиеся со слова root, user.ps - со слова user и т.д.)
  5. Добавить в начало каждой строки созданных файлов текст <li> (тег разметки списков языка HTML), результаты сохранить в файлах исходное_имя.html (например).
  6. Подсчитать количество строк в каждом из полученных файлов (это значение будет соответствовать числу процессов, запущенных пользователем). Результаты объединить со строкой вида:

    1
    
     <p><b>Итого процессов: NN</b>
    

    где NN - количество процессов, запущенных пользователем и сохранить в отдельные файлы (например root.total, user.total и т.п).

  7. Создать файл index.html следующего содержания:

    1
    2
    3
    4
    
     <html> \
     <title>Статистика процессов</title> \
     <body> \
     <h1>Распределение процессов по пользователям</h1>
    
  8. Командами обработки текста последовательно добавить в файл index.html ранее созданные файлы, разделенные строкой “<hr noshade>” (например в таком порядке: файл root.html, строка-разделитель, файл root.total, user.html, строка-разделитель, user.total и т.д.). Завершить формирование файла добавлением строки вида:

    1
    
     </body></html>
    
  9. Просмотреть полученный файл (index.html) в веб-браузере.
  10. Создать скрипт, который автоматизирует проделанные операции.

Методические указания

Редактирование текстовых файлов одна из наиболее часто выполняемых работ на компьютере. Соответственно и программ для обработки текста разработано множество. Они отличаются друг от друга в той или иной степени, однако есть существенное различие, связанное с двумя типами текстовых файлов, которые могут быть созданы такими программами.

Первый тип - это простые ASCII-файлы, использующие код ASCII для представления символов. К этому же классу отнесем и те файлы, которые содержат специальные служебные символы или последовательности символов кода ASCII, используемые для форматирования текста при выводе на экран и принтер. Но существенно то, что эти форматирующие последовательности (почти) не мешают Вам прочитать текст, содержащийся в файле с помощью любого средства просмотра или простейшего текстового редактора. Примерами таких файлов могут служить файлы, создаваемые редакторами типа встроенного редактора программы Midnight Commander, файлы в формате .html, файлы, создаваемые программой notepad в Windows и vi в UNIX.

Второй тип - это файлы, использующие собственный формат для представления текста (в которых символы текста представлены специальными последовательностями). Текст в таких файлах невозможно прочитать без той программы, в которой файл создавался, или специальной программы-просмотрщика. Примеры: файлы в форматах .doc (MS Word), .rtf (Reach text format), .odt (текстовый документ OpenOffice Writer).

В ЮНИКС-системах традиционно большое число узкоспециализированных утилит, среди которых немало и команд обработки текста. Однако, прежде чем перейти к рассмотрению их возможностей, необходимо сделать отступление в сторону регулярных выражений - универсального инструмента обработки текстов.

Регулярные выражения

Регулярные выражения - это высокоуровневое средство обработки информации, представленной в виде символьных последовательностей: строк и текстов. С помощью регулярных выражений можно формировать шаблоны поиска и замены фрагментов текста любой сложности. Построение таких шаблонов в общем случае задача не совсем тривиальная и требует определенной практики. О подробностях использования языка регулярных выражений можно прочитать в специальной литературе, здесь же приведем список исходных шаблонов, а ниже - несколько примеров использования.

Шаблон Назначение
. Заменяет любой символ. Выражение "п.уть" находит "путь" и "пить"
^Петя Находит слово, только если оно расположено в начале абзаца.
Петя$ Находит слово, только если оно расположено в конце абзаца.
* Предыдущий символ может повторяться много раз (от нуля до бесконечности): например, "Аб*в" находит "Ав", "Абв", "Аббв", "Abbbc" и так далее. Комбинация .* может использоваться для любого символа.
+ Предыдущий символ должен присутствовать хотя бы один раз или в неограниченных количествах: "AX.+4" находит "AX 4", но не "AX4"Всегда находится наиболее длинный текст внутри абзаца. Если абзац содержит текст AX 4 AX4, то будут найдены от первой A до последней 4.
? Символ перед ? может отсутствовать, либо присутствовать только один раз. "Тексты?" находит слова "Текст" и "Тексты".
\C Абсолютно точно находит этот символ (не цифру!), в данном случае C (если, например, нужно найти знак доллара в регулярных выражениях: \$)
\n Находит жесткий разрыв строк, вставленный с помощью Shift+Enter.
\t Находит символ табуляции
\> Элемент поиска должен присутствовать в конце слова: "нот\>" находит "блокнот", но не "ноты".
< Элемент поиска должен присутствовать в начале слова: "\>нот" находит "ноты", но не "блокнот".
^$ Ищет пустые абзацы.
^. Ищет первый символ абзаца.
& Указывает на найденный текст. Используется при замене.
[abc123] Находит все символы в скобках
[a-e] Находит все символы между a и e
[a-eк-о] Находит все символы между буквами a-e и к-о.
[^a-в] Находит все символы, кроме a-в
\xXXXX Находит все символы с четырехзначным шестнадцатеричным кодом XXXX.Номер символа кода зависит от используемого шрифта.
этот|тот Находит все "этот" и все "тот".
{2} Символ перед открывающей скобкой должен присутствовать столько раз, сколько указано в скобках. 8{2} находит 88.
{1,2} Символ перед открывающей скобкой должен присутствовать столько раз, сколько указано в скобках. 8{1,2} находит 8 и 88.
( ) Круглые скобки следует использовать для задания символов внутри скобок, как ссылок. После этого можно ссылаться на первую ссылку в текущем выражении с \1, на вторую ссылку с \2 и так далее. Если текст содержит число 13487889 и вы ищете регулярное выражение (8)7\1\1, то будет найдено число 8788.
[:digit:]? Находит число (0 до 9). [:digit:]* находит последовательность цифр.
[:space:]? Находит пропуски: пробелы и символы табуляции.
[:print:]? Находит печатаемые символы.
[:cntrl:]? Находит непечатаемые символы.
[:alnum:]? Находит буквенно-цифровые символы (цифры и буквы).
[:alpha:]? Находит буквенные символы (буквы).
[:lower:]? Находит буквы строчные буквы.
[:upper:]? Находит буквы прописные буквы.
Для логического объединения выражений с помощью операторов И/ИЛИ, необходимо использовать скобки. Например, “((a[A-Я]*) (аб[А-Я]*) (б[А-Я]*))$” находит элементы, начинающиеся с пробела и идущих затем “a” или “ab” или “b” и присутствующих в конце абзаца.
Специализированные команды

Специализированные команды обработки текста, такие как cat, cut, sort, split и пр., предназначены для решения специфичных задач, например для сортировки, фильтрации или объединения строк. Приведем несколько примеров использования таких команд (подробное описание в man имя_команды или имя_команды –help).

Команда cat

Использование:

1
cat [КЛЮЧ] [ФАЙЛ]...

Сцепляет ФАЙЛ(ы) или стандартный ввод на стандартный вывод. Если ФАЙЛ не задан или задан как -, читает стандартный ввод.

1
2
3
4
5
6
7
8
9
10
11
12
cat errors.log
    Mar 2 09:13:37 stilo kernel: ACPI: PCI Interrupt 0000:00:1d.0[A] -> Link [LNKA] -> GSI 5 (level, low) -> IRQ 5 
    Mar 2 09:13:37 stilo kernel: PCI: Setting latency timer of device 0000:00:1d.0 to 64 
    Mar 2 09:13:37 stilo kernel: usb usb1: root hub lost power or was reset 
    Mar 2 09:13:37 stilo kernel: ACPI: PCI Interrupt 0000:00:1d.1[B] -> Link [LNKD] -> GSI 11  

cat -n errors.log
    1   Mar 2 09:13:37 stilo kernel: ACPI: PCI Interrupt 0000:00:1d.0[A] -> Link [LNKA] -> GSI 5 (level, low) -> IRQ 5 
    2   Mar 2 09:13:37 stilo kernel: PCI: Setting latency timer of device 0000:00:1d.0 to 64 
    3   Mar 2 09:13:37 stilo kernel: usb usb1: root hub lost power or was reset 
    4   Mar 2 09:13:37 stilo kernel: ACPI: PCI Interrupt 0000:00:1d.1[B] -> Link [LNKD] -> GSI 11  
...
Команда cut

Использование:

1
cut [КЛЮЧ]... [ФАЙЛ]...

Печатает выбранные части строк из каждого ФАЙЛА на стандартный вывод. Если ФАЙЛ не задан или задан как -, читает стандартный ввод.

вывести первые 16 символов каждой строки:

1
2
3
4
5
6
cut -c 1-16 errors.log // __ 
    Mar 3 15:43:53  
    Mar 3 16:22:08  
    Mar 3 17:09:05  
    Mar 3 17:09:14  
    ... 

вывести строки, начиная с 23-го символа

1
2
3
4
5
6
7
8
9
10
cut -c 23- errors.log
    kernel: scsi 2:0:0:0: Direct-Access USB 2.0 Flash Disk 0.00 PQ: 0 ANSI: 2 
    kernel: sd 2:0:0:0: [sdb] 2015231 512-byte hardware sectors (1032 MB) 
    kernel: sd 2:0:0:0: [sdb] Write Protect is off 
    kernel: sd 2:0:0:0: [sdb] Mode Sense: 00 00 00 00 
    kernel: sd 2:0:0:0: [sdb] Assuming drive cache: write through 
    kernel: usb-storage: device scan complete 
    hald: mounted /dev/sdb1 on behalf of uid 1000 
    syslog-ng[2237]: STATS: dropped 0 
    ... 

выбрать символы с 8 по 16 и с 23 до конца строки, использовать “пробел” как разделитель

1
2
3
4
5
6
7
cut -c 8-16,23- errors.log --output-delimiter=' '
    15:43:50 kernel: scsi 2:0:0:0: Direct-Access USB 2.0 Flash Disk 0.00 PQ: 0 ANSI: 2 
    15:43:50 kernel: sd 2:0:0:0: Attached scsi generic sg2 type 0 
    15:43:50 kernel: usb-storage: device scan complete 
    15:43:53 hald: mounted /dev/sdb1 on behalf of uid 1000 
    16:22:08 syslog-ng[2237]: STATS: dropped 0 
    ... 

вывести только 1,3 и 4 поля, разделенные пробелом; использовать “->” в качестве нового разделителя

1
2
3
4
5
6
7
cut -f 1,3,4 errors.log --delimiter=' ' --output-delimiter='->'
    Mar->3->15:43:50 
    Mar->3->15:43:53 
    Mar->3->16:22:08 
    Mar->3->17:09:05
    Mar->3->17:09:14 
    ...
Команда sort

Использование:

1
sort [КЛЮЧ]... [ФАЙЛ]...

Печатает сортированное слияние всех ФАЙЛ(ов) на стандартный вывод. Если ФАЙЛ не задан или задан как -, читает стандартный ввод.

сортировать файл по убыванию, отбрасывая повторы строк; результат записать в новый файл

1
2
3
4
5
6
7
8
9
sort -ur errors.log -o e.log
cat e.log
    Dec 10 21:35:33 stilo kernel: ACPI: AC Adapter [AC] (on-line) 
    Dec 10 21:35:31 stilo auditd[2920]: Init complete, auditd 1.2.6 listening for events 
    Dec 10 21:35:30 stilo syslog-ng[2511]: Changing permissions on special file /dev/xconsole 
    Dec 10 21:35:30 stilo auditd: Config file /etc/audit/auditd.conf doesn\'t exist, skipping 
    Dec 10 21:35:29 stilo network: Starting the NetworkManagerDispatcher 
    Dec 10 21:35:29 stilo dhcdbd: Started up. 
    Dec 10 21:35:28 stilo syslog-ng[2511]: syslog-ng version 1.6.11 starting
Команда split

Использование:

1
split [КЛЮЧ] [ФАЙЛ [ПРЕФИКС]]

Выводит фиксированного размера части ФАЙЛА в файлы ПРЕФИКСaa, ПРЕФИКСab, …; по умолчанию размер части равен 1000 строк, а ПРЕФИКС равен ‘x’. Если ФАЙЛ не задан или задан как -, читает стандартный ввод.

разделить по 1000 строк в файлы с префиксом “log_”

1
2
3
4
split e.log log_
ls log
    log_aa log_ac log_ae log_ag log_ai log_ak log_am log_ao log_aq log_as 
    log_ab log_ad log_af log_ah log_aj log_al log_an log_ap log_ar  

использовать числовые суффиксы в именах

1
2
3
4
split -d e.log err_** //  
ls err* \
    err_00 err_02 err_04 err_06 err_08 err_10 err_12 err_14 err_16 err_18  
    err_01 err_03 err_05 err_07 err_09 err_11 err_13 err_15 err_17 
Команда strings

Использование:

1
strings [КЛЮЧ] [ФАЙЛ(ы)]

Выводит строки из ФАЙЛА(ов) (stdin по умолчанию)

вывести строки, длиннее 350 байт из всех файлов с именем, начинающимся с “err”, при выводе строк показывать имя файла

1
2
3
4
strings -fn 350 err
    errors.log: 2462225 Jan 9 10:08:58 stilo suse_register[4313]: Argument Dump: $VAR1 = ... 
    err_04.log: 2462225 Jan 9 10:08:58 stilo suse_register[4313]: Argument Dump: $VAR1 = ... 
    errors.log~: 3477727 Jan 9 10:08:58 stilo suse_register[4313]: Argument Dump: $VAR1 = ...
Команда tail

Использование:

1
tail [КЛЮЧ]... [ФАЙЛ]...

Печатает последние 10 строк каждого из ФАЙЛОВ на стандартный вывод. Если задано несколько ФАЙЛОВ, сначала печатает заголовок с именем файла. Если ФАЙЛ не задан или задан как -, читает стандартный ввод.

вывести 2 последние строки с указанием имени файла; обновлять информацию по мере записи в файл

1
2
3
4
tail -fv -n2 access_log
    192.168.0.191 - - [04/Mar/2008:14:02:38 +0600] "GET /nettech/work01/ HTTP/1.1" 200 13776 "-" "Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.8.0.3) Gecko/20060524 ASPLinux/1.5.0.3-0.110am Firefox/1.5.0.3 pango-text" 
    192.168.0.199 - - [04/Mar/2008:14:03:05 +0600] "GET /tasks.shtml HTTP/1.1" 200 18692 "http://aag.asoiu/tasks.shtml" "Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.8.0.3) Gecko/20060524 ASPLinux/1.5.0.3-0.110am Firefox/1.5.0.3 pango-text" 
    ...
Команда head

Использование:

1
head [КЛЮЧ]... [ФАЙЛ]...

Печатает первые 10 строк каждого ФАЙЛА на стандартный вывод. Если задано несколько ФАЙЛОВ, сначала печатает заголовок с именем файла. Если ФАЙЛ не задан или задан как -, читает стандартный ввод.

вывести по 3 первых строки из файлов с именем err_любыесимволы

1
2
3
4
5
6
7
8
head -vn 3 err_*
==> err_00 \<== 
Oct 16 21:35:53 stilo gconfd (aag-5419): Обнаружен разрешённый адрес  
Nov 8 07:56:43 stilo syslog-ng[2537]: syslog-ng version 1.6.11 going down 
Nov 8 07:56:42 stilo kernel: Kernel logging (proc) stopped. 
==> err_01 \<== \
Nov 27 21:13:00 stilo gconfd (aag-5423): Обнаружен разрешённый адрес "xml:readonly:/etc/opt/gnome/gconf/gconf.xml.mandatory" к источнику конфигурации только-для-чтения в позиции 0 
...

Самостоятельно рассмотрите назначение и параметры команд uniq и wc.

Команда grep

Синтаксис

1
2
grep [КЛЮЧ(и)] ОБРАЗЕЦ [ФАЙЛЫ(ы)...] 
grep [КЛЮЧ(и)] [-e ОБРАЗЕЦ | -f ФАЙЛЫ] [ФАЙЛЫ(ы)]

Утилита grep выполняет поиск образца в текстовых файлах и выдает все строки, содержащие этот образец. Она использует компактный недетерминированный алгоритм сопоставления.

Будьте внимательны при использовании в списке_образцов символов $, *, [, ^, |, (, ) и \, поскольку они являются метасимволами командного интерпретатора. Лучше брать весь список образцов в одиночные кавычки ‘… ‘.

Если имя_файла не указано, grep предполагает поиск в стандартном входном потоке. Обычно каждая найденная строка копируется в стандартный выходной поток. Если поиск осуществлялся в нескольких файлах, перед каждой найденной строкой выдается имя файла.

Опции -E и -F влияют на способ интерпретации списка образцов программой grep. Если указана опция -E, программа grep интерпретирует образцы в списке как полные регулярные выражения. Если же указана опция -F, grep интерпретирует список образцов как фиксированные строки. Если ни одна из этих опций не указана, grep интерпретирует элементы списка образцов как простые регулярные выражения.

Примеры использования

Найти все вхождения слова “network”, вывести номер каждой строки

1
2
3
4
5
grep -i -n network errors.log
    20085:Mar 2 14:28:27 stilo network: Starting the DHCP DBUS Daemon 
    20086:Mar 2 14:28:27 stilo network: Starting the NetworkManagerDispatcher 
    20087:Mar 2 14:28:27 stilo network: Starting the NetworkManager 
    ...

Поиск пустых строк

1
grep ^$ errors.log

Поиск строк, содержащих фиксированные подстроки: вывести все строки, содержащие подстроки warning, IPv6 или и ту, и другую

1
2
3
4
5
6
7
grep -E 'warning|IPv6' errors.log
    Nov 27 21:12:02 stilo ifup-wireless: eth0 warning: using NO encryption 
    Nov 27 21:12:06 stilo kernel: IPv6 over IPv4 tunneling driver 
    Nov 27 21:12:13 stilo kernel: eth0: no IPv6 routers present 
    Jan 15 12:28:15 stilo python: [7979]: warning: Unable to set locale. 
    Feb 28 09:21:51 stilo SuSEfirewall2: Warning: ip6tables does not support state matching. Extended IPv6 support disabled. 
    ... 

Поиск строк, соответствующих образцу: вывести все строки, начинающиеся с “Mar 3 09:22:26” или “Jan 9 18:28:33”

1
2
3
4
5
6
7
8
9
grep -E '^(Mar 3 09:22:26)|(Jan 9 18:28:33).{1,}$' errors.log
    Jan 9 18:28:33 stilo avahi-dnsconfd[3689]: Got SIGTERM, quitting. 
    Jan 9 18:28:33 stilo sshd[4123]: Received signal 15; terminating. 
    Jan 9 18:28:33 stilo avahi-daemon[3465]: Got SIGTERM, quitting. 
    Mar 3 09:22:26 stilo gconfd (root-3243): starting (version 2.20.0), pid 3243 user 'root' 
    Mar 3 09:22:26 stilo gconfd (root-3243): Resolved address "xml:readonly:/etc/gconf/gconf.xml.mandatory" ... 
    Mar 3 09:22:26 stilo gconfd (root-3243): Resolved address "xml:readwrite:/root/.gconf" t... 
    Mar 3 09:22:26 stilo gconfd (root-3243): Resolved address "xml:readonly:/etc/gconf/gconf..." 
    Mar 3 09:22:26 stilo gconfd (root-3243): Resolved address "xml:readonly:/etc/gconf/gconf.xml...
Потоковый редактор sed

sed (от английского Stream EDitor) — потоковый редактор. Простая, но мощная программа, выполняющая преобразования последовательного потока текстовых данных. Команда sed получает входной поток (обычно, файл) построчно, редактирует каждую строку, согласно правилам, определенным в собственном языке (sed-скрипт), и выводит результат в выходной поток.

sed часто считают не интерактивным текстовым редактором. Однако, он отличается от обычных текстовых редакторов «инвертированностью» по отношению к тексту и набору команд для его редактирования. Обычные текстовые редакторы вначале загружают весь текст документа, а затем применяют к нему команды по одной, в то время как sed вначале загружает набор команд, а затем применяет его к каждой строке текста. Так как одновременно в памяти находится только одна строка, sed может обработать произвольно большие текстовые файлы.

Следующий пример демонстрирует типичное использование sed:

1
sed -e 's/oldstuff/newstuff/g' inputFileName > outputFileName

Здесь s — команда замены; g — глобально, что означает «в во всей строке». Строка oldstuff — образец искомого текста (на основе регулярного выражения), строка newstuff - новый текст, которым нужно заменить oldstuff. Команда замены (s///) безусловно является самой мощной и часто используемой командой sed.

В Unix sed часто используется в виде фильтра при конвейерной обработке (|, или pipe):

1
generate_data | sed -e 's/x/y/'

Несколько внутренних команд sed могут быть записаны в файле (sed-скрипт, имя файла - любое) и затем применены в виде:

1
sed -f _имя_файла_с_командами_ inputFileName > outputFileName

Помимо замены, возможны и другие формы простой обработки. Например, следующий сценарий удаляет пустые строки или строки, которые содержат только пробелы:

1
sed -e '/^ *$/d' inputFileName 

Комплексные конструкции sed возможны до такой степени, что он может быть представлен как высоко специализированный, хотя и простой, язык программирования.

Синтаксис

Существует два варианта запуска sed:

1
2
sed [options] 'command' file(s) 
sed [options] —f scriptfile file(s)

В первом варианте возможно задание команды редактирования sed (заключенной в одинарные кавычки) в командной строке. Во втором варианте задается файл сценария scriptfile, содержащий команды sed. Если не заданы обрабатываемые файлы, происходит чтение со стандартного ввода.

Перечень команд sed по группам

Простое редактирование

Команда Действие
а\ Добавление текста после строки
с\ Замена текста (обычно области текста)
i\ Вставка текста перед строкой
d Удаление строк
s Замена
y Преобразование символов

Информация о строках

Команда Действие
= Отобразить порядковый номер строки
1 Отображать управляющие символы в кодах ASCII
p Отобразить строку

Обработка ввода/вывода

Команда Действие
n Пропустить текущую строку и перейти к следующей
r Послать на ввод sed содержимое другого файла
w Записать исходные строки в другой файл
q Завершить работу сценария sed (конец вывода)
Примеры использования

Замена текста

заменить одинарные междустрочные интервалы на двойные

1
sed G 

удалить двойные междустрочные интервалы

1
sed 'n;d' 

нумерация непустых строк файла (по конвейеру передается предварительно обработанный файл)

1
sed '/./=' file | sed '/./N; s/n/ /' file

подсчет количества строк (аналог “wc -l”)

1
sed -n '$=' 

добавление отступа в начало каждой строки

1
sed 's/^/\t /' 

удаление отступов (пробелы,табуляции) с начала каждой строки

1
sed 's/^[ \t]*//' 

удаляем отступы, пробелы, табуляции и с конца, и с начала строки

1
sed 's/^[ t]*//;s/[ t]*$//' 

центрируем весь текст посредине при ширине колонки 79 символов.В первом способе пробелы в начале строки нужны, а пробелы в конце строки дополняются до конца строки. Второй способ, пробелы в начале строки отбрасываются в центр строки, и нет завершающих пробелов до конца строки.

1
2
sed -e :a -e 's/^.{1,77}$/ & /;ta'
sed -e :a -e 's/^.{1,77}$/ &/;ta' -e 's/( *)1/1/'

подстановка (найти и заменить) “foo” на “bar” в каждой строке

1
2
3
4
5
sed 's/foo/bar/' # заменяет только первое вхождение в строке 
sed 's/foo/bar/4' # заменяет только 4 вхождение в строке 
sed 's/foo/bar/g' # заменяет ВСЕ вхождения в строке 
sed 's/(.*)foo(.*foo)/1bar2/' # заменяет друг за другом 
sed 's/(.*)foo/1bar/' # заменяет только завершающее слово

ЗАМЕНЯЕТ “foo” на “bar” ТОЛЬКО для строк ,содержащих “base”

1
sed '/base/s/foo/bar/g'

меняет “red”,”green”,”blue” на “purple”

1
sed 's/red/purple/g;s/green/purple/g;s/blue/purple/g'

обратный порядок строк

1
2
sed '1!G;h;$!d' # способ 1 
sed -n '1!G;h;$p' # способ 2

обратный порядок символов в строке

1
sed '/n/!G;s/(.)(.*n)/&21/;//D;s/.//'

соединяет строки (аналог “paste”)

1
sed '$!N;s/n/ /'

добавляем запятые к числовым строкам, меняя “1234567” на “1,234,567”

1
sed -e :a -e 's/(.*[0-9])([0-9]{3})/1,2/;ta' # остальные sed

добавляем пустую строку каждые пять 5 строк (после строк 5, 10, 15, 20, итд.)

1
sed 'n;n;n;n;G;' 

печать первых 10 строк файла (аналог “head”)

1
sed 10q

Вывод строк

печать только строк, которые совпадают с regexp (аналог “grep”)

1
2
sed -n '/regexp/p' # способ 1
sed '/regexp/!d' # способ 2

печать только строк, НЕ совпадающих с regexp (как “grep -v”)

1
2
sed -n '/regexp/!p' # способ 1, соответствует вышеприведенному 
sed '/regexp/d' # способ 2, простейший синтаксис

grep для AAA и BBB и CCC (в любом порядке)

1
sed '/AAA/!d; /BBB/!d; /CCC/!d'

grep для AAA и BBB и CCC (в таком же порядке)

1
sed '/AAA.*BBB.*CCC/!d'

grep для AAA или BBB или CCC (как в “egrep”)

1
sed -e '/AAA/b' -e '/BBB/b' -e '/CCC/b' -e d

печать строк длинее N символов (в примере - 65)

1
sed -n '/^.{65}/p'

печать строк короче N символов (в примере - 65)

1
sed -n '/^.{65}/!p' # способ 1, соответствует вышеприведенному

печать фрагмента файла от заданного регулярного выражения до конца файла

1
sed -n '/regexp/,$p'

печать фрагмента файла, основанная на номерах строк (в примере - строки с 8 по 12)

1
2
sed -n '8,12p' # способ 1
sed '8,12!d' # способ 2

печать только выбранной строки (в примере - 52)

1
2
3
sed -n '52p' # способ 1
sed '52!d' # способ 2
sed '52q;d' # способ 3, эффективно для больших файлов

печать каждой 7-ой строки начиная со строки 3

1
sed -n '3,${p;n;n;n;n;n;n;}'

печать части файла между двумя регулярными выражениями

1
sed -n '/regexp1/,/regexp2/p'

Удаление строк

печать всего файла, КРОМЕ части между двумя регулярными выражениями

1
sed '/regexp1/,/regexp2/d'

удаление последовательно повторяющихся строк файла (аналог “uniq”).

1
sed '$!N; /^(.*)n1$/!P; D'

удалить непоследовательные повторяющиеся строки файла.

1
sed -n 'G; s/n/&&/; /^([ -~]*n).*n1/d; s/n//; h; P'

удаление первых 10 строк файла

1
sed '1,10d'

удалить последнюю строку файла

1
sed '$d'

удалить последние 10 строк файла

1
sed -e :a -e '$d;N;2,10ba' -e 'P;D'

удалить все пустые строки файла (также как и “grep ‘.’ “)

1
2
sed '/^$/d' # способ 1
sed '/./!d' # способ 2

удалить все ПОСЛЕДОВАТЕЛЬНЫЕ пустые строки из файла кроме первых двух:

1
sed '/^$/N;/n$/N;//D'

удалить все пустые строки с начала файла:

1
sed '/./,$!d'

удалить все пустые строки в конце файла

1
sed -e :a -e '/^n*$/{$d;N;ba' -e '}' # рaботает на всех sed

удалить последнюю строку каждого параграфа

1
sed -n '/^$/{p;h;};/./{x;/./p;}'

удалить теги HTML (включая многострочные теги)

1
sed -e :a -e 's/&lt;[^>]*>//g;/&lt;/N;//ba'

Как видно из примеров, sed – своего рода оболочка для регулярных выражений, что позволяет, несмотря на ограниченный набор встроенных команд, использовать sed для сложной обработки текстов.

Практическая работа - парсинг текстовых файлов

Задания к работе

Необходимо написать shell-скрипт, который обработает текстовый файл log.txt в формате Acсess log веб-сервера Apache и выведет в консоль информацию, которая описана в секции “Расшифровка”. Этот скрипт должен использовать стандартные инструменты shell (которые включают такие утилиты, как: cut, grep, sort, awk, date и др.), но не использовать другие языки программирования, такие как C, Perl, Python и др.

Файл состоит из записей, каждая из которых занимает одну строку.

Пример записи:

1
host-24-225-218-245.patmedia.net - - [01/Oct/2006:06:33:45 -0700] "GET /example/example.atom HTTP/1.1" 304 - "-" "NetNewsWire/2.0b37 (Mac OS X; Lite; http://ranchero.com/netnewswire/)"

Формат записи:

1
<хост клиента> - - [&lt;Штамп времени с временной зоной>] <Строка HTTP-запроса (тип, URL, версия)> <Код HTTP ответа> <Количество переданных байт или '-', если ответ не имеет тела> <Строка реферера ('-' означает прямой запрос без реферера)> <Название клиента (браузер)>

Пример расшифровки:

1
01/Oct/2006:06:33:45 -0700 с хоста host-24-225-218-245.patmedia.net по протоколу HTTP/1.1 был выполнен запрос типа GET для получения ресурса, находящегося по ссылке /example/example.atom. Код ответа на запрос от сервера: 304. Такой ответ не предполагает наличия тела ответа (количество переданных байт - 0). Запрос выполнялся напрямую, а не по ссылке с другого сайта (поле реферер - пустое). Клиент использовал для обращения программу NetNewsWire/2.0b37, ОС клиента: Mac OS X

Заания для самостоятельного выполнения

  1. Модифицируйте программу так, чтобы ей можно было передать один (необязательный) параметр, в котором указать код завершения операции. При указании этого параметра, программа фильтрует содержимое файла и выводить только те строчки, которые имеют именно этот код процесса.
  2. Добавьте в программу возможность указывать ключи (количество и наименования по вашему усмотрению) для фильтрации данных по любому полю.
  3. Дополнительно оценивается корректная работа программы с несколькими ключами одновременно.

Практическая работа - диагностика сетевых подключений

Цель работы

Используя стандартные сетевые утилиты, научиться анализировать конфигурацию сети, получить свой IP-адрес, просмотреть и при необходи­мости подключить общие ресурсы, определить причину возможных неполадок, также получить информацию об использовании портов и т.д.

Задания для выполнения

  1. Выведите на экран справочную информацию по утилитам arp, ifconfig, netstat, nslookup, route, ping, traceroute, hostname. Изучите ключи, используемые при запуске утилит.
  2. Определите параметры подключения компьютера к сети, для чего откройте окно сетевых настроек.
  3. Определите те же параметры, используя консольные команды. Посмотрите, сколько сетевых интерфейсов используется в компьютере. Определите среди них основной.
  4. Определите, является ли IP-адрес компьютера публичным или приватным. Сделайте вывод о типе подключения к Интернет.
  5. Произведите расчет подсети, к которой принадлежит ваш компьютер.
  6. Произведите диагностику работоспособности сети при помощи команды ping последовательно проверив доступ к:
    1. интерфейсу обратного вызова (127.0.0.1);
    2. IP-адресу самого компьютера;
    3. IP-адресу шлюза по умолчанию;
    4. IP-адресу другого (включенного) хоста той же подсети;
    5. IP-адресу хоста из другой подсети (если вы знаете такой);
    6. IP-адресу DNS-сервера по умолчанию;
    7. IP-адресу публичного сервера Интернет (например, 8.8.8.8 - публичный DNS-сервер Гугла);
    8. DNS-имени публичного сервера;
  7. Сделайте вывод о работоспособности сети и возможных проблемах.

Методические указания

Имеются три основных варианта подключения локальной сети к Интернет:

  1. «прямое» IP-подключение,
  2. подключение через NAT,
  3. подключение через прокси-сервер.

Рассмотрим преимущества, недостатки и область применения каждого метода, а также некоторые возникающие нюансы. Выбор конкретного способа подключения зависит от потребностей пользователей, цели подключения и, в некоторой степени, финансовых возможностей.

Итак, компьютер Workstation 1. У него есть доступ, как к Интернету, так и к локальной сети. Наша задача - дать компьютерам локальной сети доступ к Интернет через подключенный к нему компьютер. Далее этот компьютер мы будем называть шлюзом или маршрутизатором.

Рассмотрение способов мы начнем с наименее часто использующегося, наиболее дорогого, но также наиболее «правильного» и естественного способа, дающего наибольшие по сравнению с другими способами возможности.

«Прямое» IP-подключение к Internet.

Для того, чтобы Ваша локальная сеть была полноценно подключена к Интернету, должны соблюдаться, как минимум, три условия:

  1. Каждая машина в локальной сети должна иметь “реальный”, интернетовский IP-адрес;
  2. Эти адреса должны быть не любыми, а выделенными Вашим провайдером для Вашей локальной сети (скорее всего, это будет подсеть класса C);
  3. На компьютере-шлюзе, подключенном к двум сетям - локальной сети и сети провайдера, должна быть организована IP-маршрутизация, т.е. передача пакетов из одной сети в другую.

В этом случае Ваша локальная сеть становится как бы частью Интернета. Собственно, это тот способ подключения, которым подключены к Интернету сами Интернет-провайдеры и хостинг-провайдеры.

В отличие от обычного подключения, рассчитанного на один компьютер, при таком подключении “под клиента” выделяется не один IP-адрес, а несколько, так называемая “IP-подсеть”.

При таком способе подключения Вы можете организовать в своей сети сервисы, доступные из Интернета - ведь при данном подключении не только Интернет полностью доступен из Вашей сети, но и Ваша сеть - из Интернета, т.к. является его частью.

Однако такая “прозрачность” Вашей сети резко снижает ее защищенность - ведь любые сервисы в локальной сети, даже предназначенные для “внутреннего” использования, станут доступными извне через Интернет. Чтобы это не имело места, доступ в локальную сеть извне несколько ограничивают. Обычно это делается установкой на шлюзе программы-firewall. Это своеобразный фильтр пакетов, проходящих из одной сети в другую. Путем его настройки можно запретить вход-выход из локальной сети пакетов, соответствующих определенным критериям - типу IP пакета, IP-адресу назначения, TCP/UDP-порту и т.п.

Firewall решает такие задачи, как:

  • блокировку доступа извне к определенным TCP/IP-сервисам локальной сети.
  • блокировку доступа к определенным компьютерам локальной сети. Таким образом, можно запретить доступ извне ко всем машинам, кроме определенных серверов, предназначенных для доступа из Интернет.
  • защиту от троянских программ на сетевом уровне.

Несмотря на универсальность такого метода подключения локальной сети к Интернет, этот метод имеет недостатки. Благодаря им, его реально и используют только лишь те организации, которым надо сделать свои сервера доступными из Интернет - в основном, те же интернет-провайдеры и хостинг-провайдеры, а также информационные службы. Самый главный недостаток заключается в дороговизне выделения IP-адресов и уж тем более IP-подсетей, к тому же эту плату надо вносить периодически.

Поэтому на практике рассмотрим другие, описанные далее способы, не требующие больших затрат и, что самое главное, позволяющие подключить локальную сеть через обычное подключение с одним внешним IP-адресом.

Подключение через NAT (IP-маскарадинг)

Технология Network Address Translation (NAT) - “трансляция сетевых адресов” позволяет нескольким машинам локальной сети иметь доступ к Интернет через одно подключение и один реальный внешний IP-адрес.

Для того, чтобы компьютера локальной сети могли устанавливать соединения с серверами сети Интернет, нужно, чтобы:

  • IP-пакеты, адресованные серверу в Интернет, смогли его достигнуть;
  • ответные IP-пакеты, идущие от сервера Интернет на машину в локальной сети, также смогли ее достигнуть.

С первым условием проблем не возникает, а как быть со вторым? Ведь компьютера локальной сети не имеют своего “реального” интернетовского IP-адреса! Как же они могут получать IP-пакеты из Интернет?!

А работает это следующим образом - на компьютере-шлюзе стоит программа NAT-сервера. Компьютер-шлюз прописан на машинах локальной сети как “основной шлюз”, и на него поступают все пакеты, идущие в Интернет (не адресованные самой локальной сети). Перед передачей этих IP-пакетов в Интернет NAT-сервер заменяет в них IP-адрес отправителя на свой, одновременно запоминая у себя, с какой машины локальной сети пришел этот IP-пакет.

Когда приходит ответный пакет (на адрес шлюза, конечно), NAT определяет, на какую машину локальной сети его надо направить. Затем в полученном пакете меняется адрес получателя на адрес нужной машины, и пакет доставляется этой машине через локальную сеть.

Как видим, работа NAT-сервера прозрачна для машин локальной сети (как и работа обычного IP-маршрутизатора).

Единственным принципиальным ограничением этого метода подключения локальной сети к Internet является невозможность установить входящее TCP-соединение из Интернет на машину локальной сети. Однако для “клиентских” сетей этот недостаток превращается в достоинство, резко увеличивающее (по сравнению с первым методом подключения) их защищенность и безопасность. Администраторы некоторых провайдеров даже употребляют слова NAT и Firewall как синонимы.

Подключение через прокси-сервер

Это самый простой тип подключения. При этом никакой маршрутизации IP-пакетов между локальной сетью и сетью Интернет не происходит. Машины локальной сети работают с Интернет через программу-посредник, так называемый прокси-сервер, установленный на компьютере-шлюзе.

Основной особенностью этого метода является его “непрозрачность”. Если, скажем, в случае NAT программа клиент просто обращается к Интернет-серверу, не “задумываясь”, в какой сети и через какую маршрутизацию она работает, то в случае работы через прокси-сервер программа должна явно обращаться к прокси-серверу. Мало того, клиентская программа должна уметь работать через прокси-сервер. Однако проблем с этим не возникает - все современные и не очень браузеры умеют работать через прокси-сервера.

Другой особенностью является то, что прокси-сервер работает на более высоком уровне, чем, скажем, NAT. Здесь уже обмен с Internet идет не на уровне маршрутизации пакетов, а на уровне работы по конкретным прикладным протоколам (HTTP, FTP, POP3…). Соответственно для каждого протокола, по которым должны “уметь” работать машины локальной сети, на шлюзе должен работать свой прокси-сервер.

Эта “протокольная зависимость” и есть основной недостаток этого метода подключения как самостоятельного. Однако, с другой стороны, “маршрутизация” на таком высоком уровне может дать и немалые преимущества.

Почти каждый интернет-провайдер имеет один или несколько прокси- серверов, через которые рекомендует работать своим клиентам. Несмотря на то, что это совершенно необязательно (как правило, клиент провайдера может обращаться к Интернет напрямую), это дает выигрыш в производительности, а при повременной оплате,

соответственно, экономить время он-лайн. Это происходит потому, что прокси-сервера способны кэшировать (запоминать) запрашиваемые пользователем документы, и при следующих к ним обращениях выдавать копию из кэша, что быстрее, чем повторно запрашивать с интернет-сервера. Кроме того, прокси-сервера могут быть настроены так, что будут блокировать загрузку баннеров наиболее распространенных баннерных служб, тем самым также (порой значительно) ускоряя загрузку веб-страниц.

При установке HTTP прокси сервера в локальной сети и работе через него за счет кэширования экономится не только время, но и трафик - потому, что кэширование происходит в самой локальной сети, “до” канала с провайдером, в котором считается трафик (при оплате за объем перекачанной информации).

Дополнительные задания

  1. Выполните основные задания лабораторной в среде Windows и Linux, на реальной и виртуальной машине. Объясните разницу (или сходство) результатов.
  2. С помощью утилиты arp просмотрите и выпишите arp-таблицу локального компьютера (несколько записей).
  3. Получите список активных TCP-соединений локального компьютера. Поясните полученный результат.
  4. (*) Создайте в своей домашней директории папку и предоставьте к ней общий доступ. Проверьте работоспособность общего доступа, зайдя в него с другого хоста.

Контрольные вопросы

  1. В чем отличие концентратора от коммутатора?
  2. В чем отличие маршрутизатора от коммутатора?
  3. Какой протокол необходим для работы с утилитой ping? Найти описание и характеристики протокола.
  4. Можно ли утилитой tracert задать максимальное число ретрансляций?
  5. Какой результат выдаст утилита netstat с параметрами -a -s -r? Поясните полученный результат.

Дата изменения: