00. Структура командной строки
1 2 3 4 |
В общем виде командная строка состоит из следующих трех частей: имя команды — имя исполняемого файла или встроенной команды оболочки; опции — дополнительные инструкции, сообщающие команде детали действий, которые она должна выполнить; аргументы — объекты, с которыми работает команда. |
01. Популярные оболочки GNU/Linux
1 2 3 4 |
bash — Bourne Again Shell (используется по умолчанию); pdksh — свободная реализация оболочки Korn Shell (ksh); tcsh — Enhanced C shell, улучшенный вариант C Shell (csh); zsh — Z Shell, дальнейшее развитие ksh. |
02. Файл /etc/shells — описаны все доступные оболочки:
1 2 3 4 5 6 7 |
cat /etc/shells /bin/sh /bin/bash /sbin/nologin /bin/ksh /bin/tcsh /bin/csh |
03. Встроенные и системные команды
1 2 3 4 5 6 7 |
Системные команды обычно находятся в одном из следующих каталогов: /bin /sbin /usr/bin /usr/sbin /usr/local/bin /usr/local/sbin |
04. Для многих встроенных команд имеются системные аналоги.
1 2 3 |
Например, для встроенной Bash-команды pwd, выводящей имя текущего каталога, имеется системный аналог /bin/pwd. Если команда вызвана без указания пути к ней, то выполняется ее встроенный в оболочку вариант (при его наличии). Если при вызове команды указан путь, то всегда выполняется системная команда. |
05. Клавиатурные сочетания Bash
1 2 3 4 5 6 7 8 9 10 11 |
<Ctrl>+<B> Курсор влево <Ctrl>+<F> Курсор вправо <Ctrl>+<A> Курсор в начало строки <Ctrl>+<E> Курсор в конец строки <Ctrl>+<H> Удаление символа перед курсором <Ctrl>+<D> Удаление символа в позиции курсора <Ctrl>+<J> Ввод (аналогично нажатию клавиши <Enter>) <Ctrl>+<L> Очистка экрана <Alt>+<T> Перемена мест аргументов <Ctrl>+<C> Остановка выполнения команды или сброс командной строки <Ctrl>+<Z> Приостановление выполнения задания |
06. Ввод нескольких команд в одной командной строке
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Можно вводить несколько команд в одной строке, разделяя их символом точки с запятой (;) Первая меняет текущий каталог на /tmp, а вторая — выводит имя текущего каталога. !!! Внимание вторая команда будет выполнена в любом случае. cd /tmp; pwd Если команды отделены друг от друга с помощью двух амперсандов (&&), то вторая команда будет выполнена только в случае успешного выполнения первой. cd /tmp && pwd При необходимости выполнять вторую команду только в случае неудачи первой следует использовать две вертикальные черты ||. Эти синтаксические конструкции оболочки позволяют организовать условное выполнение команд. cd xxx || echo -e "\n\t\t PRIVET" |
07. Переменные оболочки и окружения переменной VAR1 присваивается значение Privet!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
VAR1=Privet! echo $VAR1 VAR2='Bolshoy Privet!' echo $VAR2 При необходимости добавления строки к значению переменной имя переменной следует взять в фигурные скобки для отделения имени переменной от последующей строки. Экранирование имени переменной VAR3=${VAR1}LOLOLOL echo $VAR3 # ВНИМАНИЕ ИСПОЛЬЗОВАНИЕ ДВОЙНЫХ КОВЫЕМК НЕ РЕКОМЕНДУЕТСЯ VAR4="${VAR1} Evgen !!!" echo $VAR4 Для получения списка всех переменных, определенных в текущей оболочке, следует использовать команду set без аргументов. set Однако можно сделать переменную доступной для дочерних процессов этой оболочки, преобразовав ее в переменную окружения с помощью команды VAR1=Privet export VAR1 |
08. Важнейшие переменные окружения
1 2 3 4 5 6 7 8 9 10 11 12 13 |
HOME Путь к домашнему каталогу пользователя LOGNAME Имя пользователя USER Имя пользователя MAIL Путь к почтовому ящику пользователя PATH Путь поиска исполняемых файлов PS1 Вид приглашения оболочки PWD Имя текущего каталога OLDPWD Имя предыдущего каталога SHELL Оболочка, указанная в учетной записи TERM Тип терминала LANG Тип локализации (локаль) HOSTNAME Имя хоста SHLVL Номер оболочки (при входе в сеанс — 1, для дочерней — 2 и т. д.) |
09. Переменная окружения PS1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
PS1 определяет вид приглашения оболочки \u устанавливает вывод имени пользователя \W устанавливает вывод имени текущего каталога \h отображает в строке приглашения Bash имя хоста простой пример: echo $PS1 [\u@\h \W]\$ Пример из debian: echo $PS1 \[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ Механизм продолжения в Bash действует не только для имен файлов и команд. Если строка начинается с одного из символов: $, ~ или @, то Bash попытается дополнить строку как: имя переменной оболочки ($); имя пользователя (~); имя хоста (@). |
10. Переменные окружения, общие для всех пользователей, хранятся в файле
1 |
/etc/profile |
11. Настройки, специфичные для конкретных пользователей, хранятся в одном из файлов домашнего каталога пользователя
1 2 3 4 |
~/.bash_profile ~/.bash_login ~/.profile ~/.bashrc |
12. История команд
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
~/.bash_history в переменной окружения HISTFILE можно указать другой файл history Показать какой файл для сохранения истории используется: echo $HISTFILE Ко-во сохроняемых команд в истории (строк) echo $HISTFILESIZE history - показать историю выполнненых команд команд ВНИМАНИЕ ЕСЛИ ПЕРЕД КОМАНДО ПОСТАВИТЬ ПРОБЕЛ ТО В ИСТОРИЮ ОНА НЕ БУДЕТ СОХРОНЕННА !! - выполнить последнию команду !555 - выполнить команду под номером 555 !l - история будет просмотрена с конца до тех пор, пока не будет найдена команда с подходящими первыми символами, в данном случае с буквой "l" <Ctrl>+<R> позволяет производить поиск команд в истории по любым символам в командной строке. Нажмите комбинацию клавиш <Ctrl>+<R>, и вам будет предложено ввести символы из командной строки, причем найденная команда будет отображаться до своего исполнения. |
13. Команда alias
1 2 3 4 5 6 7 8 9 |
Многие команды, требуемые в повседневной работе, слишком длинны и неудобны. Для ускорения набора часто повторяющихся сложных команд им можно назначить псевдонимы с помощью встроенной команды alias. Команда alias, выполненная без аргументов, выводит список всех уже определенных псевдонимов. alias Новый псевдоним также создается командой alias. alias ls='ls --color=tty' alias vi='vim' alias ls='ls --color=tty' alias vi='vim' alias ll='ls -l' |
14. Вычисление арифметических выражений.
1 2 3 4 5 6 7 |
В командной строке можно вычислять выражения, заключенные либо в квадратные скобки, либо в двойные круглые скобки. Перед скобками должен стоять символ $, а результаты выражений можно передавать как аргумент какой-либо команде или назначать переменной. echo $((192*512)) Команда echo выводит в стандартный поток вывода строку, указанную в качестве аргумента. V1=5 V2=$(($V1/2)) echo $V2 |
15. Шаблоны подстановки и перечисление
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
Символ "звездочка" (*) является шаблоном для любого количества любых символов в именах файлов и даже для их отсутствия. Единственный символ, который не удовлетворяет этому шаблону, — лидирующая точка в именах скрытых файлов. Таким образом, подставив звездочку в качестве аргумента команде echo, мы либо увидим в результате саму звездочку, если в каталоге нет файлов, либо оболочка подставит команде echo имена всех файлов в каталоге в командную строку. Имеются особенные имена файлов, начинающиеся с точки, например, .bashrc. Такие файлы называются скрытыми, т. к. их имена не выводятся командой ls без специальных опций. Шаблоном для имен скрытых файлов является .* (точка и звездочка). Вообще, любые шаблоны для скрытых файлов должны начинаться с символа "точка". Символ ? заменяет один символ в имени файла, который должен находиться в той позиции, где находится знак вопроса. В примере "echo .??????" получен список скрытых файлов (имена начинаются с точки), в именах которых после точки имеется шесть любых символов. Для того чтобы указать допустимый диапазон символов в шаблоне, необходимо использовать квадратные скобки, а в них — требуемый диапазон. Например, [0-9] — шаблон подходит для любых цифр, а [a-zA-Z], шаблон для букв английского. echo .[bcd]* Если необходимо указать набор символов, не входящих во множество, следует установить знак восклицания после открывающей скобки. Например, [!abc] — множество любых символов, кроме a, b или c. Очень удобен, хотя и не относится к шаблонам, механизм перечисления Bash. Он позволяет задать множество вариантов, которое должна перебрать оболочка, составляя последовательно все варианты, заданные в фигурных скобках echo .bash{rc,_profile} |
16. Помощь и документация
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
pwd -h pwd --help wc --help help pwd help ls help network help help info network Страницы помощи man. от англ. manual — руководство man ls man -k network Все страницы man разделены на секции. 1 Описание команды пользователя 2 Описание системных вызовов ядра 3 Описание библиотек 4 Информация о файлах устройств и иных специальных файлах 5 Форматы конфигурационных файлов 6 Помощь по играм 7 Макросы, кодировки, информация для программистов 8 Команды системного администрирования 9 Процедуры и функции ядра man 3 zlib - Эта команда выводит информацию из третьей секции man о библиотеке zlib. man -k zlib - Посмотреть в каких секциях еще есть zlib man -k clock Если необходимо в разделе NAME отыскивать точное вхождение строки, то следует использовать команду man -f или же whatis. man -f clock whatis clock Стандартное место хранения страниц man — каталог /usr/share/man. Для разработки собственных страниц man можно использовать любой текстовый редактор, однако файл страницы помощи должен следовать формату groff. Стандартные разделы страниц man Раздел Назначение NAME Указывает информацию, которая будет использована при поиске по ключевому слову SYNOPSIS Формат вызова программы, опции и аргументы DESCRIPTION Описание объекта (программы, файла, библиотеки и т. п.) OPTIONS Подробное описание опций FILES Файлы, связанные с данной командой AUTHOR Имя автора с указанием адреса электронной почты SEE-ALSO Указатели на другие страницы man и иную документацию COPYRIGHT Права собственности, политика распространения и т. п. info Каталоги документации пакетов, установленных в системе, находятся в /usr/share/doc/packages. Например, /usr/share/doc/httpd-2.2.13 — каталог, содержащий некоторую документацию для сервера HTTP Apache версии 2.2.13 Наиболее важные файлы в каталогах /usr/share/doc/* : README — краткая информация о продукте, последние изменения, не вошедшие в документацию, предупреждения и, возможно, инструкции по установке; INSTALL — инструкции по установке. |
17. Источники информации в Интернете
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
The Linux Documentation Project http://www.tldp.org HOWTO — пошаговые инструкции как сделать FAQ — ответы на часто задаваемые вопросы ((Frequently Asked Questions) Tutorials - разнообразные обучающие документы и программы http://www.debian.org — официальный сайт Debian GNU/Linux; http://www.ubuntu.com — сайт популярного дистрибутива Ubuntu; http://www.opensuse.org — популярный дистрибутив Open SUSE; http://www.redhat.com — сайт компании Red Hat; http://www.gentoo.org — сайт Gentoo Linux, изобилующий руководствами; http://www.howtoforge.com — неплохой набор учебных материалов; http://www.sf.net — база данных программного обеспечения Source Forge; http://www.ibm.com — на сайте IBM имеется большое количество статей и документации по GNU/Linux; http://www.gnu.org — сайт проекта FSF GNU; http://www.linuxshop.ru — форум системных администраторов; http://linux.slashdot.org — новостной сайт с постоянными обновлениями. http://www.linuxgazette.org имеется архив разнообразных статей по тематике GNU/Linux. |
18. Система файлов и каталогов
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
Логически файловая структура в GNU/Linux организована в виде единой древовидной иерархии. Древовидная структура организована с помощью каталогов, содержащих файлы и подкаталоги. Каждый каталог может иметь множество подкаталогов, но у каждого подкаталога имеется только один родительский каталог. На каких физических носителях ни хранились бы файлы, в GNU/Linux они всегда находятся на одной из ветвей единой древовидной файловой структуры. Вершиной файловой структуры является корневой каталог (root directory). Имя корневого каталога: /. У корневого каталога нет родительского каталога, вернее, он сам является для себя родительским. Файлы в GNU/Linux являются основополагающими объектами, поскольку вся работа с данными, устройствами компьютера, процессами и прочим обеспечивается посредством файлов. Обычные файлы (plain files) обеспечивают хранение данных в компьютере. Они представляют собой именованный набор блоков данных на устройстве хранения. Древовидная структура образуется за счет использования каталогов, которые могут содержать файлы и другие каталоги. Каталоги являются особым типом файлов, предназначенным для поддержки иерархической структуры файловой системы. По сути, каталог — это таблица, содержащая перечень имен файлов, находящихся в нем. В корневом каталоге обычно не содержатся какие-либо пользовательские файлы (чаще всего в корневом каталоге находятся исключительно подкаталоги). Файлы пользователей принято хранить в их домашних каталогах, системные файлы хранятся в специальных каталогах и т. д. Последовательность имен каталогов, которые требуется пройти от корневого каталога для доступа к файлу, называется путем (path). Для разделения имен вложенных каталогов применяется символ /. В GNU/Linux пользователь имеет большую свободу в назначении имен файлам. Единственное ограничение: имя файла не может содержать символы / и \0 (null). Разумно назначать файлам осмысленные имена и избегать излишнего использования метасимволов (например, звездочки или решетки) в именах файлов, т. к. это может привести к проблемам в работе многих приложений. Прописные и строчные буквы различаются (case sensitive), т. е. имена файлов TheFile и thefile относятся к двум разным файлам. В различных каталогах могут находиться разные файлы с одинаковыми именами. Поэтому для однозначной идентификации файла необходимо применять полное или абсолютное имя файла. Оно состоит из пути (path) к нему в дереве каталогов и собственно имени файла. Таким образом, имена файлов бывают двух типов: абсолютные — те имена, которые начинаются с символа "косая черта" (/) — корневого каталога — и указывают последовательность подкаталогов, которые необходимо пройти для достижения файла; относительные — их имена не начинаются с косой черты и, следовательно, показывают путь доступа к файлам относительно текущего каталога. Имя файла может содержать точки (.). В GNU/Linux, в отличие, например, от MS-DOS, никакого особого значения точки в именах файлов не имеют. Однако для удобства принято считать часть имени файла, находящуюся после точки, — суффиксом (или иначе — расширением) имени файла. Суффиксы сообщают пользователю информацию о типе файла. Так, например, файл myarch.tgz является tar-архивом, сжатым утилитой gzip. Может быть несколько суффиксов: tarball.tar.gz. Файлы, у которых точка является первым символом в имени, являются скрытыми и командой ls не выводятся. Тем не менее, список этих файлов можно получить, пользуясь командой ls с опцией -a (all) или опцией –A. Для вывода списка всех файлов используется команда ls –a, в том числе и скрытых, в текущем каталоге. Эта команда выводит имя файла .hidden. Помимо него выведены еще два имени файлов — . (точка), т. е. имя текущего каталога, и .. — имя родительского каталога. Команда ls -A также выводит имена скрытых файлов наряду с обычными именами, но имена текущего и родительского каталога — нет. типы файлов (листинг команды ls –l) - — обычные файлы; d — каталоги; l — символические ссылки (содержат указатели на другие файлы); b — блочные устройства (специальные файлы, предназначенные для обращения к устройствам, информация на которые записывается и считывается оттуда блоками, например, жесткий диск); c — символьные устройства (специальные файлы, предназначенные для посимвольного ввода/вывода с таких устройств, как терминал или мышь); p — именованный канал (PIPE или FIFO, они являются одним из вариантов организации меж процессного взаимодействия); s — сокеты (sockets, предназначенные для организации сетевого меж процессного взаимодействия). |
19. Создание и удаление файлов и каталогов
1 2 3 4 5 6 7 8 9 |
Простейший способ создать пустой файл заключается в использовании перенаправления "пустого ввода" в файл с помощью команды > файл. Особенностью данного способа является то, что если файл существовал до выполнения этой команды, его содержимое будет стерто. > empty Команда touch дает возможность создать один или несколько файлов. Если в качестве аргумента указан файл, который уже существует, то у этого файла в результате выполнения команды touch будет изменена дата модификации. touch 1.txt 2.txt 3.txt |
20. Поиск файлов
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
find опции места_поиска критерии модификаторы Наиболее часто используют следующие критерии: -name — поиск по имени файла или файловому шаблону; -iname — то же с игнорированием регистра; -type — поиск по типу файла; -size — для поиска по размеру или диапазону возможных размеров; -empty — поиск пустых файлов; -mtime — по дате модификации; -perm — поиск по правам доступа; -user — по принадлежности файла; -group — по принадлежности файла. Поиск по имени файла: find . -name "d1*" Поиск только каталогов по заданному имени: find . -name "d1*" -type d -ls Поиск по критериям, объединенным условием ИЛИ: Первый критерий — поиск файлов, начинающихся со строки d1, а второй — поиск пустых файлов (условие поиска -empty). find . -name "d1*" -o -empty Для поиска файлов определенного типа необходимо задавать критерий -type тип, где тип один из:b — файл блочного устройства; c — файл символьного устройства; d — каталог; f — обычный файл; p — именованный канал; s — сокет; l — символическая ссылка. Имеется возможность исполнять команды с найденными find файлами. Для этого необходимо использовать модификатор –exec . find . -name "*core*" -exec rm –f {} \; |
21. Быстрый поиск файлов locate
1 2 3 4 5 |
Индексирование базы данных производится на регулярной основе автоматически (обычно в ночное время) командой updatedb updatedb Эта команда не воспринимает файловые шаблоны поиска, а только строки. locate spice |
22. Определение содержимого файла
1 2 3 4 5 6 |
Часто бывает необходимо определить тип содержимого файла, что позволяет делать команда file , пытающаяся осуществить это с помощью базы данных сигнатур файлов, называемой magic numbers (магические числа). Перед выводом на экран незнакомого файла рекомендуется узнать его тип с помощью команды file. В противном случае на экран может быть выведен бинарный файл, и настройки терминала могут быть испорчены. file /etc/issue file /bin/ls |
23. Копирование, перемещение и переименование файлов
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
Команда cp применяется для копирования (пример 4.14): - команда cp srcFile tagFile копирует srcFile в tagFile; - команда cp file1 file2 fileN dir копирует указанные файлы file1, file2, fileN в каталог dir; - команда cp –R dir1 dir2 копирует каталог dir1 в каталог dir2 рекурсивно, создавая в каталоге dir2 копию каталога dir1 со всеми файлами, содержащимися в исходном каталоге dir1. cp mydir/f{1,2} С помощью команды cp mydir/f{1,2} создается копия файла f1 с именем f2 в том же каталоге mydir, где находится исходный файл. Команда cp mydir/f{1,2} использует механизм перебора и эквивалентна команде cp mydir/f1 mydir/f2, однако она значительно короче. Рекурсивное копирование каталога cp -R mydir/ /tmp/ Команда mv используется для перемещения и переименования: - команда mv oldName newName переименовывает oldName в newName; - команда mv file1 file2 fileN dir перемещает заданные файлы в каталог dir; - команда mv oldName newName переименовывает каталог oldName в newName. |
24. Устройство файловой системы
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
Файловая система построена из трех основных компонентов суперблок (superblock); массив индексных дескрипторов (inod list); блоки хранения данных. устройство Файловой системы (ФС) _____________________________________________________ | | |-------------Магнитный диск -------------------------| |---------|------------------------|------------------| |Суперблок| Массив индексных данных| Данные | |---------|------------------------|Блок1|Блок2|БлокN | |_____________________________________________________ Cуперблок содержит основную информацию, необходимую для монтирования и работы файловой системы: тип файловой системы; размер и количество блоков в файловой системе; количество индексных дескрипторов; время последнего монтирования; информация о том, была ли от монтирована файловая система; счетчик числа монтировании; список свободных блоков и индексных дескрипторов и т. п. Если суперблок файловой системы испорчен, то монтирование файловой системы без его восстановления невозможно. Современные файловые системы специально сохраняют в заранее известных блоках диска копии суперблока для возможности их использования при восстановлении файловой системы. Индексные дескрипторы или, иначе, метаданные — это данные о самих файлах. В индексных дескрипторах сохраняются следующие сведения о файлах: владелец и группа пользователей файла; права доступа к файлу; тип файла; количество имен у файла (link count); дата доступа к файлу (файл открыт на чтение); дата модификации (файл открыт на запись); дата изменения метаданных; количество блоков, занятое файлом; указатели на блоки данных файла. Каталоги предоставляют собой особый тип файлов, содержащих таблицу, в которой хранятся имена файлов, находящихся в данном каталоге, и соответствующие им номера индексных дескрипторов (inode). Эти записи связывают имена файлов с их индексными дескрипторами, а те, в свою очередь, предоставляют информацию о местонахождении блоков данных файла. В блоках данных нет никакой информации, способной указать номер индексного дескриптора файла, которому принадлежит этот блок данных. Точно так же, в индексном дескрипторе не хранится имя файла, который данный индексный дескриптор описывает. Именно каталоги определяют положение файла в дереве файловой системы, т. к. сам файл не содержит информации о месте его нахождения. На один и тот же индексный дескриптор может указывать несколько имен файлов. Это фиксируется счетчиком имен файла (link counter) в индексном дескрипторе. Если у файла имеется несколько имен, то говорят, что между этими именами существует жесткая связь (hard link). То есть разные имена файлов указывают на одни метаданные и, следовательно, на одни и те же блоки данных. Все имена файла абсолютно эквивалентны, и изменение содержимого этих файлов будет совершенно синхронным. Нет никакой возможности определить, какое имя у файла было изначально, а какое появилось потом. У каталогов имеются как минимум два имени: - обычное имя каталога, находящееся в родительском каталоге (например, /home/user1); - имя "точка" (.) — имя текущего каталога. При появлении в любом каталоге подкаталога количество имен у этого каталога увеличивается на единицу, т. к. в дочернем каталоге всегда содержится имя "две точки" ( ..) — имя родительского каталога. Количество имен у файла можно определить с помощью команды ls -l , а получить номера индексных дескрипторов можно, используя ls -i Определение номера индексного дескриптора: ls -ldi /etc Подробную информацию об индексном дескрипторе файла можно получить, используя команду stat stat /etc Зарезервированы три номера для индексных дескрипторов: 0 — свободный индексный дескриптор (для удаленных файлов в индексный дескриптор записывается номер 0); 1 — зарезервировано для будущего использования, но в GNU/Linux используются для файловых систем, порожденных ядром (проверьте каталоги /proc и /sys); 2 — inode корневой файловой системы и точек монтирования файловых систем. |
25. Использование жестких связей
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
Жесткая связь имеет место между несколькими именами файла, указывающими на одни и те же метаданные (inode). Пример: ls –li /bin/*grep Листинг, выводимый командой ls –li /bin/*grep, показывает, что имена /bin/grep, /bin/egrep и /bin/fgrep принадлежат одному и тому же файлу с тремя именами. Номер inode у всех этих файлов одинаков, следовательно, они эквивалентны. 13598 -rwxr-xr-x 3 root root 85228 Sep 11 2009 /bin/grep 13598 -rwxr-xr-x 3 root root 85228 Sep 11 2009 /bin/egrep 13598 -rwxr-xr-x 3 root root 85228 Sep 11 2009 /bin/fgrep Поскольку метаданные у файлов, между которыми установлена жесткая связь, одинаковы, то и блоки данных тоже одинаковы. Следовательно, любые изменения, производимые с одним файлом, зеркально отразятся на файле, жестко связанном с ним. Для создания жесткой связи с файлом применяется команда ln. Первый аргумент команды — имя файла, а второй — имя жесткой связи с ним. Создание жесткой связи: ln file1 newname Проверяем: ls -li file1 ls -li newname echo 'This is a hard link' > file1 cat newname Попытка создания жесткой связи для каталога ln dir1 dir2 будет ошибка: "ln: `dir1': не допускается создавать жесткие ссылки на каталоги" P.S. также жесткую ссылку не возможно создать на файлы находящиеся на разных устройствах |
26. Использование символических ссылок
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
Создание: ln -s file1 slink1 Проверка: ls -li file1 slink1 Обратите также внимание, что, во-первых, символические ссылки можно устанавливать на каталоги, а, во-вторых, при создании символической ссылки в другом каталоге следует указывать полное имя исходного файла. Если второе требованиене выполняется, то: либо ссылка будет оборванной (или иначе — висящей), т. е. символическая ссылка будет указывать на несуществующий файл; либо ссылка будет указывать на существующий файл в целевом каталоге, имя которого (случайно или намеренно) совпадет с исходным файлом, однако ссылка будет указывать не на исходный файл. Символическая ссылка может оказаться оборванной (пример 4.34) в случае, если: файл, на который она указывает, перемещен, переименован или удален; нет достаточных прав доступа на файл, указываемый символической ссылкой; файл находится в файловой системе, которая сейчас не смонтирована. Команда cp обладает специальной опцией -s, которая позволяет вместо копирования файлов создавать на них символические ссылки cp -s ~/f??? /tmp Если используется команда cp, для которой в качестве аргумента указаны файлы символических ссылок, то будут скопированы не файлы символических ссылок, а файлы, на которые они указывают. Если же необходимо скопировать не исходные файлы, а именно символические ссылки, то следует использовать опцию -d команды cp cp -d /tmp/f122 Documents/ |
27. Процессы
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 |
GNU/Linux — многопользовательская и многозадачная операционная система. Это значит, что одновременно в системе может выполняться множество программ, запущенных различными пользователями. Для обеспечения многозадачности процессор компьютера последовательно переключается на обработку программного кода различных приложений, системных и прочих программ, создавая впечатление, что все они выполняются одновременно. Рано или поздно, по истечении некоторого промежутка времени, каждая ждущая исполнения программа попадает на процессор для выполнения. Естественно, чем больше загружена система, тем большим становится этот промежуток времени. Сильно загруженная система может с точки зрения пользователя потерять интерактивность, т. е. она может настолько медленно отвечать на запросы пользователя, что он будет уверен в том, что система не работает. Программы представляют собой исполняемые файлы двух типов: - бинарные файлы, содержащие инструкции на машинном языке; - интерпретируемые сценарии (например, сценарии Bash и программы Perl) Важно понимать, что программа — это некоторый код, хранящийся в обычном исполняемом файле. Как только пользователь запускает программу на выполнение, она, в конечном итоге, в виде соответствующего машинного кода попадает в ОЗУ и обрабатывается процессором. Процесс — это экземпляр программы, исполняемый процессором, либо ожидающий этого момента в очереди. Программа — это исполняемый файл, а процесс — это исполняющийся машинный код Каждый процесс работает в собственном виртуальном адресном пространстве независимо от других процессов. Пользовательский процесс не может получить доступ к адресному пространству другого процесса. Но ядро Linux — этотоже процесс. Ядро работает, переключая процессор в привилегированный режим. Достигается это с помощью специального прерывания процессора. Так как программы пользователей не могут получать доступ к системным ресурсам напрямую, они вынуждены обращаться при возникновении такой необходимости к ядру. Ядро предоставляет пользовательским процессам услуги посредством интерфейса системных вызовов. Системные вызовы — это функции, реализованные в ядре операционной системы. Когда пользовательский процесс осуществляет системный вызов, его выполнение производится ядром. Код ядра при этом работает в контексте процесса. Процессы ядра отделены от пользовательских процессов — они работают в пространстве ядра (kernel space). Приложения работают в пользовательском пространстве (user space) за исключением времени, когда в них производятся системные вызовы. Команда time позволяет увидеть, сколько времени исполнялась программа реально (от запуска до окончания), сколько времени она обслуживалась ядром и сколько она работала в пользовательском пространстве. time updatedb В GNU/Linux одновременно выполняется множество процессов. Процессор выделяет каждому процессу интервалы времени (time slices), в течение которых инструкции процесса выполняются процессором. Такой режим называется разделением времени. Используемая в Linux модель управления процессами относится к классу вытесняющей многозадачности (preemptive multitaskings). В рамках этой модели каждый процесс имеет свой уровень важности в системе или приоритета. Более приоритетные процессы могут вытеснять с исполнения на процессоре менее приоритетные. Структуру процесса: заголовок процесса, содержащий, в частности, специальные сигнатуры, показывающие формат процесса (например, формат ELF или COFF); инструкции (по историческим причинам их именуют text); данные (data) — статические данные; куча (heap) — область памяти, предназначенная для выделения памяти динамическим переменным и т. п.; стек (stack) — структура типа LIFO (Last Input — First Output), предназначенная для вызовов подпрограмм и хранения некоторых переменных. Процессы могут обращаться к каким-либо файлам. С каждым файлом ассоциируется целое число, называемое дескриптором файла. Когда ядро создает процесс, с ним автоматически ассоциируются три потока ввода/вывода: стандартный поток ввода (stdin) — дескриптор 0; стандартный поток вывода (stdout) — дескриптор 1; стандартный поток ошибок (stderr) — дескриптор 2. Процессы создаются другими процессами с помощью системного вызова fork(). Между процессами устанавливаются отношения наследства. Процесс, который породил другие процессы, называется родительским (parent). А порожденные процессы называются дочерними (child). У каждого процесса есть один и только один родитель, но процесс может иметь несколько потомков. Это позволяет выстраивать иерархическую древовидную систему процессов. Когда процесс-родитель завершает свою работу, он может завершить работу своих дочерних процессов. Если это не происходит, то "осиротевшие" процессы наследуются процессом с номером 1 — init. Ядро Linux поддерживает специальную таблицу процессов, содержащую информацию о процессах в системе. Таблица процессов динамически увеличивается при росте количества процессов в системе (увеличение таблицы процессов ограничено) Важнейшие идентификаторы процесса: PID (Process ID) — уникальный порядковый номер процесса в системе, предназначенный для идентификации процесса; PPID (Parent Process ID) — PID родительского процесса, позволяющий выстроить иерархию процессов; UID (User ID) — идентификатор пользователя, от имени которого выполняется процесс; GID (Group ID) — идентификатор группы пользователей, от имени которой выполняется процесс. Процессы принято подразделять на три категории: - Процессы ядра. Они выполняются в kernel space. Примером такого процесса в Linux является процесс упорядочивания процессов в очереди (scheduling). Процессы ядра располагаются в оперативной памяти и не имеют соответствующих им программ в виде исполняемых файлов. Соответствующий им код находится в файле ядра и модулях ядра. - Демоны — это фоновые не интерактивные процессы, запускаемые путем загрузки соответствующих им исполняемых файлов. Обычно они выполняют свою работу, никак не проявляя себя с точки зрения пользователей, т. к. они не ассоциированы с терминалами. Они предназначены для выполнения таких задач, как обслуживание соединений по какому-либо сетевому протоколу или регулярное выполнение рутинных операций в системе. - Все остальные процессы называются прикладными. Они, как правило, порождаются в рамках сеанса работы пользователя. |
28. Фоновый режим выполнения заданий
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
Обычно пользователи вводят задания интерактивно с помощью команд оболочки, наблюдая на экране за ходом и результатами их выполнения. В GNU/Linux можно запускать команды в фоновом режиме. Это позволяет пользователю выполнять несколько программ одновременно. Только одно задание на терминале может работать в интерактивном режиме(foreground). Если на терминале имеются другие активные задания, то они выполняются в фоновом режиме (background). Для запуска команды в фоновом режиме в конце командной строки необходимо поставить символ & (амперсанд). При запуске фонового задания выводится его номер в квадратных скобках, после квадратных скобок, — PID процесса updatedb & Для мониторинга состояний фоновых заданий предназначена команда jobs, которая позволяет просмотреть статус фоновых заданий. Она отображает номер задания, имя команды и статус задания. jobs fg bg Обозначения %% и %+ указывают последнее запущенное фоновое задание, а % — предпоследнее задание. Аналогично, информация о заданиях, выводимых командой jobs, отображает символы + и – для индикации последнего и предпоследнего заданий. Команда fg %_номер_задания переводит задание с номером номер задания в интерактивный режим. Так, команда fg %1 переводит задание с номером 1в интерактивный режим. Наоборот, для перевода задания в фоновый режим из интерактивного необходимо приостановить его выполнение нажатием комбинации клавиш<Ctrl>+<Z>, а затем выполнить команду bg с аргументом %_номер_задания. Можно указывать задания по первым символам их командной строки, предваряя их %. |
29. Жизненный цикл процесса
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
Как было отмечено ранее, процессы создаются другими процессами. Когда процессу требуется создать дочерний процесс, используется системный вызов fork(). Предположим, что пользователь выполнил в оболочке команду ps -f, желая получить список процессов, запущенных на данном виртуальном терминале. В таком случае ps -f является дочерним процессом оболочки. Пример: ps -f Когда пользователь ввел в командной строке команду ps -f, эта команда была проверена оболочкой bash, не является ли она встроенной. Так как эта команда не является встроенной, для ее выполнения оболочка произвела системный вызов fork(). Системный вызов fork() приводит к тому, что ядро копирует адресное пространство процесса, произведшего этот вызов, в свободное адресное пространство в памяти. Начиная с этого момента, в системе имеются два совершенно одинаковых процесса bash. В обоих процессах выполнение производится с одной и той же инструкции, следующей после fork(). При создании процесса ядро назначает ему уникальный идентификатор процесса PID. Так и сейчас, для копии родительской оболочки — дочернего процесса bash, в нашем случае, система назначила PID 1870, а PPID новой оболочки соответствует PID породившей ее оболочки — 1751. Итак, в настоящий момент в системе имеются два одинаковых процесса bash. Но требовалось получить процесс команды ps -f. Поэтому в дочернем процессе bash должен быть произведен системный вызов класса exec() (см. man 3 exec), который позволяет загрузить программу /bin/ls и поместить прочитанный исполняемый код в адресное пространство дочернего процесса. В то же время родительский процесс bash должен быть приостановлен с помощью системного вызова wait(), ожидающего сигнала о завершении работы дочернего процесса. До тех пор, пока этот сигнал получен не будет, родительский процесс bash не может продолжить работу. Как же отличить родительский и дочерний процессы bash для того, чтобы определить, в каком из них надо вызвать exec(), а в каком — wait()? Их можно различить с помощью анализа значения, возвращаемого функциейfork(). Она возвращает PID дочернего процесса. Родительский процесс bash породил дочерний процесс, и, следовательно, fork() возвратил PID дочернего процесса. В порожденном процессе fork() возвращает 0. После вызова exec() дочерний процесс уже не является процессом bash — он выполняет инструкции команды ps. Родительский процесс ждет завершения дочернего процесса. После того как команда ps -f завершает свою работу системным вызовом exit(), ее адресное пространство освобождается. Родительский процесс bash, который с помощью системного вызова wait() ожидал завершения работы дочернего процесса, продолжит после этого свою работу. Нормальный жизненный цикл процесса в системе может быть нарушен вследствие наступления какого-либо события. Например, процесс может получить сигнал от другого процесса, который может привести к его преждевременной остановке. Информация о дочерних процессах в таблице процессов может быть важна для родительского процесса. Поэтому информация о них не стирается из таблицы процессов до вызова родительским процессом функции wait() (см. man 2 wait). Возможна ситуация, когда дочерний процесс уже завершил свою работу, а родительский процесс не произвел еще системного вызова wait(). В таком случае информация об уже несуществующем дочернем процессе сохраняется в таблице процессов, т. к. эта информация может потребоваться родительскому процессу. Запись в таблице о завершившемся дочернем процессе помечается как defunct или, иначе, процесс-зомби (zombie). |
30. Мониторинг процессов
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
Основным инструментом для исследования процессов является команда ps. Она выводит состояние процессов на момент ее выполнения в системе. Без опций она выводит список процессов, связанных с текущим терминалом. Подробную информацию можно получить с помощью опции -f (full format). Еще более подробную информацию предоставляет опция -l (long format). PID - отображает идентификаторы процессов TTY - имена терминалов TIME - суммарное процессорное время, затраченное процессом с момента его старта. CMD - командная строка процесса PPID - родителе процесса C - фактор загрузки процессора (требуется планировщику для расчета приоритета процесса) UID - владельца процесса STIME - показывает время запуска процесса Столбец S - статус процесса, который может быть: D - процесс приостановлен и не может быть прерван (например, ожидает окончания ввода/вывода); R - процесс выполняется или находится в очереди; S - процесс приостановлен; T - процесс трассируется; Z - процесс помечен как defunct (zombie). Столбец NI - показывает величину nice number. Эта величина устанавливается пользователем и участвует в вычислении приоритета процесса планировщиком. Столбец SZ - количество памяти, занимаемое процессом, а WCHAN — это информация о системном вызове, произведенном процессом. Ещё ключи ps: ps -e - позволяющая вывести список всех процессов системе (аналог — опция –A). ps -ef - подробную информацию о процессах ps -u - фильтрация по UID ps -t - фильтрация по терминалу ps -p - фильтрация по PID искомого процесса ps -C - фильтрация по командной строке ps -faxu - подробная информация о процессах, пользователях ps aux - подробная информация о процессах, пользователях ps –L - для получения информации о потоках pgrep bash ps -f U root ps -fLC swriter.bin Удобно использовать также команду w, демонстрирующую список всех вошедших в сеанс пользователей и запущенные ими задания. |
31. Файловая система /proc
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
Подкаталоги /proc с именами, состоящими из цифр, соответствуют PID процессов. Определим, например, PID текущей оболочки и исследуем соответствующий ее процессу каталог: pgrep bash где 1730 - PID процесса bash ls /proc/1730 cat /proc/1730/cmdline Файл cmdline содержит в себе командную строку процесса файл status подробную информацию о статусе процесса Подкаталог fd предназначен для мониторинга файлов, открытых процессом. В нем содержатся символические ссылки на реально открытые файлы процессом. Имена этих символических ссылок соответствуют номерам файловых дескрипторов открытых файлов. |
32. fuser
1 2 3 4 5 6 7 8 9 10 11 |
fuser - команда позволяющая определить, какие процессы открыли заданный файл Команда fuser выводит следующие символы после PID процессов: c - текущий каталог e - исполняемый файл в момент его работы f - открытый файл r - корневой каталог m - разделяемая библиотека либо отображаемый в память файл. Опция -m команды fuser позволяет указать, что имя файла является именем смонтированного блочного устройства fuser -m /dev/dvd |
33. pstree
1 |
Для просмотра списка процессов в виде дерева, отображающего отношения родительских и дочерних процессов, необходимо выполнить команду pstree. |
34. Сигналы
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
Сигналы — это один из способов межпроцессного взаимодействия. Они обеспечивают возможность обмена процессами элементарными сообщениями. Получив сигнал, процесс может отреагировать на него по-разному в зависимости от полученного сигнала и действий, запрограммированных в коде процесса. Так, например, процесс может перечитать файл конфигурации или завершить работу. Список сигналов, используемых в системе, можно получить с помощью команды kill -l, а их подробное описание доступно с помощью man 7 signal. Наиболее часто используются сигналы, приведенные в списке далее: 1 - HUP, разрыв связи с терминалом (Hang Up — положить трубку). Многие демоны используют этот сигнал, как команду перечитать их конфигурационный файл и продолжить работу с измененными настройками. Оболочка Bash реагирует на этот сигнал завершением сеанса 2 - INT, прерывание процесса. Генерируется при нажатии комбинации клавиш <Ctrl>+<C> 3 - QUIT, сброс процесса. Генерируется при нажатии комбинации клавиш <Ctrl>+<\> 15 - TERM, сигнал для корректного завершения процесса Этот сигнал команда kill посылает по умолчанию 9 - KILL, аварийное завершение процесса Каким образом то или иное приложение реагирует на получение некоторого сигнала, зависит от того, как эта программа написана. В программе получение сигнала может перехватываться и обрабатываться специальным образом. Сигнал KILL (9) не может быть перехвачен. Этот сигнал приводит к немедленному и, таким образом, часто некорректному снятию процесса с исполнения. При этом файлы, открытые процессом, не закрываются нормальным способом, что может привести к потере данных. Если необходимо послать сигнал некоторым процессам, то сначала требуется узнать PID этих процессов, а затем с помощью команды kill послать им требуемый сигнал, номер которого указывается после тире. Если номер сигнала или его имя не задано после дефиса, то команда kill посылает целевым процессам сигнал 15 (TERM). Так, например, можно попытаться послать сигнал оболочке bash. Посылать сигналы процессам могут только их владелец и суперпользователь. Если родительским процессом получен сигнал, приводящий к его остановке, то в нормальной ситуации будут сняты с выполнения все его дочерние процессы. Удобно пользоваться командами pkill и killall. В отличие от команды kill, для команд pkill и killall достаточно указать имя командной строки процесса. killall -9 httpd pkill httpd |
35. Перехват и обработка сигналов в Bash
1 2 3 4 5 6 7 8 9 10 11 12 13 |
В оболочке Bash имеется встроенная команда trap, которая позволяет перехватывать сигналы и реагировать на них каким-либо заданным способом. Первым аргументом ее является команда, которую следует выполнить при получении оболочкой сигнала. Второй аргумент задает сигнал, который дол жен быть обработан. Введите команды, показанные в примере ниже, для установки ловушки сигнала INT: $ trap "echo Получен сигнал INT" INT $ trap -p trap -- 'echo Получен сигнал INT' SIGINT $ Получен сигнал INT Команда trap установила ловушку для сигнала INT — команду echo. Команда trap -p вывела список установленных обработчиков сигналов. Далее пользователь нажал комбинацию клавиш <Ctrl>+<C>, передающую сигнал INT оболочке. При этом сигнал был перехвачен обработчиком, выполнившим команду echo. |
36. Управление приоритетом процессов
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
В GNU/Linux используется режим выполнения процессов с разделением времени. В каждый момент времени центральный процессор выполняет инструкции одного-единственного процесса, а все остальные процессы находятся в режиме ожидания. Все процессорное время разделено на части — time slices(другое название — TIC). Маловероятно, чтобы процесс находился на исполнении процессора в течение всего времени TIC. Он может быть снят с исполнения более "важным" для системы процессом. Поэтому говорят о приоритете процессов в GNU/Linux. Процессы, обладающие в системе бóльшим приоритетом, исполняются быстрее. Процесс выполняется тем быстрее, чем: чаще процесс попадает на исполнение, чем полнее он использует промежуток времени time slice. Работа по обслуживанию очереди процессов осуществляется планировщиком. Планировщик вычисляет для каждого процесса величину, которую можно увидеть в поле PRI листинга, выводимого командой ps –l . Чем ниже величина PRI, тем выше приоритет процесса, следовательно, быстрее он выполняется, поэтому для избегания путаницы далее в тексте вместо слов "увеличение и уменьшение приоритета" будут использованы, соответственно, "улучшение и уменьшение приоритета". Величина PRI постоянно изменяется, обеспечивая для процессов, которые давно не были на исполнении процессором, улучшение приоритета, и, наоборот, для процессов, которые были исполнены только что, — его ухудшение. На основании вычисленной величины приоритета PRI ядро определяет, какой процесс следующим попадет на исполнение. Величина NI — nice number. Это число, устанавливаемое пользователем, называется иначе относительным приоритетом. С помощью nice number пользователь может влиять на вычисляемую планировщиком величину приоритета процесса. Чем ниже значение nice number, тем лучше будет приоритет процесса и тем быстрее он будет работать. В GNU/Linux значение nice number задается в пределах от –20 до 19. По умолчанию nice number равно 0. Для обычных пользователей отведен диапазон положительных значений nice number. В область отрицательных значений эту величину может устанавливать только суперпользователь. То есть обычные пользователи могут жертвовать производительностью своих приложений ради общего быстродействия системы. Значение nice number можно установить с помощью команды nice. После нее в качестве аргумента задается команда, которая должна быть исполнена с измененным приоритетом. По умолчанию команда nice увеличивает значение nice number на 10, ухудшая, таким образом, приоритет этого процесса. Если требуется указать иное значение увеличения nice number, то его следует указать после опции -n. nice -n 19 bash nice ps -l Для установки иного значения nice number для уже исполняющегося процесса следует использовать команду renice. Эта команда обычно доступна только для суперпользователя. Новое значение nice number указывается в качестве аргумента команды renice. С помощью этой команды можно изменить nice number для конкретного процесса, заданного с помощью его PID после опции -p или же в качестве второго аргумента. renice 10 2559 ps -l -p 2559 С помощью команды renice можно изменять приоритет всех процессов для заданного после опции -u пользователя (-g для группы пользователей) renice 0 -u user1 renice 0 -g user1 |
37. Права доступа и права владения
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
Любая UNIX- и GNU/Linux-система реализует политику DAC (Discretionary Access Control) — добровольное управление доступом к файлам. Суть ее состоит в том, что пользователи сами определяют права доступа к своим файлам. Каждый файл имеет два идентификатора, определяющие его принадлежность — владелец файла и группа пользователей. Эта информация сохраняется не в самом файле, а в его метаданных (inode). Любой файл принадлежит одному-единственному пользователю. Этот пользователь называется владельцем (или пользователем — user) файла. Когда пользователь системы создает файл, то владельцем файла устанавливается именно он. Первичная группа пользователя (GID) в обычных условиях определяет группу пользователей, которая будет установлена для этого файла. id - узнать свой UID \ GID В метаданных сохраняется информация не об именах пользователя и группы, а UID и GID пользователя. В соответствии с требованиями DAC в GNU/Linux существуют три базовых класса доступа к файлу: User access (u) — права доступа владельца файла Group access (g) — права доступа группы владельцев файла Other access (o) — права доступа для всех остальных Никакие другие категории не предусматриваются, поэтому каждый пользователь может быть либо владельцем файла, либо входить в группу пользователей, либо относиться к категории всех остальных. Сами по себе права владения файлами не предоставляют информации о том, что может пользователь делать с данным файлом. |
38. Права доступа, устанавливаемые на файлы
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
- rwx rwx rwx U G O d - тип файла (d)каталог, (-)файл, (c)идентификатор, (l)символьные ссылки, (b)блочные устройства, (p)именованные каналы, (s) сокеты r - чтение 4 w - запись 2 x - выполнение 1 ls -l Например, запись rxwxr-x--x (751) обозначает, что пользователь файла имеет все права на доступ к нему (rxw или 7), группа пользователей имеет права на чтение и исполнение файла (r-x или 5), остальные имеют права на исполнение (--x или 1). Пример использования цифр в программе chmod chmod 0700 file_name - -rwx------ - Владелец может читать, записывать файлы в данный каталог, а также переходить в него, все остальные пользователи не имеют к нему доступа. chmod 0711 file_name - -rwx--x--x - Владелец обладает теми же правами. Все остальные могут открывать каталог, но не могут просматривать или изменять файлы в нем. chmod 0777 file_name - -rwxrwxrwx - Полный доступ chmod 0000 file_name - ---------- - Доступ полностью закрыт Пример использования букв в программе chmod chmod go+r file_name - -rwxr--r-- - Добавить группе и остальным чтение chmod a=rwx file_name - -rwxrwxrwx - Полный доступ chmod -rwx file_name - ---------- - Доступ полностью закрыт |
39. Права доступа к каталогам
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
Права доступа, устанавливаемые на каталоги, имеют несколько иной смысл, чем права на файлы. Для каталогов используются следующие права: x - (search) право обращаться к метаданным файлов в каталоге, а также входить в каталог с помощью команды cd и получать доступ к файлам, находящимся в этом каталоге; r - право на чтение имен файлов, находящихся в каталоге, т. е. на выполнение команды ls. Без наличия права search (x) не позволяет получать подробную информацию о файлах и какой-либо доступ к ним, поскольку прав на доступ к метаданным файлов в каталоге нет; w - право на запись в каталог, т. е. право переименовывать, удалять, создавать файлы и пр. Без наличия права search (x) не позволяет осуществлять запись в каталог, т. к. для записи требуется доступ к метаданным файлов. Без наличия права search (x), установленного на каталог, операции обращения к файлам, находящимся в нем, не могут быть осуществлены. Поэтому для каталогов права доступа должны быть либо нечетные, либо отсутствовать. Далее приведены права доступа к каталогам, которые имеют практический смысл: 0 (---) — прав нет 1 (--x) — имеется право перехода в каталог, можно обращаться к файлам в нем, однако нельзя выполнять команду ls и осуществлять какие-либо манипуляции файлами, например, переименование или удаление 3 (-wx) — в каталог можно переходить, разрешены любые манипуляции файлами и можно к ним обращаться, однако получить список файлов командой ls невозможно 5 (r-x) — в каталог можно переходить и получать подробную информацию о файлах командой ls -l, разрешено обращаться к файлам, однако нельзя осуществлять манипуляции файлами, например, переименование или удаление 7 (rwx) — полные права Для получения прав доступа к каталогу следует использовать команду ls –ld. |
40. Изменение прав владения
1 2 3 4 5 6 7 8 9 10 |
chown — эта команда позволяет менять как владельца файла или каталога, так и группу пользователей файла; chgrp — позволяет менять группу пользователей файла. Команду chown может выполнять только суперпользователь. Обычный пользователь может менять командой chgrp группу для файла, если, во-первых, он владеет этим файлом и, во-вторых, он входит в группу, которую он устанавливает на файл. chown user1 file chgrp user1 user2 file chown user1:sys file chown -R user1:user1 dir chgrp -Rv user1 dir |
41. Автоматическая установка прав доступа к вновь создаваемым файлам
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
Команда umask предназначена для автоматической установки прав доступа к вновь создаваемым файлам и каталогам. Она позволяет задавать значение битовой маски, которая будет "вычитаться" из прав 777 для каталогов и 666 для файлов. При вызове этой команды без аргумента она возвратит текущее значение маски. umask Установка другого значения umask никоим образом не отразится на уже существующих файлах и каталогах, она участвует только в процессе определения прав на вновь создаваемые файлы и каталоги. umask 002 umask Каталоги Файлы 002 775 664 007 770 660 022 755 644 - эта маска установлена по умолчанию во многих дистрибутивов 027 750 640 077 700 600 umask g=rwx,g=rx,o= umask 0027 |
42. Специальные биты прав доступа: SUID, SGID и sticky bit
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
Помимо битов, устанавливающих разрешения на доступ к файлу, существуют специальные атрибуты, для которых предназначена еще одна триада битов: sticky bit (save text mode) - бит "липучка" - кодируется восьмеричной 1 (двоичная 001) SUID - бит подмены UID - кодируется восьмеричной 4 (100) SGID - бит подмены GID - кодируется восьмеричной 2 (010) В символьной нотации применяются символы t для sticky bit, s для SUID и SGID. SUID отображается в виде буквы s в старшей триаде битов, отображающей права владельца SGID отображается в виде буквы s в средней триаде битов, отображаю щей права группы sticky bit отображается в виде буквы t в младшей триаде битов, отображающей права для всех остальных Прописные символы S и T выводятся при отсутствии в этих триадах прав на исполнение, что обычно сигнализирует о ненормальном состоянии прав доступа. ls -ld /tmp /bin/ping У каждого процесса имеются четыре идентификатора: RUID - Real UID, который всегда равен UID пользователя, выполнившего команду RGID - Real GID, который всегда равен GID пользователя, выполнившего команду EUID - Effective UID, который равен либо RUID, либо если на исполняемый файл установлен бит SUID, то UID владельца файла EGID - Effective GID, который равен либо RGID, либо если на исполняемый файл установлен бит SGID, то GID владельца файла В подавляющем большинстве случаев подмена владельца или группы осуществляется на root или какого-либо привилегированного пользователя или группу. Установка sticky bit на каталог, в отношении которого пользователь имеет права на чтение и на запись, позволяет запретить удалять и изменять пользователю чужие файлы в этом каталоге. Это используется при установке прав доступа к каталогу /tmp, открытому на запись всем, поскольку иначе пользователь может удалить чужие временные файлы, находящиеся в этом каталоге, что может повлечь нежелательные последствия. При установке атрибута SGID на каталог вновь созданные файлы в этом каталоге будут наследовать группу владельцев по группе владельцев каталога(так называемый "стиль BSD"), вместо RGID процесса, создающего файл. u+s — для установки на файл бита SUID g+s — для установки на файл или каталог бита SGID o+t — для установки на каталог бита sticky bit -rws--x--x Эффект для каталогов: НЕТ Эффект для файлов: Команда исполняется от имени владельца файла -rwx--s--x Эффект для каталогов: НЕТ Эффект для файлов: Команда исполняется от имени группы пользователей файла drwxrws--- Эффект для каталогов: На файлы, создаваемые в каталоге, будет установлена такая же группа, как у каталога Эффект для файлов: НЕТ drwxrwxrwt Эффект для каталогов: В каталоге можно удалять или переименовывать только собственные файлы Эффект для файлов: НЕТ |
Редактор vi:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 |
Полноэкранный текстовый редактор vi (от англ. visual) универсален, но сейчас он чаще всего используется для редактирования исходных текстов программ и конфигурационных файлов. Команды его подобраны таким образом, что он будет работать даже на терминалах, не обладающих клавишами управления курсором. В современных версиях GNU/Linux обычно устанавливается редактор текста vim (vi improved), являющийся дальнейшим развитием vi. Имеется также графическая оконная версия gvim редактора vi. Она предоставляет современный интерфейс меню, что значительно облегчает работу для начинающих. Запускают vi следующим образом: vi — в таком случае vi будет запущен для ввода текста vi - — текст будет считан из стандартного потока ввода (stdin) vi filename — файл будет открыт для редактирования view filename или vi –R filename — файл будет открыт для просмотра vi +[num] filename — курсор будет поставлен на строку с номером num или на последнюю строку, если num не указан vi +/regexp filename — файл будет открыт для редактирования и курсор будет установлен на первое вхождение регулярного выражения regexp ЛОЛ: Для "срочной эвакуации" из vi следует нажать клавишу <Esc>, а затем набрать команду :q!. Эта команда обеспечит выход из vi без сохранения изменений. Редактор vim обладает развитой системой помощи, которая может быть получена посредством команды :help, если ее набрать после нажатия клавиши <Esc>. Редактор vi обладает тремя различными режимами работы. - Командный режим, в котором vi оказывается при его запуске и при нажатии клавиши <Esc>. В этом режиме осуществляется перемещение курсора, просмотр и редактирование текста. - Режим ввода текста, в который vi переходит при вызове любой из команд вставки или добавления текста, например, i. В этом режиме не следует пользоваться клавишами перемещения курсора по тексту. Этот режим используется исключительно для ввода нового текста. Для выхода из этого режима применяется клавиша <Esc>. - Режим двоеточия, или, иначе, режим последней строки, в который vi переходит при нажатии клавиши <:> в командном режиме. В этом режиме работают такие команды, как открытие нового файла или установка нумерации строк. Официальное название этого режима — ex mode, т. к. в нем можно использовать команды однострочного редактора ex (развитая версия ed). h - смещает курсор влево на одну позицию j - на строку вниз k - на строку вверх l - на позицию вправо w - на слово вправо b - на слово влево e - установить курсор в конец слова 0 - курсор в начало строки без учета отступа, т. е. в самое начало ^ - курсор на первый символ строки, не являющийся пробелом или табуляцией $ - курсор в конец строки ) - курсор на начало следующего предложения ( - курсор на начало предыдущего предложения } - курсор в начало следующего абзаца { - курсор в начало предыдущего абзаца G - на последнюю строку документа #G - переместить курсор на # — номер строки (например, 20G) H - установить курсор на первую строку экрана L - курсор на последнюю строку экрана z+ - поместить текущую строку вверх экрана z- - поместить текущую строку вниз экрана z. - поместить текущую строку в центр экрана i - переход в режим вставки в позиции курсора I - переход в режим вставки в начале строки a - добавление после текущего символа A - добавление в конец строки o - вставка строки после текущей строки с переходом в режим вставки O - вставка строки до текущей строки с переходом в режим вставки r - замена символа в текущей позиции R - переход в режим замещения x - удаление символа в позиции курсора X - удаление предыдущего символа s - замена текущего символа и переход в режим вставки S - переходом в режим вставки сс - переходом в режим вставки cw - замена слова до пробела, табуляции (обе команды) или знака препинания cW - замена слова до пробела, табуляции (обе команды) или знака препинания dw - удаление слова до пробела, табуляции (обе) или знака препинания dW - удаление слова до пробела, табуляции (обе) или знака препинания dd - Удаление строки полностью (dd) yy - копирование сроки в буфер обмена yw - копирование слова до пробела, табуляции (обе) или знака препинания (dw) yW - копирование слова до пробела, табуляции (обе) или знака препинания (dw) p - вставка из буфера после текущей позиции P - вставка из буфера до текущей позиции ~ - Смена регистра текущего символа J - объединение строк u - Отмена действия (от англ. undo) Многие команды допускают использование перед ними числовых квантификаторов. Они указывают, сколько раз должно быть выполнено требуемое действие. Например, следующая команда переместит курсор на двадцать строк вверх: 20k. Например, команда 10x удалит десять символов, начиная с текущей позиции. Команда 2Y запомнит в буфере обмена две строки, а команда 10p десять раз произведет их вставку (только в vim). Команды поиска и замены строк /шаблон — для поиска с текущей позиции до конца файла ?шаблон — для поиска с текущей позиции в начало файла Поиск с заменой найденных строк в vi осуществляется с помощью команды режима последней строки :s/шаблон/замена/ :s/ten/10/ :s/ten/10/g Поиск и замена с игнорированием регистра: :s/ten/10/i Поиск всех вхождений строки по всему файлу :%s/ten/10/gi Оператор % указывает диапазон поиска - весь файл. Модификатор i добавлен для игнорирования регистра при поиске. Диапазон поиска можно указывать: номерами начальной и конечной строк, например: :3,5s/ten/10/; номером конечной строки для замены с текущей строки: :,5s/ten/10/; смещением от текущей строки: :,+5s/ten/10/; символом конца файла: :3,$s/ten/10/. Команды режима двоеточия: :q - выход из редактора :q! - выход из редактора без сохранения изменений :wq - выход из редактора с сохранением изменений :x - выход с сохранением, если текст был изменен :w - сохранение редактируемого файла :w имя - задание имени файлу и сохранение или запись с другим именем :e имя - открытие файла для редактирования :e! имя - открытие файла с отказом от изменений в редактируемом файле :r имя - вставка текста из файла в позиции курсора :r! - команда Выполнение команды оболочки и вставка ее текстового вывода в файл :y - копирование строки в буфер (можно указывать диапазон строк) :d - удаление строк :set showmode - показывать текущий режим работы :set number - показывать номера строк |
43. Текстовые файлы и потоки
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
стандартный поток ввода (stdin), файловый дескриптор которого — 0 стандартный поток вывода (stdout), файловый дескриптор — 1 стандартный поток вывода ошибок (stderr), файловый дескриптор — 2 Стандартные потоки не надо специально открывать в программах, т. к. они автоматически ассоциируются с процессом при его создании. Поток ввода открыт на чтение, а потоки вывода и ошибок — на запись. Обычно по умолчанию стандартный поток ввода связан с клавиатурой, а стандартные потоки вывода и ошибок — с дисплеем. Перенаправление потоков ввода/вывода: < — оператор перенаправления стандартного потока ввода > или 1> — операторы перенаправления стандартного потока вывода 2> — оператор перенаправления стандартного потока вывода ошибок >> — для перенаправления потока вывода на добавление к файлу 2>> — для перенаправления потока вывода ошибок на добавление к файлу Эффект замещения старого содержимого файлов, возникающий при перенаправлении в них потоков вывода и ошибок, часто бывает нежелателен. Оболочка Bash позволяет исключить стирание содержимого файлов при перенаправлении в них потоков вывода или ошибок с помощью команды set –o noclobber. Однако все же есть способ даже при установленной опции noclobber переписать содержимое существующего файла с помощью операции перенаправления вывода или вывода ошибок. Для этого можно воспользоваться операторами: >| — перенаправление потока вывода с гарантированной перезаписью файла 2>| — перенаправление потока ошибок с гарантированной перезаписью файла Многие команды, работающие с текстом, позволяют использовать поток ввода вместо открытия на чтение файла. Для завершения ввода с клавиатуры следует нажать комбинацию клавиш <Ctrl>+<D> для передачи в поток ввода символа окончания потока. После этого команда, читающая стандартный поток ввода, завершит свою работу, пример: $ cat > f1 Privet <Ctrl>+<D> $ cat f1 Privet В примере команда cat > f1 получила через стандартный ввод текст Privet с клавиатуры, который был записан через стандартный поток вывода в файл f1. В сценариях оболочки часто возникает необходимость передать блок текста, находящийся непосредственно в тексте сценария, какой-либо команде этого же сценария. В таких случаях используют конструкцию here document (документ здесь) - << (два знака "меньше"). В таком случае для окончания ввода используется любой удобный символ вместо символа конца файла. Этот символ должен быть указан после << и должен быть единственным символом в строке. cat > file.txt << . Privet Medved lol . cat > file2.txt << "EOF" Vot escho primer razraz EOF |
44. Конвейеры и фильтры
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
last | view - Выводимый командой last список входивших в сеанс пользователей передан через конвейер команде просмотра view (вызов vi на чтение, нажмите :q для выхода). Знак "дефис" после команды view сообщает, что текст должен быть получен из потока ввода, в который передает свой вывод команда last w | nano - Конвейер может состоять из множества команд, причем команды в середине конвейера обязательно должны быть фильтрами. Фильтр — это команда, способная принимать поток данных через стандартный поток ввода, обрабатывать их и выводить обработанные данные в стандартный поток вывода. Правила построения конвейера таковы: 1. Первая команда конвейера должна выводить информацию в поток вывода. 2. Команды, не находящиеся по краям конвейера, должны быть фильтрами. 3. Последняя команда в конвейере должна читать стандартный поток ввода. Пример фильтра — команда tee. Она никак не меняет полученные из стандартного потока ввода данные, а лишь копирует их в стандартный поток вывода и в файлы, заданные ей в качестве аргументов ps -o comm= -o pid= | tee ps.txt | sort cat ps.txt В примере команда ps выводит список процессов без заголовка в два столбца: команда и PID. Содержимое файла ps.txt содержит вывод команды ps, т. к. команда tee получила его из стандартного потока ввода. Эти же данные tee передала через поток вывода далее команде sort для сортировки. На экран выводится сортированный список процессов, а в файле ps.txt — он не отсортированный. Команду tee часто используют для отладки работы сложных конвейеров, состоящих из множества команд. Эту команду удобно устанавливать в месте конвейера, которое вызывает подозрения. Так как в файле, указанном в качестве аргумента tee, будет находиться та же информация, что была передана в данном месте конвейера, то по ней легко можно будет определить наличие и суть ошибок. Большинство фильтров предназначено для обработки исключительно текста, но это вовсе не обязательно. Команда tee, например, может обрабатывать и бинарные данные. При этом стоит позаботиться лишь о том, чтобы бинарные данные не были выведены на экран, например, перенаправив поток вывода в /dev/null. |
45. Команда echo
1 2 3 4 5 6 7 8 9 10 |
Команда echo просто выводит строку, заданную ей в качестве аргумента. echo "It's cool" echo $PS1 Важна опция -e, позволяющая команде echo интерпретировать восьмеричные числа как символы ASCII echo -e '\0101\t\0102' Команда echo автоматически вставляет после выводимой строки символ перевода строки. Для отмены этого можно использовать опцию -n. echo -ne '\033c' |
46. Просмотр файлов с помощью more и less
1 2 3 4 5 6 7 8 9 |
Выход из пейджера q Получение встроенной помощи по командам h Прокрутка страницы вперед <Пробел> <PgDn> Прокрутка страницы назад <Ctrl>+<B> <PgUp> Прокрутка на строку вперед <Enter> <Ctrl>+<N> Прокрутка на строку назад <Ctrl>+<P> Переход в конец файла G Переход в начало файла g Поиск по шаблону (регулярному выражению) /шаблон |
47. head / tail / cut / awk / sed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 |
Команды head и tail выводят по умолчанию десять первых и последних строк соответственно потока или файла. Требуемое количество строк может быть указано. head -3 /etc/passwd tail –f /var/log/messages Вывод требуемых полей с помощью cut cut -f1 /etc/hosts cut -f1,3 -d: /etc/passwd Потоковый редактор sed Потоковый редактор sed позволяет либо прочитать входной поток для обработки из стандартного потока ввода, либо осуществить чтение текстового файла, заданного в качестве аргумента. Обработанный текст передается в стандартный поток вывода. Редактор sed работает с целыми строками текста. - номером строки; - диапазоном строк с указанием первого и последнего номеров строк в диапазоне через запятую (например, команда sed '2,4d' удалит в потоке строки со второй по четвертую включительно). Можно указать диапазон до последней строки. Последняя строка обозначается символом доллара ($); - с помощью регулярного выражения или, в простейшем случае, подстроки, которая должна находиться в адресуемых строках. Удаление строк по подстроке $ ps -e | sed '/tty/d' Наиболее часто используются следующие команды языка sed: d — удаление p — вывод строки (от англ. print) s — замена искомой подстроки на заданную подстроку i — вставка строки a — добавление строки c — изменение всей строки на заданную строку q — выход без дальнейшей обработки и вывода строк y — команда транслитерации символ в символ = — команда печати номера строки Команда q редактора sed: sed /daemon/q /etc/passwd Замена строк с помощью sed: sed s/bash/zsh/ /etc/passwd Требуется вывести содержание файла /etc/group (файл с информацией о группах пользователей и членстве в них) следующим образом: - должны быть выведены только группы, включающие пользователя user1; - все знаки двоеточия должны быть заменены символом подчеркивания. Сложная команда sed sed -n /user1/s/:/_/gp /etc/group Добавление строк с помощью sed last | sed '/user1/a \#####################' Общий вид сценария awk: BEGIN Команды формирования заголовка отчета /шаблон/ { команды обработки строк } END Команды формирования завершения отчета Сценарий awk может состоять из трех частей: - команды формирования заголовка — следуют после BEGIN - команды основного цикла обработки строк заключаются в фигурные скобки - команды формирования завершения отчета — следуют после END Команды могут находиться в файле сценария, имя которого должно быть указано после опции -f, либо может быть задано в качестве аргумента awk. Если шаблон для команды не указан, то обработке подвергаются все строки. Если же, наоборот, шаблон задан, а команда — нет, то в stdout выводятся только строки, подходящие шаблону. Например, следующая команда выведет из файла /etc/passwd все строки, содержащие подстроку bash. awk /bash/ /etc/passwd Для этого необходимо вывести первое и третье поле этого файла. Утилита awk позволяет обращаться к полям строк, разделенных с помощью пробелов или табуляций, следующим образом: $0 — вся строка, $1 — первое поле, $2 — второе и т. д. В нашем случае разделителем полей является двоеточие, поэтому данный символ надо указать после опции -F Вывод требуемых полей обеспечивает команда print. awk -F: '/bash/{print $1,$3}' /etc/passwd Фильтрация по числовому значению awk -F: '$3>100{print $1,$3}' /etc/passwd Одной из наиболее часто используемых встроенных переменных является NR — номер строки в потоке. Так, в предыдущем примере перед именами пользователей можно вывести номера строк, считанных из файла /etc/passwd. awk -F: '$3>100{print NR,$1,$3}' /etc/passwd Пример демонстрирует, как можно получить список только тех файлов, длина имен которых больше 15 символов. ls | awk 'length($0)>15' |
48. Сравнение файлов и каталогов команды diff и patch
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
Опция q отменяет вывод отличающихся строк и печатает только сообщение о том, имеются ли отличия. Опция -i применяется в случае, если необходимо игнорировать регистр в сравниваемых файлах. Часто используемые опции -u и -c выводят информацию, соответственно, в обобщенном (unified) и контекстном (context) форматах. ps > ps1.txt ps > ps2.txt diff ps1.txt ps2.txt diff -u ps1.txt ps2.txt Особенностью этих форматов является вывод информации об именах сравниваемых файлов. Эта информация может быть использована для реконструкции одного из сравниваемых файлов по-другому с помощью известных отличий этих файлов. Для этого используется утилита patch, позволяющая обновлять содержимое файлов с помощью так называемых "заплаток" (patches). Файлы-"заплатки" создаются с помощью утилиты diff, а обновление файлов производится утилитой patch. Пример с файлами f1 и f2 0. создаем файлы f1.txt и f2.txt cat > f1.txt << . bad file . cat > f2.txt << . good file . 1. Сравниваем файлы diff -Nau f1.txt f2.txt > patch-f1-from-f2 2. Применяем патч patch -p0 < patch-f1-from-f2 Создание и применение патча для директории Допустим, есть две директории dir1 и dir2 diff -Naur ./dir1 ./dir2r > ./patch Теперь, чтобы установить патч, нужно запустить: patch -p0 < ./patch Только не забудьте, что патчиться будет каталог ./dir1 Здесь главное, на что нужно обратить внимание, — это знак перенаправления < и -p Без перенаправления < программа patch будет спрашивать, какой файл патчить. Второй вариант — использовать ключ -i в место перенаправления <, т.е. patch -p0 -i ./patch Подведем итог: patch -p0 < ./patch - этой командой мы устанавливаем патч patch -p0 -i patch1 - этой командой мы устанавливаем патч Но если любую из команд повторить то у нас спросят желаем ли мы откатить все обратно, и если нажмем "y" то все что сделал патч будет отменено. |
49. Отличия файлов / разные файлы
1 2 3 4 5 |
Если же необходимо просто выявить факт отличия файлов, пользуются командой проверки контрольной суммы sum или же командами вычисления хэш-функций md5sum, sha256sum или подобными. sum filename md5sum filename1 md5sum Filename2 sha256sum filename1 |
50. Замена символов табуляции на пробелы
1 2 3 4 5 6 |
Команда expand предназначена для преобразования символов табуляции в пробелы. По умолчанию символ табуляции заменяется восемью пробелами, однако можно точно указать требуемое количество пробелов для замены табуляции. Имеется команда unexpand, заменяющая пробелы символами табуляции echo -e 'Строка\tс\tтабуляцией' echo -e 'Строка\tс\tтабуляцией' | expand -3 |
51. Простое форматирование текста
1 2 3 4 5 6 7 8 |
Команда fmt предназначена для форматирования текста. Команда объединяет и разделяет строки так, чтобы результирующая строка имела заданную длину (по умолчанию — 75 символов). Команда fmt пытается разделить длинные строки, начиная с длины строки, меньшей на 7%, чем установленная максимальная длина строки. Опция -w позволяет указать ширину текста в символах. Если необходимо только разделять строки, но не объединять их, то следует использовать опцию -s. ls -l /home | fmt -w50 -s |
52. Сортировка строк
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
Команда sort предназначена для сортировки строк файлов — аргументов. Если файлы не указаны, команда сортирует строки из стандартного потока ввода. По умолчанию команда sort сортирует строки в алфавитном порядке по возрастанию. При необходимости сортировки строк в порядке убывания используется опция -r . Команда sort способна также сортировать текстовый поток не только по целым строкам, но и по отдельным полям строк. Разделителем полей по умолчанию считается пробел. Если используется иной разделитель полей, его следует указать после опции -t. Для указания номера поля для сортировки используется опция -k. Опция -n позволяет задать команде sort не алфавитный, а числовой порядок сортировки. Пример показывает, как отсортировать учетные записи пользователей, в порядке возрастания их UID. sort -t: -k3 –n /etc/passwd В файле /etc/passwd разделителем полей является двоеточие. Это установлено опцией -t. Сортировка была выполнена по третьему полю (опция -k3), в котором содержатся UID пользователей. Сортировка была проведена в числовом порядке, что было установлено опцией -n. |
53. Вывод неповторяющихся строк
1 2 3 4 5 6 7 8 9 10 11 |
Фильтр uniq удаляет повторения строки в сортированном потоке. Команда в примере выведет строки файлов f1 и f2 так, что если какая-либо строка имеется в обоих файлах, то в поток вывода попадет только одна ее копия. cat f1 f2 | sort | uniq Опция -c команды uniq позволяет подсчитать количество вхождений каждой строки во входном потоке. Опция -d позволяет вывести только дублирующийся строки, что помогает, например, узнать, какие строки имеются одновременно в разных файлах. Опция -u выводит только уникальные (не дублированные) строки. Для игнорирования регистра при сравнении строк можно установить опцию -i. Если строки входного потока разделены на поля, то можно пропустить заранее заданное количество полей до определения уникальности строки. Для пропуска первых полей, разделенных пробелами, необходимо указать их количество после опции -f. Например, команда uniq –f6 пропустит шесть первых полей входного потока при определении уникальности строк. |
54. Объединение строк двух файлов по общему полю
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Команда join построчно объединяет содержимое заранее отсортированных файлов по общему полю. Выходная информация направляется в стандартный поток вывода. По умолчанию предполагается, что поля отделяются друг от друга пробелами или табуляцией. Опция -t позволяет указать требуемый символ-разделитель полей. Объединение производится по первым полям строк файлов. Если необходимо произвести объединение строк файлов не по первым полям строк, то номера этих полей необходимо указать после опций -j1 — для первого файла и -j2 — для второго файла. Содержимое файлов должно быть отсортировано этим полям. Для того чтобы вывести вместе с объединенными строками непарные строки, которые обычно не выводятся, необходимо использовать опцию -a. После этой опции следует указать номер файла, из которого будут выведены непарные строки. Наоборот, опция -v позволяет вместо объединенных строк вывести только непарные строки того файла, номер которого указан после этой опции. |
55. Подсчет количества и нумерация строк
1 2 3 4 5 6 7 8 9 10 |
Команда wc позволяет подсчитывать количество символов, слов и строк в файле, указанном в качестве аргумента или в стандартном потоке ввода. wc /etc/hosts cat /etc/hosts | wc При необходимости можно установить вывод только числа: строк — с использованием опции –l; слов — при установленной опции –w; символов — при использовании опции -c. who | wc -l |
56. Нумерация строк
1 2 3 |
Команда nl позволяет пронумеровать строки в тексте, считанном из файла или из потока ввода. Команда cat -b также нумерует строки, однако возможности команды nl намного шире. Опции nl позволяют устанавливать формат нумерации строк, особым образом нумеровать пустые строки, устанавливать шаг нумерации и т. п |
57. Замена символов с помощью команды tr
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
Команда tr читает поток ввода и преобразует его. Она позволяет выполнять преобразования, приведенные далее в списке. - Замена символов в потоке. Задают два набора символов. Символы из первого набора заменяются соответствующими по порядку символами из второго набора. - При использовании опции -d удаляются символы, указанные в наборе. - Исключение повторения символов в потоке. Символы, повторы которых должны быть исключены, задаются в наборе — опция -s. - Замена символов в потоке с последующим устранением их повторов. При этом задаются два набора символов и устанавливается опция -s. Вначале команда tr заменяет символы, а затем устраняет повторения символов из второго набора. - Удаление символов из потока с последующим устранением повторов. Этот режим требует установки опций -d и -s. Вначале удаляются символы из первого набора, а затем устраняются повторы из второго Слово капсом echo tarelka | tr a-z A-Z Удаление символов Здесь в качестве входного потока был использован вывод команды ls /, из которого были удалены все символы перевода строк. ls / | tr -d '\n' Устранение повторов выполняет опция -s echo root | tr -s o Опция -c команды tr позволяет инвертировать смысл задаваемого множества символов, т. е. удалить при использовании -d все, кроме символов, указанных в наборе. Например, команда tr –dc 0-9 удалит во входном потоке все, кроме цифр echo root | tr -cd o\\n С опцией -t команда tr обрезает длину первого набора по длине второго, для того чтобы количество символов в них равнялось. Можно указать класс символов из набора предопределенных символов [:alnum:] Символы алфавита в любом регистре и цифры [:alpha:] Символы алфавита в любом регистре [:blank:] Пустое множество [:cntrl:] Управляющие символы [:digit:] Десятичные цифры [:graph:] Все символы, которые могут быть напечатаны, кроме пробела [:lower:] Алфавитные символы в нижнем регистре [:print:] Все символы, которые могут быть напечатаны [:punct:] Все символы пунктуации [:space:] Пробел или табуляция [:upper:] Алфавитные символы в верхнем регистре [:xdigit:] Шестнадцатеричные цифры echo "str" | tr [:lower:] [:upper:] |
58. Слияние строк
1 2 3 4 5 6 7 |
При необходимости вывести в одну строку содержимое файла можно использовать команду paste -s. Так, приведенная в примере 8.45 команда выведет в виде одной строки содержимое файла /etc/hosts. paste -s /etc/hosts Без опции -s команда paste выводит строки файлов-аргументов параллель но, т. е. первая строка первого файла вместе с первой строкой второго файла и т. д. Если paste должна читать из стандартного потока ввода, то вместо имени файла указывают символ тире. Колонок вывода будет столько, сколько тире. ls / | paste - - - - - - - - |
59. Получение дампа
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
Команда od позволяет получить восьмеричный, десятичный или шестнадцатеричный дамп потока или файла. В первом столбце команда od выводит смещение в потоке (адрес). Далее выводятся значения считанных из потока символов. echo ABC | od -toC Опции -to команды od задают вывод дампа в восьмеричном формате, а опция -C указывает, что входной поток должен быть интерпретирован как символьный. Бывает удобно отобразить дамп не в виде численных значений, а с помощью "именованных символов". Для этого используются опции -ta echo ABC | od -ta Можно установить формат для вывода смещения. Для этого необходимо воспользоваться опцией -A, указав далее базис, где: -Ad — десятичное знаковое целое -Au — десятичное беззнаковое целое -Ao — восьмеричное целое -Ax — шестнадцатеричное целое -An — подавить вывод адреса смещения Аналогичные модификаторы можно использовать после опции -t для получения дампа в различных форматах. Для всех целых базисов можно указать следующие форматы: -C — символьный (char) -S — короткое целое (short) -I — целое (int) -L — длинное целое (long) Помимо od для получения дампов можно использовать hexdump. hexdump |
60. Разделение файлов на части
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
Команды split и csplit не являются текстовыми фильтрами. Они предназначены для разделения файлов на части, которые записываются в другие файлы со специальными именами. Эти файлы образуются в текущем каталоге. Команда split разделяет содержимое файла на части, которые записываются в отдельные файлы. По умолчанию команда записывает в отдельный файл каждые 1000 строк текста. Имена файлов начинаются со строки префикса и дополняются символами нумерации, начиная с aa. Если префикс не указан, то используется префикс по умолчанию — символ x, а имена файлов, в которые будут записаны части разделенного файла, будут иметь вид: xaa, xab, xac, ... Опция -l команды split позволяет указать, сколько строк должно содержаться в частях файла split –l9 /etc/passwd Опция -b команды split позволяет указать, сколько байтов должно содержаться в частях файла. Так можно разделять на части бинарные файлы. Команда split –b5K разделит файл на части, содержащие по 5 Кбайт кроме, возможно, последней части. Опция -Cn позволяет записывать в выходные файлы столько целых строк исходного файла, сколько можно записать, так, чтобы размер выходных файлов не превысил n байт. Например, команда split -C1024 разделит файл на час ти, не превышающие по размеру 1 Кбайт и содержащие целые строки исходного текста. Следует отметить, что команда csplit по умолчанию делит исходный файл на две части при удачном поиске, т. к. прекращает работу сразу после первого вхождения образца. Во второй части исходного файла могут содержаться вхождения образца, по которым исходный файл может быть разделен далее. Можно указать число повторов поиска образца в фигурных скобках. Например, команда csplit file /etc/ {1} повторит поиск регулярного образца один раз. В случае если повторный поиск неудачен, команда csplit завершает свое выполнение с выводом сообщения об ошибке, а все части исходного файла стираются. Опция -k отменят удаление выходных файлов в случае ошибки повторного поиска по регулярному выражению. |
61. Команда xargs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
Команда xargs использует данные, передаваемые ей из стандартного потока ввода, в качестве аргументов для конструирования команды. Наиболее часто она используется с командой find. Например, обе приведенные далее команды делают одно и то же — ищут и удаляют core-файлы, остающиеся в системе после программных сбоев. find /usr -type f -name "core.*" -exec rm -f {} \; find /usr -type f -name "core.*" | xargs rm -f В первом случае обработка найденных файлов производится командой find, которая вызывает команду rm. Во втором случае имена найденных файлов отправляются через конвейер команде rm. Второй вариант обычно работает быстрее. Но если в командную строку подставляется слишком много аргументов, это может привести к ошибке bash. P.S. ВНИМАНИЕ !!! не нужно использовать команду xarx или exec для удаления файлов!!! для этого у команды find давно придумали ключ -delete !!! find /usr -type f -name "core.*" -delete |
1 |
62. Регулярные выражения
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
Регулярные выражения - это мощнейшее средство поиска текста. Очень часто рутинные задачи администрирования связаны с поиском строк текста, например, в файлах системных журналов. Поэтому умение работать с регулярными выражениями важно для эффективной работы администратора. В этой главе вы изучите базовые и расширенные регулярные выражения и освоите важнейшие утилиты для работы с ними. Регулярные выражения — это специальные шаблоны, используемые для указания строк, например, при поиске. Регулярные выражения строятся из обычных алфавитно-цифровых символов и метасимволов. Метасимволы позволяют адресоваться одновременно к одному или более обычным алфавитно-цифровым символам. По историческим причинам регулярные выражения подразделяются на: - обычные регулярные выражения (basic regexp); - регулярные выражения с расширенным синтаксисом (extended regexp). Не все текстовые утилиты, работающие с регулярными выражениями, поддерживают расширенный синтаксис регулярных выражений. Метасимволы, составляющие регулярные выражения, представлены двумя классами: шаблонами и квантификаторами. Шаблоны - специальные символы, заменяющие один или более обычных символов. Квантификаторы - указатели количества вхождений символа или набора символов, находящихся в регулярном выражении непосредственно перед ними. То есть шаблоны указывают на то, что должно находиться в данном месте искомой строки, а квантификаторы - сколько раз оно должно там встречаться. Шаблон: ^ Начало строки $ Конец строки \< Начало слова \> Конец слова . Любой символ, включая пробел [] Набор символов () Группировка символов | Инфиксный оператор (или) Квантификатор: * Вхождение любое количество раз + Вхождение не менее одного раза ? Вхождение не более одного раза {n} Вхождение n раз {n,} Вхождение не менее n раз {n,m} Вхождение от n до m раз Помимо перечисленных регулярных выражений имеется несколько расширенных их наборов. Множества символов, задаваемые в квадратных скобках, имеют следующий смысл: в данном месте должен находиться один любой символ из входящих во множество. Например, множество [0-3] включает в себя все числа от нуля до трех, а регулярному выражению ^[0-3]$ удовлетворяют все строки, в которых находится единственный символ — число от нуля до трех (^ — начало строки, $ — конец строки). Заранее определенные множества символов [:alnum:] Множество алфавитно-цифровых символов [:alpha:] Алфавитные символы [:blank:] Пустые символы — пробел и табуляция [:cntrl:] Символы с восьмеричными кодами от 000 до 037 и 177 [:digit:] Десятичные цифры [:graph:] Изображаемые символы: алфавитно-цифровые и пунктуация [:lower:] Буквы в нижнем регистре [:print:] Печатаемые символы: алфавитно-цифровые, пробел и пунктуация [:space:] Табуляция, вертикальная табуляция, пробел, перевод строки [:upper:] Буквы в верхнем регистре [:xdigit:] Шестнадцатеричные символы |
63. Поиск текста с помощью grep
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
Команда grep производит поиск в указанных файлах строк по регулярному выражению. grep — интерпретирует регулярные выражения с обычным (basic) синтаксисом grep -F или fgrep — не интерпретирует регулярные выражения, воспринимая их как обычные текстовые строки grep -E или egrep — позволяет работать с расширенным синтаксисом регулярных выражений Опция -i позволяет производить поиск без учета регистра. Опция -v команды grep инвертирует алгоритм поиска: команда начинает искать строки, не удовлетворяющие регулярному выражению. Опция -c команды egrep если требуется подсчитать число вхождений регулярного выражения Опция -w команды grep, которая устанавливает режим поиска по целому слову Опция -x позволит отыскать все файлы, которые содержат строки, состоящие из одного символа. Опции -n позволяет установить режим вывода номеров строк, в которых найдены искомые строки. Опция -r заставляет команду grep работать рекурсивно, обрабатывая файлы в подкаталогах. grep 'bash$' /etc/passwd egrep -c '^.{1,3}:' /etc/passwd egrep '[0-9]{1,3}(\.[0-9]{1,3}){3}' /etc/sysconfig/* grep -w Enable /etc/sysctl.conf grep -x '.' /etc/* grep -r trainer /usr/share/doc/HOWTO/ ps -e | fgrep '?' ps -e | grep -i x grep -irns text_search |
64. Позиционные параметры
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
В Bash имеется десять позиционных параметров: $0, $1, ..., $9. параметры от $1 до $9 — значения девяти аргументов командной строки. $0 — имя команды $* — строка, составленная из значений всех аргументов командной строки $@ — содержит строку, составленную из значений всех аргументов командной строки, разделенных пробелами (аналогично, но не тождественно $*) $# — количество аргументов командной строки $? — код возврата предыдущей команды $$ — PID оболочки cat param.sh ------------- #!/bin/bash echo $1 echo $2 ------------- ./param.sh first second cat comline.sh -------------- #!/bin/bash echo $* -------------- ./comline.sh 11 aa 22 bbb При необходимости получить значения аргументов (опций) командной строки, содержащей более девяти аргументов, используют команду shift. cat param.sh ------------ #!/bin/bash echo $1 echo $2 echo And now all parameters are shifted. shift echo $1 echo $2 ----------- ./param.sh first second third Установка аргументов с помощью set cat param.sh ------------ #!/bin/bash echo $1 echo $2 set 1 2 echo $1 echo $2 ------------ ./param.sh first second |
65. Команда test
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
Команда test позволяет проверить заданные условия. Виды проверок, выполняемых командой test: - проверка файлов на предмет выполнения заданных условий - сравнение файлов - проверка установки опций оболочки - сравнение строк - сравнение целых чисел Если тест выполнен успешно, команда test передает нулевой код возврата. Так, используя команду test -e, можно проверить существование файла Проверка существования файла test -e /etc/passwd echo $? test -e not_existent_file echo $? 0 - файл существует 1 - файл не существует Команда test в сценариях обычно вызывается в другой форме, совершенно эквивалентной показанной ранее. В этой форме вместо строки test указывают квадратные скобки и условие в них: [ условие ]. Задача из предыдущего примера может быть решена иным способом [ -e /etc/passwd ] Команда [ -e /etc/passwd ] эквивалентна команде test -e /etc/passwd Наиболее часто используемые опции команды test, связанные с проверкой файлов: -e — файл существует -f — файл является обычным файлом (plain file) -d — файл является каталогом -h или -L — файл является символической ссылкой -r — файл доступен для чтения -w — файл доступен для записи -x — файл доступен для исполнения -s — файл не пуст -N — файл был модифицирован Формат вызова test, который используется при сравнении файлов: [ file1 -nt file2 ] — возвращает истину, если первый файл имеет более позднюю дату модификации; [ file1 -ot file2 ] — возвращает истину, если первый файл имеет более раннюю дату модификации; [ file1 -ef file2 ] — проверка жесткой связи (hard link) Проверка установленных опций оболочки set -o noclobber [ -o noclobber ] echo $? set +o noclobber [ -o noclobber ] echo $? Для сравнения строк применяется следующий формат вызова команды test: [ str1 = str2 ] — проверка на совпадение строк [ str1 != str2 ] — проверка на несовпадение строк [ str1 < str2 ] — истина, если при сортировке строка str1 окажется раньше, чем str2 (по аналогии сравнение >) [ -z str ] — истина, если длина строки нулевая [ -n str ] — истина, если длина строки ненулевая Сравнение целых чисел (пример 10.23) производится с помощью следующих опций команды test: -eq — равенство -ne — неравенство -lt — меньше -le — меньше или равно -gt — больше -ge — больше или равно Сравнение чисел [ 1 -lt 2 ] echo $? [ 1 -eq 2 ] echo $? |
66. Условное исполнение команд
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
Операторы условного исполнения команд && и || могут быть применены для управления потоком исполнения команд. Они позволяют исполнять команды в зависимости от успешности выполнения предыдущих команд. Если оператор && установлен между двумя командами, то вторая из них будет исполнена только в случае успеха предыдущей. Выполнение команды в случае успеха предыдущей команды. В примере первая команда проверяет наличие каталога, переход в который осуществляет вторая команда cd /tmp при условии успешного исполнения первой. ls /tmp &> /dev/null && cd /tmp pwd Более изящный вариант выполнения этой же задачи заключается в использовании команды test для проверки существования целевого каталога. Команда test в примере проверяет существование каталога. [ -d /tmp ] && cd /tmp pwd /tmp Если необходимо выполнять команду в случае неудачного завершения работы другой команды, удобно применять оператор ||. Например, требуется перейти в каталог d1. В случае отсутствия этот каталог необходимо создать и перейти в него. Если каталог отсутствует, то он создается. Эту задачу можно решить следующим образом [ -d d1 ] || mkdir d1 ; cd d1 pwd /tmp/d1 |
67. Команда if
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
Оболочка предоставляет также специальную команду if, которая позволяет управлять последовательностью исполнения целых блоков команд. В качестве примера предположим, что требуется обеспечить выход из некоторого сценария с ошибкой, если в командной строке установлено отличное от единицы число аргументов командной строки. При этом команда должна сообщать об ошибке и выдавать подсказку о правильном варианте ее использования #!/bin/bash if [ $# -ne 1 ] then cat <<- ERR Недостаточно аргументов. Использование: if.sh file Аргумент file должен быть обычным файлом. ERR exit 1 fi ls -l $1 Команда if исполняет блок команд после команды then, только в случае получения нулевого кода возврата команды, указанной в качестве ее аргумента. В данном случае аргумент команды if — это команда test, которая проверяет количество аргументов сценария. Если количество аргументов не равно единице, то выполняется блок операторов после then до команды fi, заканчивающей if. Конструкция cat <<- ERR — это "here document". Она позволяет указывать целый блок данных непосредственно в теле сценария, передавая его в данном случае в стандартный поток ввода команде cat для вывода на экран. Блок данных ограничен строкой ERR. В этом примере используется оператор <<- вместо << для игнорирования табуляций перед блоком данных. ./if.sh ./if.sh if.sh |
68. Команда if допускает использование команды elif для выполнения дополнительной проверки
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
#!/bin/bash if [ $# -ne 1 ] then cat <<- ERR Недостаточно аргументов. Использование: if.sh file Аргумент file должен быть обычным файлом. ERR exit 1 elif [ ! -f $1 ] then echo -n 'Тип файла ' file $1 exit 1 fi ls -l $1 Если аргументом задан специальный файл, то выводится его тип ./if.sh |
69. Команда else
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
В команде if можно также использовать else для указания блока операторов, которые должны исполняться в случае, если предыдущие проверки не закончились успехом #!/bin/bash if [ $# -ne 1 ] then cat <<- ERR Недостаточно аргументов. Использование: if.sh file Аргумент file должен быть обычным файлом. ERR exit 1 elif [ ! -f $1 ] then echo -n 'Тип файла ' file $1 exit 1 else ls -l $1 fi |
70. Команда case
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
При создании сценариев часто возникает задача проверить значение, содержащееся в переменной, на совпадение с заданными шаблонами. При этом в зависимости от шаблона, с которым произошло совпадение, должны выполняться те или иные заданные действия. Для выполнения такой задачи предназначена команда case. Шаблоны сравнения case такие же, как и файловые шаблоны. Синтаксис команды case в общем показан в примере: case слово in шаблон1 ) команды ;; шаблон2 ) команды ;; esac Сравнение слова с шаблонами производится последовательно. Как только найдется совпадение, выполняются соответствующие команды без дальнейших проверок. Допустим, что в текущем каталоге располагаются символические ссылки на сценарии запуска служб GNU/Linux. Требуется написать сценарий, который будет запускать службы, передавая сценарию аргумент start, если в качестве аргумента будет использована символическая ссылка, начинающаяся с буквы S или s. Если же ссылка будет начинаться с буквы K или k, то службы должны останавливаться и, следовательно, их сценариям должен передаваться аргумент stop cat case.sh #!/bin/bash [ $# -ne 1 ] && exit 1; FIRST=`echo $1 | cut -c1` case $FIRST in [Ss] ) echo "Запускается $1" ./$1 start ;; K|k ) echo "Останавливается $1" ./$1 stop ;; * ) echo "Статус $1" ./$1 status ;; esac В этом сценарии вначале проверяется количество аргументов. Если оно не равно 1, то осуществляется выход с ошибкой. Далее в переменную FIRST помещается первая буква аргумента командной строки. Команда case проверяет соответствие содержащейся в переменной FIRST буквы шаблону [Ss]. Этот шаблон обозначает множество по аналогии с обычными файловыми шаблонами. То есть этому шаблону удовлетворяют либо S, либо s. Если буква в FIRST удовлетворяет этому шаблону, служба запускается. Для остановки службы используется иной шаблон, имеющий в данном случае тот же смысл: либо K, либо k. Вертикальная черта обозначает "ИЛИ". Однако ее можно применять даже для целых строк или шаблонов. Если содержимое переменной FIRST не совпадает и с этим шаблоном, то выводится информация о текущем статусе службы. |
71. Циклы
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
В случаях, когда надо организовать последовательное выполнение одного и того же набора инструкций, удобно использовать программные циклы. Для программирования в оболочке доступны три вида циклов: for — эта команда позволяет создавать циклы типа перебора значений while — цикл, выполняющийся до тех пор, пока истинно некоторое условие until — цикл, выполняющийся до тех пор, пока некоторое условие ложно Допустим, что имеется набор значений, которые должны быть последовательно присвоены некоторой переменной, требующейся для произведения каких-либо операций. В этом случае удобно использовать команду for #!/bin/bash for DIR in /etc /tmp /var do echo -n "Права доступа к $DIR " ls -ld $DIR | cut -c2-11 done В данном сценарии переменная DIR последовательно принимает три значения: /etc, /tmp и /var. Это делает команда for, в которой список значений указан после in. Тело цикла начинается после команды do и ограничивается done. Если в команде for не указан список значений директивой in, то переменная цикла будет принимать значения, соответствующие аргументам командной строки. Перебор аргументов командной строки с помощью for. В этом сценарии переменная DIR последовательно принимает значения аргументов. #!/bin/bash [ $# -lt 1 ] && exit 1 for DIR do if [ -d $DIR ]; then echo -n "Права доступа к $DIR " ls -ld $DIR | cut -c2-11 elif [ ! -e $DIR ]; then echo "$DIR не существует" fi done Для организации итеративных циклов удобно использовать команды while и until. Сценарий из примера в цикле выводит значения от 1 до 5 раз в секунду. #!/bin/bash i=1 while [ $i -le 5 ]; do echo –n $i ‘ ‘ ; sleep 1 i=$((i+1)) done echo Цикл while работает до тех пор, пока команда, указанная в качестве ее аргумента, возвращает успешный код завершения. Наоборот, until работает, пока команда-аргумент заканчивается неудачей. В качестве примера приведем сценарий, последовательно удаляющий из полного доменного имени узла (FQDN) подстроки до первой точки. Сначала должно быть выведено полное имя узла, затем домен, потом родительский домен, и так далее, пока строка не станет пустой. #!/bin/bash HN=`hostname` until [ -z $HN ]; do echo $HN HN=`echo -n $HN | tr '.' '\n' | sed '1d' | tr '\n' '.'` done В сценарии используется переменная HN, которой вначале присваивается значение — доменное имя узла. Затем из него в цикле удаляется подстрока от начала строки до первой встретившейся точки. Для этого в строке — имени узла точки сначала заменяются переводами строк, затем удаляется первая строка, и в заключение переводы строки снова заменяются точками. Цикл until работает до тех пор, пока содержимое переменной HN не станет пустым. |
72. Функции
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
Написание хорошо структурированных программ требует возможности создания подпрограмм. В оболочке Bash это реализуется с помощью функций, представляющих собой именованные блоки кода. При определении функции в оболочке (даже просто в командной строке) ее можно вызвать по имени. Синтаксис функции function имя() { команды } Код функции описывают в начале сценария до первого вызова функции. Для вызова функции достаточно просто указать ее имя. Для демонстрации использования функций оболочки модифицируем программу if.sh. #!/bin/bash function err_msg() { cat <<- ERR Недостаточно аргументов. Использование: if.sh file Аргумент file должен быть обычным файлом. ERR } if [ $# -ne 1 ] then err_msg # err_msg '001' exit 1 elif [ ! -f $1 ] then echo -n 'Тип файла ' file $1 exit 1 fi ls -l $1 Для передачи аргументов в функцию их указывают после имени функции, разделяя пробелами. В теле функции обращение к переданным аргументам производится с помощью позиционных параметров. Функции часто описывают в отдельных файлах, считывая в сценариях содержимое этих файлов с помощью inline-подстановки. |
73. Физическая структура накопителя на жестких магнитных дисках
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
Современные накопители на жестких магнитных дисках состоят из одного или нескольких магнитных дисков и магнитных головок (head). Каждая магнитная поверхность диска разбита на дорожки (track). Дорожки одного диаметра на всех магнитных поверхностях образуют цилиндр (cyl). Количество дорожек равно произведению количества цилиндров на количество головок: track = cyl × head. Каждая дорожка разбита на секторы (sect), стандартный размер которых составляет 512 байтов. Объем диска в байтах равен: capacity = cyl × head × sect × 512. Стандартное количество секторов в дорожке равняется 63. Поскольку количество байтов в секторе и секторов в дорожке являются постоянными величинами, то основными параметрами диска (так называемой геометрией) являются количества цилиндров cyl и головок head. Команда fdisk -l выводит сведения о геометрии диска. fdisk -l Диск разбивается на разделы (partitions). Обычно каждый раздел предназначен для размещения одной операционной системы, отдельной файловой системы или области размещения страниц подкачки. В нулевом секторе диска хранится таблица разделов, которая указывает начальный и конечный цилиндры для каждого раздела. Ограничения, исходно наложенные на геометрию жестких дисков, не предусматривали возможности иметь жесткие диски с размером более 520 Мбайт. У жестких дисков того времени предусматривалось наличие максимум 16 головок и 1024 цилиндров, что и давало ограничение в 520 Мбайт. В таблице разделов для хранения номеров цилиндров разделов предназначается только 10 бит, т. е. 1024 (210) цилиндров максимум. Это ограничение быстро стало не просто существенным, а критическим. Для его преодоления был введен так называемый режим LBA (Linear Block Addressing), в котором за счет мнимого увеличения количества головок удавалось виртуально понизить количество цилиндров, оставляя при этом их произведение неизменным. Это не единственное ограничение на объем дискового пространства, пройденное с 80-х годов прошлого века. Подробную информацию об этом можно найти на сайте http://www.tldp.org в документе "Hard disks HOWTO". Другое историческое ограничение связано с тем, что исходно разработчики IBM PC заложили возможность использования лишь четырех разделов на жестком диске. Для Linux-систем такое ограничение могло привести к не возможности создания требуемого количества файловых систем, которые должны находиться на разных разделах. Для преодоления этого ограничения в GNU/Linux (как и в ПО от Microsoft) используются логические разделы. В этой модели четыре основных раздела называются первичными разделами (primary), причем один из них может быть помечен, как расширенный раздел (extended). В расширенном разделе может быть создано неограниченное количество логических разделов (logical partitions). Собственно проблемы на этом не закончились. На смену MBR пришёл GPT, так как MBR был максимальный размер диска <2Tb. ВНИМАНИЕ! При ошибочных действиях все данные на диске могут быть утрачены! Без резервной копии лучше к дискам не лезь! При создании раздела на диске, где размещена корневая файловая система, потребуется перезагрузка после создания раздела(на самом деле не всегда, partprobe). partprobe - выполняем просим систему перечитать таблицу разделов Программы для работы с дисками: https://b14esh.com/nix/disk/fdisk-2.html https://b14esh.com/nix/disk/lvm.html https://b14esh.com/nix/disk/fs-sfdisk-e2label-mkfs.html https://b14esh.com/nix/disk/mdadm-spare-hot-spare-error-raid10-raid1.html https://b14esh.com/nix/gentoo/konspect-gentoo-bios-mbr.html https://b14esh.com/nix/gentoo/konspect-gentoo.html https://b14esh.com/virtualization/kvm/kvm-blockresize-domblklist-guests-linux-mbr-gpt.html |
74. FS / File System / файловая система
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
Для возможности работы с разделом накопителя на магнитных дисках в разделе должна быть создана файловая система, т. е. должно быть произведено форматирование раздела. При этом в новой файловой системе формируется суперблок, создается массив индексных дескрипторов и выделяется пространство для блоков данных. Стандартной файловой системой в GNU/Linux является ext4. ext3 - современная версия ext2 с поддержкой журналирования, индексированием каталогов и с улучшенными показателями быстродействия; ext4 - дальнейшее развитие ext3 с возможностью создавать очень большие файловые системы (1 экзабайт = 1018 байт), ориентированная на работу с экстентами (непрерывная последовательность блоков, принадлежащих файлу) с улучшенными параметрами надежности журналирования; XFS - высокопроизводительная файловая система для очень больших объемов хранимой информации (8 экзабайт), разработанная в Silicon Graphics; JFS - высокопроизводительная файловая система от IBM, используемая при необходимости хранения больших объемов информации (32 петабайта = 32 × 1015 байт). mke2fs — для создания файловых систем ext2, ext3 и ext4; mkfs.xfs — для создания XFS; mkdosfs — для создания файловой системы FAT. Команда mkfs является удобной оболочкой, которая для создания конкретных типов файловых систем обращается к следующим командам: /sbin/mkfs.ext2; /sbin/mkfs.ext3; /sbin/mkfs.ext4; /sbin/mkfs.xfs; /sbin/mkfs.msdos. mkfs -t ext4 /dev/hda2 mkfs.ext4 /dev/hda2 |
74. Проверка целостности файловой системы
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
Внимание! Без резервной копии лучше к дискам не лезь! При ошибочных действиях все данные на диске могут быть утрачены! Проверка целостности файловой системы должна осуществляться лишь на от монтированной файловой системе! (современный fsck скорее всего тебя предупредит, но это не точно) Целостность файловой системы может быть нарушена в результате сбоя питания или же аппаратной неисправности. Если работа операционной системы была прервана и файловая система не была отмонтирована, то в суперблоке файловой системы остается специальный флаг (dirty — грязный или not clean), который сообщает о том, что в файловой системе возможны нарушения. Если же файловая система была отмонтирована правильно, то файловая система находится в состоянии clean — "чистая". Сбой файловой системы обычно сопровождается тем, что информация, находящаяся в кэше для данной файловой системы, не попадает на диск, т. е. не синхронизируется. Может произойти также и следующее: операция синхронизации кэша с диском может быть не доведена до конца вследствие сбоя и запись данных из буфера на диск может прерваться до ее завершения. Это способно привести к целому ряду проблем: - искажению или потере информации в блоках данных; - появлению в системе блоков данных, которые считаются занятыми, хотя на них не указывает ни один индексный дескриптор; - наличию перекрестных ссылок на блоки данных; - появлению метаданных с ненулевым счетчиком ссылок, на которые не ссылаются никакие файлы; - наличию противоречивых записей в каталогах и т. п. Различают два класса возможных нарушений в файловой системе: - нарушение целостности данных; - нарушение целостности файловой системы. Для защиты целостности данных могут быть использованы разнообразные методы резервного хранения данных (backup). Утилиты восстановления целостности файловой системы не могут гарантировать восстановление данных после сбоя. Гарантом сохранности данных является только наличие резервных копий данных. Для восстановления целостности файловых систем в GNU/Linux используется утилита fsck, которая аналогично mkfs является надстройкой над специализированными утилитами для различных файловых систем. Если вызвать утилиту fsck без опции -t, указывающей тип файловой системы, по умолчанию запустится e2fsck, проверяющая файловые системы ext2, ext3 и ext4. fsck -t ext3 /dev/sdb2 При этом полная проверка осуществляется далеко не всегда, а только при условии: - наличия флага dirty в суперблоке, что бывает при сбое или выключении питания без отмонтирования файловой системы; - достижения максимального разрешенного количества монтирований файловой системы без проверки ее целостности; - достижения максимального срока без проверки целостности файловой системы. При работе команды e2fsck используется специальный каталог lost+found, находящийся в корневом каталоге файловой системы устройства. В этом каталоге сохраняются конвертированные в файлы потерянные блоки данных. |
75. Монтирование файловых систем
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
В GNU/Linux все файловые системы на блочных устройства сведены в единую файловую систему посредством каталогов — точек монтирования. Процесс подключения файловой системы на блочном устройстве к корневой файловой системе называется монтированием. При этом корнем файловой системы на смонтированном устройстве становится точка монтирования - каталог единой корневой файловой системы GNU/Linux. За исключением файловых систем, для которых имеются специальные настройки в файле /etc/fstab, монтирование файловых систем производится суперпользователем. Стандарт FHS предписывает, что временные точки монтирования файловых систем должны находиться в каталоге /mnt, а точки монтирования подключаемых файловых систем на съемных носителях — в каталоге /media. Например, каталог /media/cdrom может быть точкой монтирования для CD-ROM. Команда mount позволяет смонтировать файловую систему указанного с помощью опции -t типа (по умолчанию ext2, но современный mount умеет сам определить что там за fs у нас) в каталог — точку монтирования. Первый аргумент команды mount - файл блочного устройства, на котором находится монтируемая файловая система. Второй аргумент — точка монтирования этой файловой системы. mount - получение списка смонтированных устройств mount /dev/sdb2 /mnt - примонтировать раздел диска /dev/sdb2 в каталог /mnt mount /dev/sda1 /media/usbdisk - примонтировать раздел диска /dev/sdф1 в каталог /mnt/usbdisk mount -t iso9660 -r /dev/cdrom /media/cdrom - примонтировать сдпривод /dev/cdrom в каталог /media/cdrom Монтирование файловой системы подменяет индексный дескриптор каталога — точки монтирования. До монтирования индексный дескриптор соответствует каталогу, находящемуся в файловой системе, к которой монтируется устройство. После монтирования индексный дескриптор каталога — точки монтирования принадлежит уже смонтированной файловой системе. У всех каталогов — точек монтирования файловых систем индексный дескриптор имеет номер 2 ls -id / /home /media/disk Отмонтировать файловые системы (без специальных настроек в /etc/fstab) имеет право только суперпользователь. Для отмонтирования файловой системы применяется команда umount, которой в качестве аргумента должен быть задан единственный аргумент — либо точка монтирования, либо файл устройства. ls /media/usbdisk/ umount /media/usbdisk/ Хорошим правилом является следующее: не рекомендуется хранить какие-либо файлы в каталогах, являющихся точками монтирования файловых систем. |
76. Работа с разделом подкачки
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
Раздел или файл подкачки необходим при работе GNU/Linux для обеспечения временного перемещения страниц памяти из ОЗУ в этот раздел или файл. Такое перемещение бывает крайне необходимо при недостатке физической памяти. При этом страницы памяти, временно не используемые, но, тем не менее, необходимые для работы операционной системы или приложений, временно перемещаются в раздел подкачки. Процесс обмена страницами памяти между ОЗУ и разделом подкачки называется paging, а раздел подкачки называется swap-разделом. Понятия swapping и paging отличаются. Понятие swapping обозначает полное перемещение образа процесса из ОЗУ в раздел подкачки. Получить информацию об использовании раздела подкачки можно с помощью команды swapon -s Пример создание файла подкачки: dd if=/dev/zero of=swap.file bs=1k count=131072 mkswap swap.file mkswap -c /dev/sda2 Ну или вот так еще можно создать файл подкачки и добавить его /etc/fstab: fallocate -l 1G /.swap chmod 600 /.swap mkswap /.swap echo '/.swap none swap defaults 0 0' >> /etc/fstab swapon /.swap |
77. Файл информации о файловых системах /etc/fstab
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
При установке GNU/Linux создается файл /etc/fstab, содержащий информацию о файловых системах, автоматически монтируемых при загрузке или по требованию пользователя. Информация в файле /etc/fstab представлена в виде таблицы. <device> <mount point> <type> <options> <dump> <pass> Строки, начинающиеся с символа #, являются комментариями. Таблица, содержащаяся в файле /etc/fstab, состоит из колонок полей, назначение которых следующее: <device> содержит имя файла монтируемого устройства; <mount point> указывает каталог — точку монтирования; <type> содержит тип файловой системы на данном носителе; <options> содержит опции команды mount, которые должны быть использованы при монтировании данной файловой системы; defaults Установки: rw, suid, dev, exec, auto, nouser, asynch asynch Асинхронный режим ввода/вывода auto Монтировать во время загрузки noauto Не монтировать во время загрузки exec Разрешение выполнения файлов с машинным кодом noexec Запрет выполнения файлов с машинным кодом suid Бит SUID устанавливать можно nosuid Запрещена установка битов SUID user Обычный пользователь может монтировать устройство nouser Монтировать разрешено только суперпользователю ro Режим только для чтения rw Разрешено как чтение, так и запись <dump> указывает, надо ли для данной файловой системы производить автоматическое резервное копирование (backup) командой dump. Если в этом поле находится 1, то резервное копирование разрешено, если 0 — нет; <pass> предназначено для порядка проверки целостности файловых систем при загрузке операционной системы. Для корневой файловой системы в этом поле должно быть значение 1. Для других файловых систем которые необходимо проверять при загрузке, следует указать 2. Если проверка не требуется, то 0. Наличие записи в файле /etc/fstab означает, что данная файловая система может быть смонтирована с помощью единственного аргумента командной строки mount. Для монтирования файловой системы, указанной в /etc/fstab, достаточно задать либо точку монтирования, либо файл устройства. |
78. Мониторинг дисковых ресурсов
1 2 3 4 5 6 7 8 9 10 11 12 13 |
df -h - Определение свободного пространства на дисках Для получения информации о наличии свободных индексных дескрипторов необходимо вызвать команду df –i df –i - получения информации о наличии свободных индексных дескрипторов Для того чтобы узнать, сколько пространства занимают файлы в каталоге, следует использовать команду du, отображающую количество блоков, занимаемых каждым каталогом и каждым его подкаталогом. Можно использовать du -h для отображения информации в удобных единицах. Также можно отобразить лишь суммарную информацию о каталоге, для этого применяется du –s du -h du –s du -sh ~ du -sh / |
79. Резервное копирование
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
Залог сохранности данных — это регулярное и неукоснительное выполнение резервного копирования данных. В этой главе читатель познакомится с основами создания политики резервного копирования, а также изучит основные программы для архивирования и сжатия данных. Планирование резервного копирования При планировании резервного копирования надо определить следующее: - какие данные должны быть скопированы и где они находятся (в каких каталогах или файловых системах а также, возможно, на каких компьютерах) - какой тип носителей данных будет использован для резервного копирования - с какой периодичностью будет производиться копирование данных - как будет осуществляться ротация резервных носителей данных - кто уполномочен производить резервное копирование - можно ли выполнять резервное копирование полностью автоматически - в какие моменты времени должно осуществляться резервное копирование - где и как будет производиться хранение носителей резервных копий - каков будет порядок восстановления утраченных данных из резервных копий - каково допустимое время, необходимое для восстановления данных В процессе принятия решения об организации резервного копирования надо учесть частоту изменения данных в файловой системе. В большинстве систем содержимое следующих каталогов меняется относительно редко после установки системы: - /boot — файлы, необходимые для загрузки ядра Linux - /etc — конфигурационные файлы, база данных паролей и сценарии инициализации системы и запуска демонов - /lib — основные жизненно важные библиотеки - /opt — дополнительное программное обеспечение - /bin и /sbin — исполняемые файлы, жизненно важные для системы - /usr — вторичная иерархия файловой системы, содержащая статические файлы Большинство каталогов с программным обеспечением и библиотеками устанавливается с дистрибутивных носителей, поэтому, при условии их сохранности, резервное копирование этих каталогов совсем не обязательно за редкими исключениями. Такими исключениями, например, могут явиться каталоги /usr/local и /opt, в которые может быть установлено программное обеспечение не из дистрибутивного комплекта. Резервное копирование данных должно производиться тогда, когда эти данные не изменяются. В противном случае нельзя гарантировать сохранности этих данных. Желательно регулярно выполнять резервное копирование в часы минимальной нагрузки на систему. Обычно минимальная нагрузка имеет место в диапазоне от 2 часов ночи до 5 утра (в зависимости от специфики работы системы). Резервное копирование может производиться в интерактивном режиме, требующем присутствия человека (attended backup). Чаще всего такой режим копирования применяется при каких-либо незапланированных ситуациях. Другой вид резервного копирования — не интерактивный (unattended backup). Не интерактивное резервное копирование идеально подходит для заранее запланированных регулярных процедур копирования, осуществляемых в нерабочее время. Хорошо, если резервное копирование производится достаточно быстро, однако гораздо важнее, чтобы быстро осуществлялось восстановление данных, поскольку обычно резервное копирование есть процедура регулярная, а восстановление данных требуется в случае сбоя системы, который заранее предсказать невозможно. Суммарное время на восстановление данных состоит как минимум из: - времени, необходимого для поиска и доставки носителя резервной копии - времени на поиск требуемой информации на носителе (если поиск допускается) - времени копирования информации с резервного носителя. Если в архивной копии находится полная копия файловой системы, то время восстановления с нее может быть недопустимо большим. Поэтому различают два типа резервного копирования: - полное, при котором в архив помещается полная копия файловой системы - инкрементальное, при котором архив разбивается на несколько частей, в которых хранятся копии файлов, изменившихся с момента последнего копирования В GNU/Linux для инкрементального резервного копирования файловых систем ext2, ext3 и ext4 применяется утилита dump. |
80. Команда dd
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
Команда dd осуществляет низкоуровневое поблочное копирование из файла, указанного в командной строке после префикса if=, в файл, указанный после of=. По умолчанию используются блоки размером 512 байтов (один сектор). Обычно команда dd не применяется для резервного копирования файловых систем, однако она с успехом может быть использована для создания образов файловых систем и для восстановления файловых систем из образов. Так, для поблочного копирования содержимого CD в файл можно использовать команду из примера. dd if=/dev/cdrom of=image.img bs=1k В этом примере все содержимое CD блоками размером 1 Кбайт (аргумент bs=1k) копируется в файл image.img. Файловые системы можно копировать с помощью dd в размонтированном состоянии. Если аргументы с префиксами if= и of= отсутствуют, то команда dd копирует поток ввода в поток вывода. Кроме того, часто используются следующие опции команды dd: count — количество блоков, которое должно быть скопировано skip — количество блоков во входном файле, которое надо пропустить seek — количество блоков в выходном файле, которое надо пропустить |
81. Утилиты для сжатия файлов / Команда tar
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
В UNIX- и GNU/Linux-системах команды архивирования отделены от утилит сжатия файлов. Все утилиты сжатия осуществляют компрессию файлов, указанных в качестве аргументов. При этом к исходным названиям файлов добавляются стандартные расширения, перечисленные далее, а права доступа и владения сохраняются. В GNU/Linux используются следующие утилиты сжатия: gzip — применяется наиболее часто, сжатые файлы имеют расширения .gz bzip2 — часто обеспечивает лучшую степень сжатия, чем gzip, сжатые файлы имеют расширения .bz2 compress — стандартная UNIX-утилита сжатия, в GNU/Linux используется реже, чем предыдущие, сжатые файлы имеют расширение .Z. Команда tar Один из наиболее часто используемых инструментов резервного копирования — команда tar (tape archive). Аргументы команды tar — это файлы и каталоги, которые должны быть помещены в архив. Имя архива указывают после опции f команды. https://b14esh.com/nix/backup/gzip-rar-bzip-tar-zip.html https://b14esh.com/nix/backup/backup-script.html https://b14esh.com/devops/konspekt-linux/konspect-linux-ubuntu-1.html Запаковать: tar cvzpf name.tar.gz /var/www/html/name_site Распаковать: tar xvzf name.tar.gz -C /tmp Посмотреть что в архиве: tar tzvf name.tar.gz |
82. Программы dump и restore
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
Программа dump предназначена для выполнения инкрементального архивирования файловых систем ext2, ext3 и ext4. Полный архив включает в себя копии всех файлов файловой системы, а инкрементальный — только те файлы, дата изменения которых позже некоторой заданной даты. Определение этой даты достигается с помощью установки уровней резервного копирования, которые задают моменты отсчета, начиная с которых проверяется актуальность файлов. Полное копирование называется копированием нулевого уровня. При выполнении резервного копирования нулевого уровня все файлы помещаются в архив. Для всех последующих уровней резервного копирования справедливо правило: в архив уровня N помещаются все файлы, созданные или изменившиеся за время, прошедшее с момента последнего копирования уровня M, меньшего, чем N (M < N). Например, в архив второго уровня попадут все файлы, изменившиеся с момента последнего копирования нулевого или первого уровня. Программа dump предлагает десять уровней копирования с 0 — полный архив до 9. В общем виде командная строка dump выглядит следующим образом: dump <-уровень> [опции] <файлы> -уровень — уровень резервного копирования, например -0 - полное -9 - отдает приоритет только резервному копированию измененных файлов файловой системы - опции команды dump -f файл - файл устройства или обычный файл, куда будет помещен архив -z - выполнять компрессию gzip -L метка - задать метку тома -u - сделать запись о резервном копировании в файл /etc/dumpdates dump -0u -f /dev/st0 /home - Эта команда выполнит полное резервное копирование (уровень 0) на магнитную ленту, записав информацию об этом в файл /etc/dumpdates (опция -u) dump -2u -L 'Level2' -f /dev/st0 /dev/sda3 - Пример создания инкрементального архива второго уровня dump 0ufz /dev/sdb5 /home - создать резервную копию файлов домашнего каталога на диск /dev/sdb5 и зжать dump 0uaf /dev/sdb5 /dev/sdd1 - создать резервную копию диска "/dev/sdd1" на диск /dev/sdb5 Команда restore позволяет извлечь файлы из архива, созданного командой dump. Имеется возможность извлечь все или некоторые файлы из архива. При использовании команды restore обязательно должен быть указан режим работы с помощью одной из опций: -i - включение интерактивного режима работы команды -r - режим не интерактивного восстановления всех файлов из архива -t - вывод содержимого архива -x - восстановление файлов с возможностью селективного выбора файлов -f - указывают файл архива restore -rf /dev/st0 - Например, имеется полный архив на магнитной ленте, необходимо его восстановить -r задает режим восстановления, опция -f указывает файл с архивом -i задает интерактивный режим работы команды restore В интерактивном режиме restore предоставляет встроенную командную строку, в которой могут быть выполнены следующие команды: add — пометить указанный каталог или файл для восстановления cd — сменить текущий каталог delete — удалить указанный файл или каталог из списка на восстановление extract — восстановить файлы help — отобразить помощь по встроенным командам ls — вывести список файлов pwd — вывести полный путь к текущему каталогу quit — выйти из программы, даже если список на восстановление не пуст setmodes — установить права доступа и даты на восстанавливаемые файлы verbose — включить режим подробного информирования. Другие важные опции команды restore: -a — подавить выдачу вопроса о номере тома, содержащего требуемые для восстановления файлы (в режимах -x и -i) -M — работа с многотомным архивом (см. опцию -M команды dump) -V — работа с многотомными не ленточными архивами (например, CD-ROM) -N — симуляция восстановления файлов -o — восстанавливать права доступа к файлам без выдачи запросов restore -x -ao -f proceed.0.dump home/aberes/8marta/iptraf.sh Опция -x позволяет селективно извлечь файл из архива. Опция -a отменяет выдачу запроса о номере тома, а -o автоматически без запроса устанавливает права доступа к восстанавливаемым файлам. После восстановления в текущем каталоге образовалось дерево подкаталогов, содержащее восстановленный файл. |
83. dump / rdump / restore /rrestore
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
Для резервного копирования файлов на удаленную машину существует программа rdump. rdump 0uf linux_host_for_backup:/dev/sdb5/home linux_host_for_backup - Имя сервера для бекапов или IP-адрес /dev/sdb5 - устройство куда мы складываем бэкапы Резервное копирование данных в обычный файл dd if=/dev/zero of=10g.img bs=1 count=0 seek=10G - создаем блочный файл для хранения дампа dump 0f /media/myarchive/10g.img /home - снимаем дамп с каталога /home в файл /media/myarchive/10g.img Если нам надо скопировать на внешнее устройство наш дамп, делаем следующие: dd if=10g.img of=/dev/sdc7 bs=1M - наш бэкап 10g.img записываем на флешку /dev/sdc7 Чтобы полностью восстановить созданную выше резервную копию, мы должны запустить команду restore rf /dev/sdc7 Чтобы восстановить резервные копии файловой системы с удаленной машины rrestore tf linux_host_for_backup:/dev/sdb5 linux_host_for_backup - Имя сервера для бекапов или IP-адрес /dev/sdb5 - устройство куда мы складываем бэкапы |
84. Системные журналы syslog
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 |
Журналы — это важнейший источник информации о деятельности системы. Журналы предназначены для контроля деятельности системы и ее наладки. Конфигурационным файлом демона syslogd является /etc/syslog.conf Структура строк конфигурации, каждая из которых направляет некоторый поток сообщений в заданный файл (или на удаленный компьютер — сервер ведения журналов), представлена двумя полями: - определение сообщения (selector) — поле, в котором указывают классы программ, сообщения от которых должны помещаться в данный поток - поле действия (action) указывает, куда должен быть записан поток сообщений Пример Файл /etc/syslog.conf ----------------------------- #SELECTOR ACTION *.crit;lpr,cron,mail.none /var/log/critical daemon.info;daemon.!err -/var/log/daemons daemon.=err /var/log/daemons.err authpriv.* /var/log/messages kern.*;kern.!=info /var/log/kernel cron.info -/var/log/cron lpr.info -/var/log/lpr mail.warning -/var/log/mail/mail ----------------------------- Первая часть — источник сообщения (facility), а вторая — уровень важности (priority) сообщения. Эти две части уникально определяют все возможные сообщения, обрабатываемые syslog. Служба syslog работает со следующими источниками сообщений (facility): auth — сообщения служб авторизации и безопасности authpriv — сообщения служб авторизации и безопасности cron — сообщения служб at и cron daemon — сообщения, поступающие от демонов kern — сообщения ядра lpr — сообщения службы печати; mail — сообщения, поступающие от служб электронной почты mark — источник для вставки служебных меток в журналы news — сообщения службы новостей security — то же, что и auth; syslog — собственные сообщения syslog user — сообщения пользовательских программ uucp — сообщения службы uucp; local0, ..., local7 — произвольно используемые источники Все сообщения разделены также по следующим уровням важности (priority), приведенным в порядке убывания важности: emerg — система не работоспособна (другое название — panic) - очень важно alert — требуется немедленное вмешательство crit — критическое событие err — ошибка (другое название — error) warning — предупреждение (другое название — warn) notice — нормальное, но значимое событие info — информационное сообщение debug — отладочная информация - все подряд Пара источник.важность устанавливает, что сообщения от этого источника с уровнями важности, не меньшими указанного, записываются в этот канал. Пример: lpr.info -/var/log/lpr При такой настройке все сообщения службы печати с уровнями важности info и выше будут записаны в файл /var/log/lpr. Знак "тире" перед именем файла разрешает асинхронную запись в журнал. При необходимости запретить передачу в канал сообщений с уровнем важности не ниже указанного ставят знак восклицания перед уровнем важности Пример: daemon.info;daemon.!err -/var/log/daemons В этом случае все сообщения от демонов с уровнями важности от info до warning будут записываться в журнал /var/log/daemons, а сообщения с уровнями важности, начиная с err, записаны туда не будут. Если же необходимо записывать в журнал сообщения только с одним уровнем важности, то перед уровнем важности ставят знак "равно". Пример: daemon.=err /var/log/daemons.err В примере 16.4 в журнал попадут лишь сообщения об ошибках и ничего более. Можно исключить сообщения с заданным уровнем важности. Пример: kern.*;kern.!=info /var/log/kernel Информационные сообщения ядра в журнал записаны не будут. Звездочка обозначает любые источники или любые уровни важности. Пример: authpriv.* /var/log/messages Если в канал не должны быть записаны любые сообщения от каких-либо источников, то удобно использовать директиву none. Пример: *.crit;lpr,cron,mail.none /var/log/critical После внесения изменений в файл /etc/syslog.conf вовсе не обязательно перезапускать syslogd. Достаточно послать ему сигнал HUP. Пример: pkill -1 syslogd Проверка: Программа logger позволяет проверить настройки syslogd. Опция -p программы logger предназначена для указания источника и важности сообщения. Пример: Команда в примере пошлет сообщение в канал mail с уровнем важности err. logger -p mail.err Proverka |
85. Служба ротации журналов / logrotate
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
С течением времени накапливающиеся сообщения в файлах журналов могут переполнить файловую систему. Для предотвращения этого предназначена программа logrotate, обеспечивающая ротацию журналов. Стандартный путь вызова logrotate — запуск ее с помощью cron. Файл /etc/logrotate.conf содержит настройки logrotate, в котором определяются действия, производимые с журналами. Программа logrotate способна производить следующие действия с файлами журналов: - удалять; - переименовывать; - сжимать с помощью программ-компрессоров; - создавать новые пустые файлы журналов; - посылать файлы журналов по электронной почте. Ротация осуществляется следующим образом для журнала например messages: 1. При первой ротации файл messages переименовывается в messages.1. 2. При второй ротации messages.1 переименовывается в messages.2, а файл messages переименовывается в messages.1. 3. При третьей ротации файл messages.2 переименовывается в messages.3, файл messages.1 в messages.2 и т. д. Пример ротированные журналы: # ls -w 1 /var/log/messages* /var/log/messages /var/log/messages.1 /var/log/messages.2 Утилита logrotate удаляет архивные копии старых журналов по достижении заданного количества копий. Настройки по умолчанию находятся в начале файла /etc/logrotate.conf (в современных дистрибутивах в каталоге /etc/logrotate.d) weekly rotate 4 create compress notifempty include /etc/logrotate.d /var/log/wtmp { monthly create 0664 root utmp rotate 4 } Настройки daily, weekly и monthly определяют периодичность ротации. Настройка rotate определяет количество старых журналов, которое должно храниться до удаления. А настройка create позволяет указывать права доступа и владения создаваемых журнальных файлов. Для сжатия файлов старых журналов предназначена настройка compress. Кроме этого, можно просто копировать файлы при помощи настройки copy, оставляя при этом оригинальные файлы журналов нетронутыми. Настройка notifempty позволяет не осуществлять ротацию пустых файлов. Директива include позволяет включать в файл конфигурации дополнительные настройки, указанные в файле — аргументе этой директивы. Если аргументом является каталог, то в основной файл конфигурации включается содержимое всех конфигурационных файлов, находящихся в этом каталоге. Настройка mail позволяет посылать журналы по электронной почте. А директивы prerotate и postrotate указывают сценарии, которые будут исполнены, соответственно, до и после ротации. С помощью настройки size можно указывать размер файла журнала, при превышении которого должна осуществляться его ротация. |
86. Хранение учетных записей пользователей
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
В GNU/Linux процедура аутентификации пользователя при входе в сеанс может быть проведена разными способами. Вот некоторые из них: - хранение учетных записей в файлах - аутентификация с помощью системы Kerberos - аутентификация в NIS/NIS+ - аутентификация в LDAP - использование специализированных систем аутентификации (например, TCB) Файл /etc/passwd содержит учетные записи пользователей, а в файле /etc/shadow хранятся шифрованные пароли. Каждая запись в этих файлах соответствует од ному пользователю системы. Поля записей разделены двоеточиями. Структура записей в файле /etc/passwd следующая: - имя пользователя - пароль - содержит символ x при использовании теневых паролей - UID пользователя - GID пользователя - справочная информацию о пользователе - домашний каталог пользователя - оболочка Использование системы теневых паролей существенно снижает эту опасность, т. к. файл /etc/shadow, где хранятся шифрованные пароли, не позволяет его читать никому, кроме суперпользователя. Структура файла /etc/shadow такова: - имя пользователя - зашифрованный пароль - количество дней с 1 января 1970 г. до момента последней смены пароля - минимальное время жизни пароля - максимальное время жизни пароля - время до момента устаревания пароля, начиная с которого пользователь - будет получать предупреждения о необходимости - период времени с момента устаревания пароля, по истечении которого учетная запись пользователя будет заблокирована - срок жизни учетной записи - девятое поле зарезервировано и в настоящее время в GNU/Linux не используется |
87. Регистрация, удаление и блокирование учетных записей пользователей
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 |
Правами регистрации пользователей в системе обладает суперпользователь. Для добавления учетной записи пользователя применяется команда useradd. В качестве аргумента для этой команды должно быть указано имя пользователя. Пример: useradd user1 - создание пользователя user1 id user1 - показать в ИД пользователя и в какие группы он входит Регистрация пользователя приводит к появлению соответствующих записей в файлах /etc/passwd и /etc/shadow. grep user1 /etc/passwd grep user1 /etc/shadow Создание приватной группы и домашнего каталога пользователя характерно для "Red Hat Linux", debian и подобных дистрибутивов. useradd -D - настройки команды useradd по умолчанию GROUP=100 - GID для вновь регистрируемых пользователей — 100 (для Red Hat эта настройка игнорируется при создании приватной группы пользователя) HOME=/home - домашние каталоги пользователей создаются в каталоге /home INACTIVE=-1 - блокирование учетной записи пользователя при устаревании его пароля не произойдет EXPIRE= SHELL=/bin/bash - оболочка для вновь регистрируемых пользователей SKEL=/etc/skel - каталог "скелета", из которого в домашние каталоги вновь регистрируемых пользователей копируются файлы профиля и настроек Каталог /etc/skel обычно содержит файлы профиля для вновь регистрируемых пользователей и другие служебные файлы, которые копируются при регистрации пользователя в его домашний каталог. Часто используемые опции команды useradd: -s — указывает исполняемый файл оболочки по умолчанию -d — путь к домашнему каталогу пользователя -m — опция, указывающая на необходимость создать домашний каталог -M — не создавать домашний каталог -k — путь к альтернативному каталогу скелета -u — назначить UID пользователю -g — назначить GID (первичную группу) пользователю -G — список групп пользователя (через запятые) -e — календарная дата, после которой учетная запись будет заблокирована -f — количество дней, которое должно пройти после срока устаревания пароля до блокировки учетной записи Пример: useradd -M -g users -s /sbin/nologin -e 2024-02-23 classuser регистрирует пользователя без создания для него домашнего каталога (опция -M) с первичной группой users (опция -g). Вход в сеанс запрещен, т. к. в качестве оболочки указан файл /sbin/nologin. Учетная запись пользователя будет заблокирована 23 февраля 2024 г. (опция -e). Если пользователь не имеет право входить в сеанс, то в качестве оболочки должен быть установлен один из следующих вариантов: /bin/false — системная команда, всегда возвращающая код ошибки /dev/null — специальный файл-поглотитель /sbin/nologin — системная команда, возвращающая при запуске код ошибки и сообщение о невозможности входа в сеанс Часто возникает необходимость произвести некоторые изменения в учетной записи уже зарегистрированного пользователя, например, поменять ему оболочку по умолчанию. Для этого предназначена команда usermod. Пример: usermod -s /bin/false classuser Большая часть опций команд useradd и usermod совпадает. Пример: usermod -G "`id -G classuser | tr ' ' ','`,uucp" classuser Команда id -G выводит список групп, в которые входит пользователь, разделенных пробелами. Далее пробелы заменяются запятыми с помощью команды tr, т. к. список групп для команды usermod должен быть задан через запятую. К списку групп, в которых пользователь уже принимает участие, добавляется список новых групп, а далее полученный список подставляется в командную строку usermod с помощью командной подстановки. Используя команду usermod, можно также указать для пользователя его новое имя с помощью опции -l. А опции -L и -U позволяют, соответственно, блокировать и разблокировать возможность входа в сеанс для данного пользователя. Удалить учетную запись пользователя можно командой userdel Пример: userdel classuser Перед удалением учетной записи пользователя необходимо решить, что делать с файлами пользователя, если таковые в системе имеются. Сама команда userdel удаления файлов в домашнем каталоге пользователя не производит. Поэтому все файлы пользователя, учетная запись которого подлежит удалению, должны быть найдены и либо удалены, либо помещены в архив, либо переданы другому пользователю. Управление паролями: Правила установки, использования и управления паролями являются важнейшей частью системной политики. Обычно они включают в себя, минимум, следующее: - определение категорий пользователей, которые имеют право самостоятельного выбора паролей с помощью команды passwd - правила выбора паролей и требования к их уровню сложности - сроки устаревания паролей - длительности периодов запрета на изменение паролей Четко сформулированная политика управления паролями значительно облегчает администрирование системы. Так, например, установив правила выбора паролей, их минимальную длину и требуемый уровень сложности, достаточно настроить модуль контроля паролей системы PAM для автоматической проверки соответствия выбираемого пользователем пароля требованиям безопасности. Команда passwd помимо изменения паролей предоставляет и другие возможности. Далее приведен список часто применяемых опций команды passwd: -l — блокирование учетной записи -u — деблокирование учетной записи -S — получение текущего состояния пароля -d — удаление пароля -n — период запрета смены пароля (минимальное время жизни пароля) -x — максимальный срок использования пароля -w — установка количества дней до момента устаревания пароля, начиная с которого будут выдаваться предупреждения о необходимости смены пароля -i — срок с момента устаревания до блокировки пароля Блокирование учетной записи, пример: passwd -l user123 - блокирует учетную запись user123 ip user123 - тут мы увидим ид пользователя и его группы и не каких признаков блокировки cat /etc/shadow - тут мы увидим что у пользователя во втором поле восклицательный знак "!" После блокирования учетной записи в первой позиции второго поля файла /etc/shadow перед шифрованным паролем пользователя появляется знак восклицания. При разблокировании учетной записи он исчезает. Управление группами пользователей С помощью создания групп пользователей системный администратор может эффективно управлять деятельностью в системе целыми коллективами пользователей, предоставляя им разрешения на доступ к системным ресурсам. Каждый файл располагает в метаданных триадой битов, кодирующей права доступа для группы пользователей. Следовательно, изменяя членство пользователя в группах, администратор изменяет, таким образом, привилегии пользователя на доступ к различным файлам в системе, не меняя при этом права пользователя на принадлежащие ему файлы. Информация о группах пользователей хранится в файле /etc/group в виде строк. Формат записей в /etc/group: - имя группы - пароль группы (при отсутствии пароля — x) - GID группы - список пользователей, принадлежащих к данной группе Для добавления новой группы необходимо воспользоваться командой groupadd, которая добавляет новую запись в файл /etc/group groupadd class grep class /etc/group Пользователи, для которых группа является первичной, имеют информацию об этом в GID, хранящемся в четвертом поле файла /etc/passwd. В то же время имена пользователей, входящих в группу, которая не является для них первичной, записываются через запятую в четвертом поле файла /etc/group Пример: grep sys /etc/group sys:x:3:root,bin,adm группу sys входят пользователи root, bin и adm Для явного указания GID используют опцию –g groupadd –g 512 project Удаление группы пример: groupdel project Группа пользователей может быть создана для работы над каким-либо проектом. В таком случае бывает удобно одного из пользователей сделать администратором группы и делегировать ему право добавлять уже зарегистрированных в системе пользователей в эту группу и удалять их из группы при необходимости. Назначить администратора группы можно командой gpasswd –A Пример: Здесь администратором группы developers назначается пользователь ivanov. gpasswd –A ivanov developers Системный администратор может добавлять пользователей в группу с помощью команды gpasswd –M gpasswd –M marta,lisa developers Администратор группы может: - добавить пользователя в группу командой gpasswd –a - удалить пользователя из группы командой gpasswd –d gpasswd –a semko developers Создание\ Добавление\ Удаление пользователей: adduser iivanov - добавления пользователя ( юзера ) adduser --uid 1500 iivanov useradd -m имя пользователя useradd -m -с Ivan Ivanov,,,,iivanov useradd -u 1500 -s tcsh iivanov useradd -G users,cdrecord,dialout iivanov userdel aborg - удалить пользователя из всех системных файлов (/etc/passwd, /etc/shadow, /etc/group) userdel -r aborg - удалить пользователя, его почтовый ящик,и дом каталог,из всех системных файлов (/etc/passwd, /etc/shadow, /etc/group) |
88. Профили пользователей
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
При запуске оболочка Bash последовательно пытается найти пользовательский профиль в файлах, сначала исполняется общий для всех пользователей файл /etc/profile, а затем индивидуальный профиль пользователя, находящийся в его домашнем каталоге. Файлы: /etc/profile ~/.bash_profile ~/.bash_login ~/.profile В файлах профилей обычно устанавливаются такие переменные окружения, как: PATH — имена каталогов, в которых Bash ищет исполняемые файлы TERM — тип терминала USER — имя пользователя (устанавливается с помощью id -un) HOME — путь к домашнему каталогу пользователя MAIL — путь к почтовому ящику пользователя При необходимости исполнить файл профиля из командной строки следует использовать команду source. source /etc/profile Итак, далее приведен список действий, которые обычно выполняются автоматически при входе в сеанс Bash: 1. Исполняется общесистемный скрипт профиля /etc/profile 2. Выполняется пользовательский скрипт профиля в его домашнем каталоге(например, ~/.bash_profile) 3. В пользовательском профиле проверяется наличие в домашнем каталоге файла ресурсов оболочки ~/.bashrc, и, при его наличии, он исполняется 4. Если исполняется файл ресурсов оболочки, то обычно в нем вызывается общесистемный файл ресурсов /etc/bashrc 5. При запуске оболочки из командной строки выполняются пункты 3 и 4 списка |
89. Установка нового оборудования:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
Подключение оборудования в компьютерах с архитектурой x86/64 может быть произведено двумя основными способами: - установкой плат дополнительного оборудования в слоты расширения - с помощью подключения к внешним шинам или портам При установке оборудования в слоты расширения на материнской плате это оборудование непосредственно подключается к локальным шинам компьютера. Оборудование, подключаемое к внешним шинам, часто подключается к системе посредством плат расширения, включенных в локальную шину. Как локальные, так и внешние шины компьютера с помощью согласующего оборудования и контроллеров управления подключаются к центральному процессору. Для того чтобы оборудование могло осуществлять операции ввода/вывода, ему должны быть выделены следующие ресурсы: IRQ — канал прерывания IO/Base — базовый адрес ввода/вывода DMA — канал прямого доступа к ОЗУ Прерывание (IRQ) идентифицируется своим номером и позволяет сигнализировать о завершении операции ввода/вывода, осуществляемой данным устройством. При получении прерывания процессор должен приостановить выполнение текущего задания и переключиться на обработку прерывания с помощью специальной программы (interrupt handler). Список прерываний, использованных установленными в системе устройствами, можно увидеть в файле /proc/interrupts. Регистры памяти, имеющиеся в устройствах расширения, отображаются в специальную область ОЗУ, доступную ядру операционной системы и называемую памятью устройств. Эта память предназначена для реализации операций ввода/вывода, т. е. в нее записывается передаваемая при этих операциях информация. Базовый адрес ввода/вывода IO/Base указывает начало области памяти для операций ввода/вывода данного устройства. Принято записывать адреса ввода/вывода в шестнадцатеричном виде. Увидеть занятые устройствами адреса ввода/вывода можно в файле /proc/ioports. |
90. Модули ядра
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
Работа с модулями ядра Современные ядра Linux построены в соответствии с модульной архитектурой. Ядра Linux поддерживают включение модулей ядра без необходимости пересборки ядра и перезагрузки системы. Это позволяет изменять функциональность ядра в работающей системе, а также включать в ядро и удалять драйверы устройств "на лету". Модули ядра представляют собой объектные файлы с кодом, который можно подключать к работающему ядру Linux. Модуля ядра компилируются при сборке ядра. Процедура сборки ядра будет рассмотрена далее в этой главе. Модули располагаются в каталоге /lib/modules/<имя ядра>. Имена подката логов /lib/modules всегда точно соответствуют именам ядер, имеющихся в системе. Имя работающего сейчас ядра можно узнать, выполнив команду uname –r ls /lib/modules Обратите внимание, что в каталоге /lib/modules имеется подкаталог (или подкаталоги) с именем ядра. Основная часть модулей ядра содержится в подкаталоге kernel/. arch — модули ядра, зависящие от архитектуры crypto — криптографические модули ядра drivers — драйверы для различных устройств fs — модули поддержки файловых систем kernel — служебный модуль lib — библиотеки, используемые ядром net — поддержка сетевой инфраструктуры sound — поддержка звуковой инфраструктуры Для получения списка модулей, установленных в настоящее время в ядро, следует выполнить команду /sbin/lsmod, которая выводит в форматированном виде информацию из файла /proc/modules. lsmod Информацию о модуле выводит команда /sbin/modinfo modinfo vboxdrv modinfo nvme_core Новые модули могут быть загружены в работающее ядро Linux с помощью команды/sbin/insmod. Установить модуль в ядро может только суперпользователь. В качестве аргумента для команды insmod указывают имя файла модуля. Пример: !!! Не используйте insmod, он устарел, требует указания точного пути, не удобен, используйте modprobe. insmod /lib/modules/2.6.31.8-0.1-desktop/kernel/drivers/scsi/scsi_debug.ko lsmod | grep scsi Вместо команд insmod и rmmod предпочтительнее вызывать команду modprobe, обеспечивающую более интеллектуальное поведение. Эта команда использует файл modules.dep для автоматического учета зависимостей модулей, что позволяет загружать модули ядра, не задумываясь об их зависимостях. Они будут учтены, и требуемые модули будут загружены. Одна из приятных вещей, которую делает modprobe это автоматическая загрузка всех необходимых зависимостей для данного модуля. Кроме того, вам не нужно указывать полный путь и расширение загружаемого модуля. rmmod - выгружает модуль Пример: # rmmod fat # lsmod | grep fat # modprobe fat # lsmod | grep fat Часто модули ядра для работоспособности требуют наличия других модулей ядра. В каталоге, содержащем модули ядра (/lib/modules/`uname -r`), находится текстовый файл modules.dep с зависимостями модулей друг от друга. Файл modules.dep генерируется с помощью утилиты /sbin/depmod. По умолчанию команда modprobe устанавливает модуль в ядро, при вызове с опцией -r она способна удалять модули. Опция -v была использована для вывода информации о загрузке модулей. modprobe -v -r fat modprobe -v fat При необходимости выгрузить все модули ядра, не использующиеся в настоящий момент, можно использовать команду modprobe -r без аргументов. Одно из полезных свойств команды modprobe — способность находить файлы модулей, имена которых соответствуют заданному шаблону. И не везде работает :( Для этого следует использовать опцию -l. В именах модулей в таком случае допускается использовать шаблоны, аналогичные шаблонам для имен файлов в оболочке. modprobe -l 'e100*' Если модуль требует передачи ядру некоторой информации, то ее можно указывать в качестве аргументов команды modprobe modprobe e1000 speed=100 Команда modprobe имеет конфигурационный файл /etc/modprobe.conf. modprobe -c |
91. Файлы устройств и udev
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
GNU/Linux предоставляет доступ к устройствам посредством файлов устройств. Устройства бывают двух типов: символьные и блочные. Команда "ls -l" вместо размера файла выводит два значения мажор и минор. Мажор — это номер драйвера для данного устройства в ядре Минор — дополнительный параметр, чаще всего нумерующий экземпляр устройства. Пример: # ls -l /dev/nvme0 crw------- 1 root root 239, 0 May 29 22:57 /dev/nvme0 # grep 239 /proc/devices 239 nvme Традиционно файлы устройств создавались с помощью команды mknod и размещались в каталоге /dev. Причем из соображений универсальности создавались файлы устройств для аппаратуры, не установленной в компьютере. Однако разнообразных файлов устройств становится все больше и больше, поэтому при использовании статически созданных файлов устройств возникают три проблемы: - нехватка мажоров и миноров для адресации файлов устройств - загромождение /dev файлами отсутствующих реально устройств (например, в Fedora 1 в каталоге /dev имелось порядка 1800 файлов устройств) - неудобство в работе подключаемых на лету устройств (hot-pluggable devices) например, USB. Проблема нехватки мажоров и миноров решается относительно просто, но проблема загромождения /dev не так проста. Для ее решения во многих UNIX-системах используют динамически создаваемые файлы устройств с помощью файловой системы devfs. Идея такова: в ядре имеется информация, какие устройства установлены в системе (при наличии соответствующих драйверов). Если в системе появляется новое устройство, для него динамически создается новый файл устройства. Есть еще одна проблема: поскольку имена файлов устройств, создаваемых devfs, не являются жестко связанными с конкретными аппаратными средствами, это очень затрудняет работу множества средств автоматизации. Например, если для USB-флэш один раз создается файл устройства /dev/sdb, а другой — /dev/sdc, то как определить точку монтирования? Для решения этих проблем в ядрах 2.6.13 и выше используется udev — дальнейшее развитие devfs, предоставляющее возможность "стабилизации" именования динамически создаваемых файлов устройств с помощью специальных правил (rules). Ядро Linux предоставляет файловую систему sysfs, монтируемую в каталог /sys. В этой файловой системе хранится служебная информация, с помощью которой udev создает и удаляет файлы устройств в /dev. Содержимое каталога /dev находится на временной файловой системе, и файлы устройств создаются там динамически. Статические файлы устройств копируются в /dev при старте системы из /lib/udev/. Конфигурационные файлы для udev размещаются в /etc/udev. Прежде всего это правила (rules), с помощью которых определяются имена для создаваемых файлов устройств. Всякий раз, когда устройство добавляется или удаляется из системы, ядро генерирует событие uevent для информирования демона udevd, который в соответствии с правилами в /etc/udev/rules.d/*.rules создает или удаляет файлы устройств. Каждому устройству сопоставляется специальный идентификатор MODALIAS. Список поддерживаемых устройств конкретным драйвером находится в соответствующем этому драйверу модуле ядра. Программа depmod читает эти идентификаторы и записывает их в файл modules.alias в каталоге с модулями ядра /lib/modules. Наличие файла /lib/modules/modules.alias обеспечивает автоматическое подключение требуемых модулей ядра для устройств, опознанных udev. Причем на ранних стадиях загрузки полная инициализация /dev невозможна, т. к. при этом может быть еще не готова инфраструктура udev. Поэтому после полной инициализации udev производит сбор информации в специальных триггерах для устройств в каталоге /sys о событиях uevent, которые были отложены для последующей обработки udev. Получить информацию об устройстве, опознанном udev, можно с помощью команды udevinfo. Если подключенное устройство не опознается системой, первое, что имеет смысл сделать — изучить сообщения ядра с помощью команды dmesg. dmesg Система udev фиксирует имена сетевых устройств для того, чтобы при их добавлении или удалении сетевым адаптерам назначались старые имена и их настройка не сбилась. Привязка имен к интерфейсам достигается с помощью MAC-адресов в файле правил udev /etc/udev/rules.d/70-persistent-net.rules ethtool -h | less - отображает параметры команды ethtool ethtool eth0 - отображает информацию о сетевом интерфейсе eth0 ethtool -i eth0 - выводит информацию о драйвере eth0 ethtool -S eth0 - отображает статистику NIC интерфейса eth0 |
92. Устройства PCI
1 2 3 4 5 6 7 8 9 10 |
Для получения списка PCI-устройств, работающих в системе, достаточно выполнить команду lspci. lspci Можно также получить подробную информацию об устройстве. lspci -s 04:00.0 -v –v - подробный вывод –s - выбор устройства, где 04:00.0 устройство, этот номер мы можем получить просто введя lspci Чаще всего просто исползают. lspci -v |
93. SCSI-устройств
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
SCSI расшифровывается как Small Computer Systems Interface — системный интерфейс для малых компьютеров. Современный интерфейс SAS (Serial Attached SCSI) — дальнейшее развитие этого стандарта. Наиболее распространенными типами SCSI-устройств являются накопители на магнитных дисках. Собственно некоторые современны SSD диски туда тоже записались. sd - драйвер жестких магнитных дисков SCSI, модуль ядра sd_mod.ko sr - драйвер SCSI CD/DVD-дисков, модуль ядра sr_mod.ko st - драйвер для ленточных устройств, модуль st.ko sg - условное обобщенное символьное SCSI-устройство, модуль sg.ko nvme - m.2 SSD, модуль nvme.ko Средний обобщающий функциональность SCSI-уровень — scsi_mod.ko. Нижний уровень представлен драйверами для хост-адаптеров SCSI, модули для которых находятся в каталоге /lib/modules/`uname -r`/kernel/drivers/scsi/. Команда lsscsi выводит список установленных SCSI-устройств. lsscsi lsscsi -v 8:0:0:0 |
94. Работа со звуковыми картами
1 2 3 4 5 6 7 8 9 10 11 12 |
Проверяем что там у нас за модуль ядра и драйвер работает ls -l /dev/snd/* grep ID-dev /proc/devices grep 116 /proc/devices lspci -s ID_PCI -v В ядрах серии 2.6 звуковая подсистема реализована с помощью ALSA, причем она обеспечивает поддержку старой системы OSS. Драйвер ALSA для звуковых карт ISA поддерживает расширение ISA PnP, поэтому необходимость конфигурирования ее с помощью утилит пакета isapnptools отпадает. При использовании ALSA параметры звуковых карт можно просматривать и изменять с помощью файловой системы /proc в подкаталоге asound/. В ALSA основным модулем является snd.ko, он требуется для всех остальных драйверов ALSA. Все имена модулей драйверов ALSA начинаются с префикса snd-. Для эмуляции PCM OSS применяется модуль snd-pcm-oss.ko. Для обеспечения работы звуковых карт USB в ALSA используется модуль snd-usbaudio.ko. |
95. USB устройства
1 2 3 4 5 |
Считывать и изменять настройки USB-устройств можно в /proc/bus/usb. Однако имеется специальная команда lsusb, выводящая список USB-устройств. lsusb Подробная инфа: lsusb -d 147e:2016 -v |
96. Сборка и установка ядра Linux
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
Самостоятельная сборка действительно рабочего ядра Linux - длительный и кропотливый процесс, требующий высокого профессионализма. Разработчики дистрибутива добиваются наилучшей работы ядра, тщательно интегрируя его с программным обеспечением, входящим в дистрибутив. Нет никакой гарантии, что самостоятельно собранное ядро, которое на первый взгляд кажется рабочим, действительно будет обеспечивать стабильную работу системы. Собирать ядро необходимо лишь при наличии действительно обоснованной необходимости и только после тщательного изучения документации от производителя используемого дистрибутива. Чаще всего необходимость пере сборки ядра в системах, не связанных с разработкой новых ядер Linux, возникает вследствие следующих причин: - в коде ядра, используемого в системе, обнаруживается серьезная уязвимость - необходимость обновления кода ядра, связанная с используемым ПО - отсутствие или несоответствие драйвера для какого-либо устройства - отсутствие кода в ядре или модулях ядра для поддержки какой-либо функции - необходимость расширения функциональности ядра - необходимость оптимизации работы ядра Для пере сборки ядра требуется: - наличие компилятора, пригодного для пере сборки ядра - наличие GNU-пакета make - наличие исходного кода ядра и, возможно, пакетов обновления (patches) - при пере сборке ядра из дистрибутива необходимо иметь пакеты с исходным кодом ядра и заголовочными файлами - порядка 2 Гбайт дискового пространства - достаточные вычислительные ресурсы - время на конфигурирование и сборку ядра Получить архив с исходным кодом ядра можно с сайтов www.kernel.org, ftp.kernel.org или с зеркал Пример установки ядра и патча на него: Скачали ядро: wget ftp://ftp.kernel.org/pub/linux/kernel/v2.6/linux-2.6.32.tar.bz2 Скачали патч: wget ftp://ftp.kernel.org/pub/linux/kernel/v2.6/patch-2.6.32.3.bz2 Распаковали ядро tar xjf linux-2.6.32.tar.bz2 Перешли в каталог ядра: cd linux-2.6.32 Установили патч: bzcat ../patch-2.6.32.3.bz2 | patch -p1 Конфигурирование ядра заключается в создании текстового файла .config с настройками для сборки. Для конфигурирования ядра следует выпол нить одну из этих команд: - make — команда построения ядра и модулей - make oldconfig — построение конфигурационного файла по умолчанию или на основе предыдущих настроек - make silentoldconfig — то же, что и предыдущее, но без выдачи запросов - make menuconfig — программа конфигурации ядра с интерфейсом меню - make xconfig — программа конфигурации ядра с графическим интерфейсом - make gconfig — то же самое, но с интерфейсом Gtk - make modules_install install — команда установки модулей ядра и самого ядра. После нее модули ядра будут записаны в каталог /lib/modules, а само ядро будет установлено в /boot. Конфигурация загрузчика также обновляется - make clean — эта команда удаляет оставшиеся от предыдущих шагов или процедур сборки объектные файлы, файлы ядра, модулей и прочего. Эта команда производит чистку только в подкаталогах каталога с исходным кодом ядра и не предназначается для удаления файлов в каталогах /boot и /lib/modules. - make mrproper — предварительная очистка и удаление ненужных файлов. Используется при неудачной сборке Пример сборки: make oldconfig make menuconfig make modules make -j2 V=s # вывод "-j2" будет использовать два ядра CPU, "V=s" подробный вывод сборки make modules_install make install После успешной сборки и установки ядра следует проверить настройки загрузчика, т. к. они обновляются автоматически. Далее можно перезагрузиться и испытать новое ядро. |
98. Сеть. протокол TCP/IP , UDP
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
Стандартной отправной точкой для изучения стека TCP/IP является общепризнанная модель OSI (Open System Interconnection), определившая семь уровней. - Прикладной уровень (application layer). На этом уровне осуществляется взаимодействие пользователя с программным обеспечением. - Уровень представления (presentation layer). Здесь осуществляются преобразования данных, необходимые для предоставления информации, передаваемой программами нижележащих уровней, в требуемом для прикладного уровня виде. - Сеансовый уровень (session layer). На этом уровне работают программы, обеспечивающие аутентификацию, вход и выход из сеанса. - Транспортный уровень (transport layer). Программы этого уровня обеспечивают прием/передачу данных с заданной надежностью. - Сетевой уровень (network layer). Этот уровень определяет адреса сетей и узлов в сети, а также определяет передачи данных между сетями. - Канальный уровень (data link). На этом уровне обеспечивается передача информации как форматированного потока битов. - Физический уровень (physical layer) — самый нижний уровень сетевого взаимодействия, обеспечивающий передачу потока битов посредством сетевого аппаратного обеспечения и физического носителя, связывающего вычислительные системы. Если отобразить стек протоколов TCP/IP на модель OSI, то окажется, что в нем реализованы лишь четыре уровня сетевого взаимодействия. - Прикладной. (application layer) Этот уровень в TCP/IP представлен прикладными протоколами, например: HTTP, FTP, SMTP, POP3 и т. д. С помощью этих протоколов обеспечивается функционирование прикладного программного обеспечения. - Транспортный. (transport layer) В TCP/IP имеются два транспортных протокола: надежный и ориентированный на соединение протокол TCP (Transmission Control Protocol) и более быстрый, но не надежный, протокол UDP (User Datagram Protocol). - Сетевой. (network layer). Данный уровень представлен протоколом IP (Internet Protocol). Этот протокол обеспечивает передачу пакетов между узлами и сетями. - Канальный уровень. (data link) Он представлен в TCP/IP протоколами адресации физических устройств, такими, как ARP (Address Resolution Protocol). Достоинством вертикально структурированных стеков протоколов является то, что при реализации программ для конкретного уровня не требуется учитывать детали реализации программ, принадлежащих другим уровням. Данные, сформированные программой прикладного уровня, разбиваются на пакеты, которые упаковываются в пакеты нижележащего уровня (инкапсуляция). При приеме этих упакованных пакетов происходит обратный процесс: принятые пакеты распаковываются и извлекаются из более пакетов нижележащего уровня (декапсуляция). Существуют документы, описывающие функционирование стека протоколов TCP/IP, Интернета и стандартных сетевых служб. Эти документы называются RFC (Request For Comments). Список RFC размещен на сайте IETF (Internet Engineering Task Force) www.ietf.org, www.rfc.net или www.rfc-editor.org. Список разнообразных протоколов находится в файле /etc/protocols Маршрутизаторы являются устройствами, передающими IP-пакеты между различными сетями. Решение о передаче IP-пакета в ту или иную сеть принимается маршрутизатором на основе анализа адреса сети назначения IP-пакета. В памяти маршрутизатора имеется таблица (таблица маршрутизации), в которой адресам сетей сопоставлены IP-адреса других маршрутизаторов, позволяющих передать пакет непосредственно в требуемую сеть или же передать другим маршрутизаторам, находящимся "ближе" к сети назначения. В одну и ту же сеть могут вести несколько маршрутов. Обычно среди них имеются более "короткие" и более "протяженные". Так как сложно составить таблицу маршрутизации, содержащую пути ко всем сетям, то используется маршрутизатор по умолчанию (default gateway). В качестве такового назначают маршрутизатор, позволяющий передавать пакеты в большее число сетей (в Интернете). Для обозначения адреса назначения "по умолчанию" (default) используется IP-адрес 0.0.0.0. Этот адрес указывают в качестве номера сети, в которую способен передавать пакеты маршрутизатор "по умолчанию" (default gateway). Имеются следующие блоки приватных адресов: 10.0.0.0—10.255.255.255, одна сеть 172.16.0.0—172.31.255.255, шестнадцать сетей 192.168.0.0—192.168.255.255, двести пятьдесят шесть сетей |
99. Адресация IPv6
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
Протокол IPv4 не обеспечивает достаточного адресного пространства. По этому был разработан новый протокол IPv6. Его особенности: - расширенное адресное пространство. В IPv6 вместо 32-разрядных адресов IPv4 используются 128-разрядные адреса - в адресах IPv6 нет понятия класса сети. Неудачный выбор схемы классовой адресации в IPv4 был основной причиной дефицита адресов в Интернете - упрощенный формат заголовка IP-пакета, позволяющий более эффективно обрабатывать IPv6-пакеты на маршрутизаторах - заголовки расширения, позволяющие после основного IPv6-заголовка пакета включать заголовки с дополнительной информацией в стандартном виде - поддержка качества обслуживания QOS (Quality Of Service) - встроенная поддержка IPSec, позволяющая создавать виртуальные частные сети - поддержка IPMobile, удобная для перемещающихся пользователей В IPv6 имеются три типа адресов: - Unicast — аналогичны обычным адресам IPv4, назначаемым интерфейсам - Multicast — адреса группового вещания - Anycast — адреса для достижения любого из устройств. Широковещательных адресов в IPv6 нет, поскольку в IPv4 в связи с использованием широковещания возникает множество проблем. В том числе и с безопасностью. В IPv6 можно использовать транспортные протоколы TCP и UDP. Имеется также собственный транспортный протокол, ориентированный на надежную работу с потоками информации — SCTP. Формат представления адресов IPv6 описан в RFC 2373, в котором установлено, что IPv6-адреса записывают в виде последовательности из шестнадцати пар, шестнадцатеричных чисел. Каждые две пары шестнадцатеричных чисел разделяют двоеточием (два байта). Таким образом, в IPv6-адресе должно быть восемь четырехразрядных шестнадцатеричных чисел, разделенных двоеточиями fe80:0000:0000:0000:0250:8bff:fe5f:7ceb Так как в большинстве IPv6-адресов имеются длинные последовательности нулей, то записывать их в полном виде не удобно. Вместо этого предлагается пользоваться сокращенной нотацией. В ней непрерывные последовательности нулей могут быть сокращены. При этом в IPv6-адресах в месте, где были сокращены нули, записывают два двоеточия :: . Сокращение нулей можно проводить лишь один раз. fe80::250:8bff:fe5f:7ceb Адрес loopback-интерфейса в IPv6 в сокращенном виде записывают: ::1, т. к. в нем 127 нулей и последняя единица. Если IPv6-адрес начинается с fe80, значит, этот адрес получен с помощью процедуры автоматического конфигурирования из MAC-адреса сетевого интерфейса. То есть такие адреса не надо назначать вручную, они определяются автоматически. Допустим, у Ethernet-интерфейса имеется MAC-адрес 00:50:8B:5F:7C:EB. Тогда автоматически сконфигурированный IPv6-адрес будет fe80::250:8bff:fe5f:7ceb. IPv6-адрес формируется автоматически добавлением после третьего байта MAC-адреса (с правой стороны) двух байтов FFFE, что заметно в приведенных адресах. Настройка маршрутизатора по умолчанию Если компьютер должен обмениваться IP-пакетами лишь в пределах локальной сети или соединения "точка — точка", то маршрутизацию настраивать не требуется. Сетевой интерфейс, которому назначен IP-адрес, принадлежит соответствующей сети. Маршрутизатор — это компьютер или специализированное устройство, позволяющее передавать пакеты из одной сети в другую. Для того чтобы компьютер мог быть маршрутизатором, он должен иметь как минимум два сетевых интерфейса (не обязательно физических). Кроме этого, ядро должно обеспечивать передачу IP-пакетов между интерфейсами (forwarding). Таблица маршрутизации находится в ядре, и в ней указаны маршруты направления IP-пакетов в различные сети. Маршрут связывает адрес сети назначения, адрес маршрутизатора и интерфейс, через который можно достичь этой сети. Протокол ARP предназначен для преобразования IP-адресов в MAC-адреса сетевых устройств. Результаты этого преобразования кэшируются. Кэш ARP можно просмотреть с помощью команды arp –an. Маршрутизатор по умолчанию route add default gw 192.168.1.1 netstat -rn route -n traceroute -n 8.8.8.8 |
100. Настройка сетевого интерфейса Ethernet
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 |
ifconfig - проверка состояния сетевых интерфейсов ifconfig -a - покажет все сетевые интерфейсы (неактивные в том числе) ifconfig eth0 down - отключить сетевой интерфейс eth0 (команда устарела) ifocnfig eth0 up - включить сетевой интерфейс eth0 (команда устарела) ifdown eth0 - отключить сетевой интерфейс ifup eth0 - включить сетевой интерфейс ip - управление сетевыми интерфейсами (замена ifconfig) ip help - помощь по команде ip ip addr help - помощь ip route help - помощь ip tunnel help - помощь ip addr show - получение информации о всех сетевых интерфейсах ip a - получение информации о всех сетевых интерфейсах ip addr show eth0 - отобразит информацию о eth0 ipcalc -bmn 192.168.1.100/27 - расчет маски под сети хост-компьютерам с помощью CIDR IP- адреса задать ip: ifconfig eth3 192.168.1.100 netmask 255.255.255.0 ip a a 192.168.1.100/24 dev eth3 маршруты: route -n - показать таблицу маршрутов route add default gw 192.168.0.1 - задать маршрут по умолчанию route add -net 192.168.0.0 netmask 255.255.0.0 gw 192.168.1.1 - создать маршрут route del -net 192.168.0.0 netmask 255.255.255.0 eth0 - удалить маршрут traceroute -n ya.ru - покажет маршрут traceroute -ln ya.ru - покажет маршрут как в windows покажет dns: host ya.ru - все о DNS ya.ru dig ya.ru - все о DNS ya.ru nslookup ya.ru - все о DNS ya.ru nslookup ya.ru 8.8.8.8 - все о DNS ya.ru спросили у 8.8.8.8 мониторинг: ping 192.168.0.1 - пинг ping -c 1 -s 134 8.8.8.8 - послать 1 пакет размером 134 lsof -i udp информация кто использует UDP lsof -i :22 информация кто использует 22 порт netstat -nt netstat -nlp |grep :25 netstat -i netstat -apn --inet netstat -ltpn --inet netstat -tuep информация кто использует TCP и UDP (а также процесс и только для установленных соединений) ss -s Мониторинг сетевых соединений. похожа на netstat ss -l Информация об ожидающих соединений сокетах ss -lp Информация об ожидающих соединений сокетах, а также именах процессов, их использующих ss -at Информация обо всех задействованных TCP сокетах ss -au Информация обо всех задействованных UDP сокетах ss -o state established '( dport = :smtp or sport = :smtp )' Информация обо всех установленных SMTP-соединениях ss -o state established '( dport = :http or sport = :http )' Информация обо всех установленных HTTP-соединениях: ss -x src /tmp/.X11-unix/* Локальные процессы, подключённые к X-серверу: ss -o state fin-wait-1 '( sport = :http or sport = :https )' dst 202.54.1/24 TCP-сокеты, находящиеся в состоянии FIN-WAIT-1 для соединений из подсети сканирование: nmap -v -A 192.168.0.101 nmap -v -sP 192.168.0.101/24 nmap -O target.host.com nmap -vv host.target.com nmap -sP 192.168.1.0/24 - Узнать занятые IP в сети 1.0/24 (IP, MAC, hostname) nmap -sS -sV -O tager.ru - Скрытое SYN сканирование с определением типа и версии ОС nmap -sX -p 22 192.168.10.10-250 -oN /data/host.txt - Сканирование машин с ip от 10 по 250 и запись результата Включить forward между интерфейсами: echo 1 > /proc/sys/net/ipv4/ip_forward Снифер: tcpdump -i eth0 tcpdump -n -i eth0 ether host mac tcpdump -nl -i eth0 not port ssh and src \(192.168.1.10 or 192.168.1.15\) tcpdump -n -i eth0 net 192.168.1.15 - трафик с/на IP tcpdump -n -i eth0 net 192.168.1.0/24 - трафик с/в сеть tcpdump -l > dump && tail -f dump - Вывод с записью в файл tcpdump -i eth0 -w traffic.eth0 - Информация о трафике записывается в бинарный файл traffic.eth0 tcpdump -i eth0 -s 0 -w traffic.eth0 - Запись + загрузка в бинарник tcpdump -r traffic.eth0 - Читаем из файла tcpdump port 80 - Весь трафик на 80 порт и ответы tcpdump host google.com - Весь с/на google.com tcpdump -i eth0 -X port \(110 or 143\) - Проверка pop и imap на безопасность tcpdump -n -i eth0 icmp - Ловим pings tcpdump -i eth0 -s 0 -A port 80 | grep GET - (-s 0 весь пакет, -A для ASCII) |
101. Разрешения имен / резолв / DNS
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
Сетевое имя машины, работающей под управлением GNU/Linux, может быть получено и установлено с помощью команды hostname Имена узлов используются для более понятного указания их в сети. Для человека гораздо более удобно использовать имена компьютеров вместо их IP-адресов. Таким образом, требуется специальная служба для разрешения имен узлов, т. е. преобразования имени узла в его IP-адрес. Часто требуется также осуществить обратное преобразование: из IP-адреса в имя узла. Преобразование осуществляется с помощью специальной библиотеки resolver. Существуют следующие способы преобразования: - с помощью файла /etc/hosts. Этот способ подходит для небольших сетей; - с помощью обращения к службе DNS (Domain Name Service); - с помощью обращения к службам NIS, NIS+, LDAP и прочим. Создание статичного списка соответствий IP-адресов именам узлов сети наиболее простой способ получения разрешения имен. Он годится для небольших сетей, т. к. на каждом узле сети должны быть копии файла /etc/hosts. В каждой строке этого файла указывают IP-адрес и имена узла. Пример: cat /etc/hosts 127.0.0.1 localhost 192.168.1.100 mycomp.mynet.net mycomp Если имена узлов и их IP-адреса указаны верно, то в этом случае resolver обеспечит преобразование имен узлов в их адреса Пример: ping –c2 mycomp PING mycomp (192.168.1.100) 56(84) bytes of data. 64 bytes from mycomp (192.168.1.100): icmp_seq=1 ttl=64 time=0.245 ms Настройки resolver хранятся в файле /etc/resolver.conf cat /etc/resolv.conf nameserver 192.168.1.254 search mydom.com, mydom.net Директива nameserver задает IP-адрес DNS-сервера, обслуживающего данный компьютер. С помощью последней директивы — search — задают список доменов, имена которых будут автоматически подставляться к именам узлов при их поиске. Таким образом, в большинстве случаев для преобразования имени узла в его IP-адрес требуется либо указать его адрес и имя в /etc/hosts, либо настроить доступ к DNS-серверу, указав его IP-адрес в файле /etc/resolv.conf. Имеются еще два конфигурационных файла, настройки которых влияют на поведение библиотеки resolver — /etc/host.conf и /etc/nsswitch.conf. Для resolver они важны с точки зрения порядка разрешения имен: будет ли сначала произведено обращение к файлу /etc/hosts или же к DNS Пример: cat /etc/host.conf order host, bind multi on Здесь задан следующий порядок работы resolver: при разрешении имени узла сначала осуществляется просмотр записей в файле /etc/hosts, а затем — обращение к DNS. Директива multi on заставляет resolver выводить все адреса узлов, имеющих несколько IP-адресов. Файл /etc/nsswitch.conf (Name Service Switch) предназначен для сообщения библиотеке resolver и другим системным вызовам, где искать требуемую информацию. Файл /etc/nsswitch.conf содержит централизованную конфигурационную информацию о доменах и связанных с ними базах данных: aliases — почтовые псевдонимы почтового транспортного агента ethers — источник информации о MAC-адресах group — источник информации о группах пользователей hosts — порядок разрешения имен узлов netgroup — список пользователей каждого хоста для службы NIS network — источник информации об именах и адресах сетей passwd — список поиска источников паролей пользователей protocols — список поиска протоколов, используемых в сети publickey — местоположение ключей шифрования rpc — список поиска имен и номеров вызываемых удаленных процедур services — список поиска сетевых служб shadow — список поиска шифрованных паролей При использовании DNS и /etc/hosts в файле /etc/nsswitch.conf должны содержаться строки, представленные в примере hosts: files dns networks: files dns Первая настройка задает порядок разрешения имен узлов: сначала будет произведено обращение к /etc/hosts, а далее — к DNS. Вторая настройка задает аналогичный порядок для сетей: сначала к /etc/networks, а затем к DNS. |
102. Поиск и устранение проблем с сетью
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
Прохождение пакетов командой ping нужно производить в следующем порядке: 1. Проверить работоспособность сетевой инфраструктуры в ядре ping 127.0.0.1. 2. Проверить работоспособность сетевого адаптера с помощью команды ping, которой указан IP-адрес, привязанный к данному адаптеру. 3. Проверить прохождение пакетов в пределах данной сети, послав командой ping ICMP-пакеты любому узлу в данной сети или маршрутизатору. 4. Проверить прохождение пакетов к внешнему сетевому адаптеру маршрутизатора. 5. Послать ICMP-пакеты по любому известному IP-адресу сети. В качестве последней проверки можно протестировать работоспособность библиотеки resolver, выполнив ping с указанием имени компьютера в качестве аргумента. Задача протокола ARP состоит в сопоставлении IP-адресов сетевых интерфейсов их MAC-адресам, поэтому в информации, выводимой командой arp –a, должны содержаться правильные соответствия. В противном случае неверные записи должны быть стерты с помощью команды arp -d <имя узла>. Невозможность приема и передачи ICMP-пакетов (как и других пакетов IP) может быть вызвана их блокированием на передающем и/или принимающем узле. Проверьте файрволл iptables iptables -S iptables-save При этом следует проверить правильность указания IP-адреса DNS-сервера в файле /etc/resolv.conf и правильность соответствий IP-адресов в файле /etc/hosts. Имеются специальные команды: host, dig и nslookup, позволяющие тестировать правильность работы DNS. При необходимости получения административной информации о каком-либо домене DNS можно использовать команду whois |
103. Сервисы сети
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
Процесс взаимодействия программ в сети проходит в соответствии с требованиями протокола прикладного уровня (Application Layer). В TCP/IP для идентификации служб, которые могут быть запущены на каком-либо узле сети, используются номера портов в диапазоне от 0 до 65 535 (шестнадцать битов). Номера портов назначаются IANA (Internet Assigned Numbers Authority). Многие номера портов, меньшие 1024 и некоторые большие, закреплены за определенными службами сети (Well Known Services). Вот список некоторых: 20 — данные, передаваемые сервисом FTP 21 — управляющая информация для сервиса FTP 22 — протокол SSH 25 — транспортный почтовый протокол SMTP 23 — удаленный доступ с помощью Telnet 53 — протокол DNS 80 — протокол HTTP 110 — доставка почты по протоколу POP3 119 — служба доставки новостей NNTP 139 — протокол NetBIOS 143 — удаленный доступ к почтовым ящикам по протоколу IMAP 161 — протокол управления сетью SNMP 389 — протокол доступа к службам каталогов LDAP Список имен служб находится в файле /etc/services Службы, номера портов которых меньше 1024, называются привилегированными. Серверные приложения, открывающие данные порты, могут быть запущены лишь суперпользователем. В противоположность привилегированным портам порты с номерами от 1024 до 65 535 называют эфемерными, поскольку большинство из них не закреплено за какими-либо службами сети и используются клиентскими приложениями для связи с серверами. Для связи между двумя сетевыми приложениями каждое из них должно открыть сокет (socket). Список активных соединений выводит команда netstat. Если необходимо получить список не только установленных соединений, но и перечень портов, открытых для соединения, то можно использовать опцию -a команды netstat. Ограничить вводимую информацию лишь TCP- или UDP- портами можно, используя опции, соответственно, -t или -u netstat -ta ss -tupln Открытые, но не используемые порты, представляют собой брешь в системе безопасности, поскольку каждый прослушиваемый порт представляет собой потенциальную цель атаки. |
104. tcpd
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
Программа tcpd (TCP Wrapper) представляет собой средство фильтрации IP-пакетов, позволяющее ограничить список IP-адресов, с которых могут поступать запросы на сервисы, предоставляемые супердемоном inetd. Поведение tcpd задается с помощью двух файлов: - /etc/hosts.allow — разрешает соединения - /etc/hosts.deny — запрещает соединения Порядок работы директив в /etc/hosts.allow и /etc/hosts.deny приведен далее. 1. Если в файле /etc/hosts.allow для заданной пары "узел сети — служба" находится совпадение, то для данного узла доступ к этой службе разрешается. 2. Если в предыдущем файле совпадение не найдено, то осуществляется просмотр файла /etc/hosts.deny. При наличии в нем совпадения для заданной пары "узел сети — служба" доступ к данной службе с этого узла запрещается. 3. При отсутствии совпадений в обоих файлах доступ разрешается. Формат записей в файлах /etc/hosts.allow и /etc/hosts.deny таков: имя демона: список доступа В списке доступа определяются группы адресов, с которых могут поступать запросы на конкретные сервисы: ALL — все адреса EXCEPT — исключения из списка KNOWN — хосты, соответствие IP-адресов именам которых можно проверить LOCAL — локальный адрес PARANOID — хосты, имена которых не соответствуют их IP-адресам (для проверки используется обратное преобразование имен в DNS: из IP-адресав имя хоста) UNKNOWN — хосты, имена которых не могут быть разрешены, а также сюда относятся пользователи, не зарегистрированные в целевой системе. cat /etc/hosts.deny ALL: mail.yahoo.com, .badspammers.org ALL EXCEPT ftp: comp1.smallnet.ru, .rcpmk.ru telnet: ALL EXCEPT LOCAL Для проверки правильности конфигурации файлов /etc/hosts.allow и /etc/hosts.deny используется команда tcpdchk. Кроме этого, имеется утилита tcpdmatch, которая пытается определить, каким образом tcpd будет отрабатывать запросы к inetd. Ее удобно использовать при наличии сложных правил фильтрации. |