- •1Изучение unix® (Linux)
- •1.1Человеко-машинные системы
- •1.2Процедурные системы
- •1.3Проективные системы
- •1.4Открытые технологии
- •1.4.1История развития gnu/Linux
- •1.4.2Архитектура и философия unix®.
- •2Компоненты unix®
- •2.1Ядро
- •2.2Управление памятью
- •2.3Управление процессами
- •2.4Демоны
- •2.5Понятие файла в Linux
- •2.6Организация хранения файлов
- •2.6.1Что такое файловая система?
- •2.7Файловые системы Linux
- •2.8Утилиты
- •2.9Типы программ
- •3Процедура загрузки ос Linux
- •3.1Основные конфигурационные файлы
- •3.2Загрузка в однопользовательском режиме
- •3.3Настройка общесистемных сервисов
- •3.3.1Редактирование файла /etc/fstab
- •3.4Файлы и разделы подкачки
- •3.5Запуск демонов
- •3.6Процессы
- •3.7Управление процессами
- •3.7.1Команда ps
- •3.7.2Команда top
- •3.7.3Приоритеты
- •3.7.4Сигналы и команда kill
- •3.7.5Перевод процесса в фоновый режим
- •3.8Gnu grub загрузчик
- •3.8.1Что такое grub?
- •3.8.2Компиляция и инсталляция программного пакета grub
- •3.8.3Инсталляция загрузчика grub
- •3.8.4Конфигурация grub
- •4Справочная система Linux
- •4.1Руководство (man)
- •4.1.1Утилита man
- •4.2Утилиты whatis и apropos
- •4.3Работа с man
- •4.3.1Система info
- •4.3.3Howto файлы
- •4.3.4Ресурсы в Интеренете.
- •5Оболочка, Shell, командный интерпетатор.
- •5.1Начало работы с Shell
- •5.2Программы
- •5.2.1Выполнение команд
- •5.3Команды Shell
- •5.3.1Опции
- •5.3.2Аргументы
- •5.3.3Исключения
- •5.4Виртуальные консоли
- •5.5Псевдонимы и переменные
- •5.6Навигация и редактирование
- •5.7История команд
- •5.8Простые регулярные выражения
- •5.9Запуск команды на выполнение
- •5.10Стандартный ввод/вывод
- •5.11Фильтры
- •6Shell как язык программирования
- •6.1Сценарий
- •6.2Запуск сценария
- •6.3Встроенные переменные
- •6.4Условия проверки
- •6.4.1Сложные условия поиска:
- •6.4.2Условный оператор "if"
- •6.4.3Конструкции
- •6.4.4Оператор вызова ("case")
- •6.4.5Пустой оператор
- •6.5Функции в shell
- •6.6Популярные команды
- •6.6.1Поиск файлов.
- •6.6.2Поиск внутри файла
- •7Управление пользователями
- •7.1Структура файла /etc/passwd
- •7.2Структура файла /etc/group
- •7.3Псевдопользователи
- •7.4Команды работы с учетными записями пользователей
- •8Установка программного обеспечения
- •8.1Утилита rpm
- •8.2Утилита Apt
- •8.2.1Использование apt
- •8.2.2Установка или обновление пакетов.
- •8.2.3Удаление установленного пакета.
- •8.2.4Обновление всех установленных пакетов
- •8.2.5Поиск в репозитарии
- •9Сборка по из исходных кодов
- •9.1.1Необходимые сведения о программировании на языке Си
- •9.1.2Инсталляция из исходных текстов
- •10Файловая система
- •10.1Основы работы файловых стистем
- •10.1.1Файлы
- •10.1.2Каталоги
- •10.1.3Типы файлов
- •10.1.4Файлы физических устройств
- •10.1.5Именованные каналы (pipes)
- •10.1.6Сокеты (sockets)
- •10.1.7Символические ссылки
- •10.1.8Права доступа к файлам и каталогам
- •10.1.9Расширенные атрибуты доступа
- •10.2Управление файловой системой
- •10.2.1Разбиение диска на разделы, fdisk
- •10.2.2Создание и монтирование файловых систем
- •10.2.3Команды для работы с файлами
- •10.3Команда find и символы шаблонов для имен файлов
- •10.4Команда split — разбиваем файл на несколько частей
- •10.5Сравнение файлов и команда patch
- •10.6Команды архивирования файлов
- •10.6.1Программа tar
- •10.6.2Программа gzip
- •10.6.3Программа bzip2
- •10.6.4Примеры применения tar
- •11Сетевая файловая система (nfs)
- •11.1Запуск nfs
- •11.2Монтирование тома nfs
- •11.4Файл exports
- •12Популярные приложения
- •12.1Эффективная работа с vim
- •12.2Эффективно передвигаемся по файлу
- •12.3Вставка
- •12.4.1Использование mc
- •12.4.2Встроенный ftp-клиент
- •12.4.3Переименование групп файлов
- •13Сетевые средства Linux
- •13.1Общие сведения о сетях
- •13.1.1Стек tcp/ip
- •13.1.2Адресация Internet
- •13.1.3Система имен доменов (dns - Domain Name System)
- •13.1.4Модель Клиент-Сервер
- •13.1.5Адреса tcp/ip
- •13.1.6Преобразование адресов
- •13.2Конфигурация сетевых интерфесов
- •13.2.1Адрес сети
- •13.2.2Широковещательный адрес
- •13.2.3Адрес шлюза
- •13.2.4Адрес сервера имен
- •13.2.5Маска сети
- •13.3Файлы конфигурации tcp/ip
- •13.3.1Файл /etc/hosts
- •13.3.2Файл /etc/networks
- •13.3.3Файл /etc/init.D/network
- •13.3.4Параметры dns
- •13.3.5Файл host.Conf
- •13.3.6Файл /etc/resolv.Conf
- •13.4Команда ifconfig
- •13.5Маршрутизация
- •14Контроль состояния сети
- •14.3Команда lsof
- •14.4Проверка arp-таблиц
- •15Управление работой межсетевого экрана (брандмауэра) netfilter
- •15.1Настройка межсетевого экрана Iptables
- •15.2Порядок прохождения таблиц и цепочек
- •15.2.1Общие положения
- •15.3Как строить правила - основы
- •15.3.1Команды
- •15.3.2Критерии
- •15.3.3Общие критерии
- •15.4Неявные критерии
- •15.4.1Tcp критерии
- •15.4.2Udp критерии
- •15.4.3Критерий mac
- •16Shorewall: iptables с человеческим лицом
- •16.1Базовая настройка
- •16.2Фильтрация трафика
- •16.3Дополнительные возможности
- •16.3.1Вместо заключения
- •16.4Приложение. Устанавливаем Shorewall
- •17Управление ядром
- •17.1Версия ядра
- •17.2Причины для пересборки ядра
- •17.3Подготовка
- •17.4Компиляция (Make)
- •17.5Установка заплат
- •17.6Сборка единичного модуля
- •18Мониторинг системы
- •18.1Система ведения логов
- •18.2Демон Syslogd
- •18.2.1Параметры запуска
- •18.2.2Сигналы
- •18.2.3Файл конфигурации
- •18.2.4Советы по настройке syslog
- •18.3Logger - утилита записи в журнал
- •18.4Logrotate или "что делать со старыми журналами?"
- •18.5Logwatch или "как извлечь полезную информация из кучи мусора?"
- •19Cron - планирование заданий
- •19.1Настройка задач Cron
- •19.2Запуск и остановка службы
- •19.3Системное время
- •20Резервное копирование в Linux
- •20.1Использование серверов резервного копирования
- •20.2Аппаратные средства, предназначенные для создания резервных копий
- •20.3Способы резервного копирования
- •20.3.1Резервное копирование, инициируемое клиентом
- •20.3.2Резервное копирование, инициируемое сервером
- •20.4Использование tar
- •20.4.1Возможности tar
- •20.4.2Список команд tar:
- •20.4.3Использование smbtar
- •20.4.4Создание разделяемых объектов резервного копирования
- •20.5Обзор и установка системы резервного копирования BackupPc
- •20.5.1Введение
- •20.5.2Требования к установке
- •20.5.3Настройка BackupPc
- •20.5.4Интерфейс
- •21Основы безопасности Linux
- •21.1Меры предосторожности
- •21.2Принципы защиты
- •21.3Идентификаторы пользователя и группы пользователей
- •21.4.1Безопасность файлов
- •21.5Важные системные файлы
- •21.6Проблемы защиты /etc/passwd и /etc/shadow
- •21.6.1Скрытые пароли
- •21.6.2Устаревание паролей
5.9Запуск команды на выполнение
Сама техника организации запуска команд на выполнение не является предметом нашего рассмотрения. Можно только кратко сказать, что оболочка должна найти код команды, загрузить его в память, передать команде аргументы, заданные в командной строке, а после завершения выполнения соответствующего процесса передать каким-то образом пользователю или другому процессу результаты выполнения данной команды. Эти этапы мы кратко и рассмотрим.
Итак, первый этап — поиск кода команды. Команды бывают встроенные (те, код которых включен в код самой оболочки) и внешние (код которых расположен в отдельном файле на диске). Встроенную команду оболочка всегда найдет, а для поиска внешней команды пользователь, в принципе, должен указать оболочке полный путь до соответствующего файла. Однако для облегчения жизни пользователей оболочка умеет искать внешние команды в каталогах, которые перечислены в специально заданных "путях поиска". Только если она не находит нужных файлов в таких каталогах, она решает, что пользователь ошибся при вводе имени команды. О том, как включить каталог в пути поиска, будет сказано ниже, а сейчас рассмотрим, как оболочка организует передачу данных исполняемой команде и выдачу результатов пользователю.
5.10Стандартный ввод/вывод
Потоки ввода-вывода
Каждому процессу сопоставлена таблица открытых им файлов. Три первых позиции в этой таблице заняты всегда: каждый процесс открывает потоки (помните, что в UNIX файл — это и есть поток данных?) для ввода и вывода данных, а также вывода сообщений об ошибках и другой диагностической информации.
Эти потоки:
0 — стандартный ввод (stdin), по этому каналу данные передаются программе;
1 — стандартный вывод (stdout), по этому каналу программа выводит результаты своей работы;
2 — стандартный поток сообщений об ошибках (stderr). По этому каналу программы выдают информацию об ошибках.
Ссылаться на эти потоки можно по их файловым дескрипторам. 0,1 и 2 - это и есть такие дескрипторы.
Из стандартного входа программа может только читать, а два других потока могут использоваться программой только для записи.
По умолчанию входной поток связан с клавиатурой, а выходной поток и поток сообщений об ошибках направлены на терминал пользователя. Другими словами, вся выходная информация запущенной пользователем команды или программы, а также все сообщения об ошибках, выводятся в окно терминала. Однако, как мы увидим чуть ниже, можно перенаправить выходные сообщения (например, в файл).
Для того, чтобы продемонстрировать, как работает стандартный поток ошибок, выполните команду ls с неверным аргументом, например, задав в качестве аргумента имя несуществующего файла. В таком случае ls выведет сообщение об ошибке в стандартный поток ошибок. Для нас, однако, в данном случае стандартный поток ошибок неотличим от выходного потока, поскольку сообщение об ошибке мы видим в окне терминала.
Работу со стандартными входным и выходным потоками лучше всего проиллюстрировать на примере команд echo и cat.
Команда echo
Команда echo предназначена для выдачи на стандартный вывод строки символов, которая задана ей в качестве аргумента. После этого она выдает сигнал перевода строки и завершается. Попробуйте выполнить команду
[user]# echo ‘Привет, дружище!’
и, думаю, дальнейших пояснений не потребуется (только используйте именно одиночные кавычки, иначе результат может быть несколько иным).
Команда cat
Мы уже рассматривали кратко команду cat в предыдущем разделе. В данном разделе эта команда интересует нас в основном потому, что чаще всего она работает как раз с входным и выходным потоками. По умолчанию выход команды cat направляется в выходной поток. Чтобы убедиться, что эта команда по умолчанию воспринимает входной поток, запустите команду cat без аргументов. В результате курсор переместится в новую строку, и более как будто ничего не будет происходить. В это время команда ожидает поступления символов во входном потоке. Введите любой символ, и вы увидите, что он сразу же появился на экране, что говорит о том, что программа сразу же направила его в выходной поток. Можно продолжить ввод символов, и они также появятся на экране.
Обычно клавиатура настроена на построчный ввод, поэтому если вы нажмете клавишу <Enter>, последняя набранная строка передается команде cat, которая вновь выводит данные на монитор через стандартный вывод. Таким образом, каждая строка будет показана дважды: один раз при наборе и второй раз — командой cat.
Если нажать комбинацию клавиш <Ctrl>+<D>, которая служит командой окончания процедуры ввода, вы вновь вернетесь к подсказке в командной строке. Можно также использовать комбинацию клавиш <Ctrl>+<C>, которая является в оболочке командой завершения работы запущенной программы.
Если команде cat в качестве аргумента задать имя файла, это будет означать, что содержимое файла будет направлено во входной поток, откуда его примет команда cat и выдаст в выходной поток. Но это только частный случай перенаправления ввода, очень полезного механизма оболочки, который, безусловно, заслуживает более подробного рассмотрения.
Перенаправление, каналы и фильтры
Хотя обычно, как было сказано, ввод/вывод программы связаны со стандартными потоками, в оболочке существуют специальные средства для перенаправления ввода/вывода.
Операторы >, < и >>
Для обозначения перенаправления используются символы ">", "<" и ">>". Чаще всего используется перенаправление вывода команды в файл. Вот соответствующий пример:
[user]# ls -l > /home/jim/dir.txt
По этой команде в файле /home/jim/dir.txt будет сохранен перечень файлов и подкаталогов того каталога, который был текущим на момент выполнения команды ls; при этом если указанного файла не существовало, то он будет создан; если он существовал, то будет перезаписан; если же вы хотите, чтобы вывод команды был дописан в конец существующего файла, то надо вместо символа > использовать >>. При этом наличие пробелов до или после символов > или >> несущественно и служит только для удобства пользователя.
Вы можете направить вывод не только в файл, но и на вход другой команды или на устройство (например, принтер).
Так, для подсчета числа слов в файле /home/jim/report.txt можно использовать следующую команду:
[user]# cat /home/jim/report.txt > wc -w
а для вывода файла на печать — команду:
[user]# cat /home/jim/report.txt > lpr
Как видите, оператор > служит для перенаправления выходного потока. По отношению к входному потоку аналогичную функцию выполняет оператор <. Приведенный выше пример команды для подсчета числа слов в определенном файле можно переписать следующим образом (обратите внимание на отсутствие команды cat):
[user]# wc -w < /home/jim/report.txt
Этот вариант перенаправления часто используется в различных скриптах, применительно к тем командам, которые обычно воспринимают ввод (или ожидают ввода) с клавиатуры. В скрипте же, автоматизирующем какие-то рутинные операции, можно дать команде необходимую информацию из файла, в который заранее записано то, что нужно ввести для выполнения этой команды.
В силу того, что символы <, > и >> действуют на стандартные потоки, их можно использовать не только тем привычным образом, как это делается обычно, но и несколько по-другому. Так, следующие команды эквивалентны:
[user]# cat > file
[user]# cat>file
[user]# >file cat
[user]# > file cat
Однако сам по себе (без какой-либо команды, для которой определены стандартные потоки) символ перенаправления не может использоваться, так что нельзя, например, введя в командной строке
[user]# file1 > file2
получить копию какого-то файла. Но это не уменьшает значения данного механизма, ведь стандартные потоки определены для любой команды. При этом перенаправить можно не только стандартный ввод и вывод, но и другие потоки. Для этого надо указать перед символом перенаправления номер перенаправляемого потока. Стандартный ввод stdin имеет номер 0, стандартный вывод stdout — номер 1, стандартный поток сообщений об ошибках stderr — номер 2. То есть полный формат команды перенаправления имеет вид (напомним, что пробелы возле > не обязательны):
# command N > M
где N и M — номера стандартных потоков (0,1,2) или имена файлов. Употребление в некоторых случаях символов <, > и >> без указания номера канала или имени файла возможно только потому, что вместо отсутствующего номера по умолчанию подставляется 1, т. е. стандартный вывод. Так, оператор > без указания номера интерпретируется как 1 >.
Кроме простого перенаправления стандартных потоков существует еще возможность не просто перенаправить поток в тот или иной канал, а сделать копию содержимого стандартного потока. Для этого служит специальный символ &, который ставится перед номером канала, на который перенаправляется поток:
command N > &M
Такая команда означает, что выход канала с номером N направляется как на стандартный вывод, так и дублируется в канал с номером M. Например, для того, чтобы сообщения об ошибках дублировались на стандартный вывод, надо дать команду 2>&1, в то время как
1>&2 дублирует stdout в stderr. Такая возможность особенно полезна при перенаправлении вывода в файл, так как мы тогда одновременно и видим сообщения на экране, и сохраняем их в файле.
Например:
ls /usr/ /rrr > list 2>&1
Эта команда создаст файл «list» который будет содержать список файлов в каталоге /usr и сообщение об ошибке, что каталога /rrr не существует. Приведем еще примеры использования перенаправления стандартных потоков. Пусть к примеру, вы хотите отправить своему другу послание по электронной почте.
$ mail vasya@pupkin.ru < message.txt
Здесь в качестве стандартного ввода для программы mail используется перенаправление на файл message.txt. По умолчанию же программа mail ассоциирует стандартный поток ввода с терминалом.
Другой Пример Пусть у вас есть некоторая "капризная" программа, при запуске выводящая сообщения об ошибках. Вам, как системному администратору, необходимо связаться с разработчиками, послав им это самое сообщение.
$ bad_prog >> /var/log/bad_prog.log
Вывод программы bad_prog будет производиться в конец файла bad_prog.log, т.е. все предыдущие записи сохраняются. Если же файла bad_prog.log не существует, он будет создан.
Всем трем стандартным потокам ввода, вывода и ошибок назначены также численные значения, так называемые дескрипторы, соответственно 0, 1, 2. Используя эти дескрипторы можно объединять и перенаправлять конкретные потоки. Например, вернемся к предыдущему случаю:
$ bad_prog >>/var/log/bad_prog.log 2>&1
В таком случае происходит объединение потоков вывода и ошибок в один, и происходит перенаправление в файл bad_prog.log. Знак "&" перед дескриптором потока необходим для того, чтобы отличить его например от файла с именем "1". В инициализационных скриптах системы также очень часто используется подавление потока вывода и ошибок.
$ prog1 >/dev/null 2>&1
/dev/null это псевдоустройство, которое уничтожает направленный в него поток.
Оператор |
Особым вариантом перенаправления вывода является организация программного канала (иногда называет трубопроводом или конвейером). Для этого две или несколько команд, таких, что вывод предыдущей служит вводом для следующей, соединяются (или разделяются, если вам это больше нравится) символом вертикальной черты — "|". При этом стандартный выходной поток команды, расположенной слева от символа |, направляется на стандартный ввод программы, расположенной справа от символа |.
Например:
[user]# cat myfile | grep Linux | wc -l
Эта строка означает, что вывод команды cat, т. е. текст из файла myfile, будет направлен на вход команды grep, которая выделит только строки, содержащие слово "Linux". Вывод команды grep будет, в свою очередь, направлен на вход команды wc -l, которая подсчитает число таких строк.
Программные каналы используются для того, чтобы скомбинировать несколько маленьких программ, каждая из которых выполняет только определенные преобразования над своим входным потоком, для создания обобщенной команды, результатом которой будет какое-то более сложное преобразование.
Надо отметить, что оболочка одновременно вызывает на выполнение все команды, включенные в конвейер, запуская для каждой из команд отдельный экземпляр оболочки, так что как только первая программа начинает что-либо выдавать в свой выходной поток, следующая команда начинает его обрабатывать. Точно так же каждая следующая команда выполняет свою операцию, ожидая данных от предыдущей команды и выдавая свои результаты на вход последующей. Если вы хотите, чтобы какая-то команда полностью завершилась до начала выполнения последующей, вы можете использовать в одной строке как символ конвейера |, так и точку с запятой ;. Перед каждой точкой с запятой оболочка будет останавливаться и ожидать, пока завершится выполнение всех предыдущих команд, включенных в конвейер.
Статус выхода (логическое значение, возвращаемое после завершения работы программы) из канала совпадает со статусом выхода, возвращаемым последней командой конвейера. Перед первой командой конвейера можно поставить символ "!", тогда статус выхода из конвейера будет логическим отрицанием статуса выхода из последней команды. Оболочка ожидает завершения всех команд конвейера, прежде чем установить возвращаемое значение.
Передача потока вывода одной программы в поток ввода другой используется часто. Например:
$ gzip -d archive.tar.gz | tar -xf
Здесь происходит разархивация файла archive.tar.gz, запакованного двумя архиваторами. Выходной поток от утилиты gzip передается во входной поток утилите tar. Аналогично эту же операцию можно было выполнить и по другому:
$ gzip -d archive.tar.gz
$ tar -xf archive.tar
