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 удаляет повторения строки в сортированном пот |