Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

unix2

.txt
Скачиваний:
0
Добавлен:
14.01.2020
Размер:
174.21 Кб
Скачать
1. Вход в систему на удаленном хосте

Первый сеанс работы:

A.
Вызываем икону в форме квадрата с узлами в вершинах TN - это MS-DOS
клиент telnet. Он раскроется на полный экран 25 х 80 символов.
И выдаст следующий Prompt (приведен также и ответ пользователя):

Node to connect: prison # либо 10.53.24.12

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

Произойдет соединение с telnet-сервером (процесс-демон
telnetd) на хосте под FreeBSD c указанным IP-адресом или
DNS-именем cетевого интерфейса.

На каждый поступивший запрос от очередного клиента на telnet-соединение
на удаленой FreeBSD-системе будет порожден новый отдельный
процесс-демон telnetd, (копия программы, которая будет заниматься
толоко одним этим соединением). Если в данный момент на рабочих
станциях дисплейных классов ауд. 1226 посредством telnet-клиентов
работают 34 студента, то на удаленной FreeBSD-системе порождено
34 отдельных процесса-демона (копии программы telnetd), каждый
демон telnetd соединен только с Одним своим клиентом. (Демонами
называются процессы, не имеющие управляющего терминала).

Как только очередное соединение будет установлено, в системе
FreeBSD будет задействовано новое пседоустройство - псевдотерминал
(p0,p1,...,p9,pa,pb,...). Этот псевдотерминал по протоколу telnet
и уровням стека протоклов TCP/IP будет совмещен с окном клиента
telnet на соотвествующей рабочей станции в ауд.1226 (и экран, и
клавиатура). Сообщение о том под какой операционой системой
работает telnet-сервер и какой псевдотерминал выделен для данного
соединения telnetd отправвит по обратному адресу, имеющемуся в
запросе на соединение, telnet-клиенту, пославшему запрос. Имя
каждого териминала имеет префикс из трех символов tty, обозначающих
тип терминала. Демон telnetd породит процесс login (каждый демон
порождает свой отдельный процесс login, т.е. для 34 студентов,
работающих в данный момент, будет 34 процесса login), и передаст
очередной псевдотерминал порожденному им процессу login.

Процесс login выдаст на псевдотерминал (далее будем говорить
просто на терминал, поскольку все что он выдаст на псевдотерминал
появится в окне соотвествующего клиента telnet, т.е. на экране
вашего рабочего места в ауд.1226, также как все, что вы введете
с клавиатиры в окно клиента telnet на своем рабочем месте поступит
процессу в системе FreeBSD, с которым в данный момент связан
соотвествующий псевдотерминал). Итак, процесс login выдаст на
терминал следующий запрос на ввод (PROMPT):

B.
FreeBSD/i386 (доменное имя) ( ttypb )
login: mlepes

Пользователь вводит свой login (mlepes). При создании аккаунта,
каждому студенту я присваивал 6-символьный login (он же USERname)
из 26-символьного алфавита Latin LowCase - 26 букв нижнего регистра
английского алфавита. Мой типовой способ получения login - первая
буква имени плюс пять букв фамилии. Иногда были исключения - 2
буквы имени и 4 буквы фамилии, или 3+3. Иногда 2-я буква бралась из
отчества. Исключения были по различным причинам: фамилия короче
5 символов, получаемый логин уже был в системе, получается
неблагозвучный или оскорбительный логин и т.д. В примере ответа
пользователя использован login Марии Лепешевой.

login (или USERname) однозначно соотвествует одной конкретной
личности, которой был выдан аккаунт, или одному псевдопользователю
(за которым не стоит никакая конкретная личность, например
псевдопользователь operator). Еще одним примером псевдопользователя
является суперпользователь с максимальными правами root, имеющийся
в любом без исключения виде ОС UNIX. Не бывает login-а для группы
пользователей, каждый login соотвествует только одному пользователю
или псевдопользователю. Также в системе не может быть двух
одинаковых login.

Процесc login выдает на терминал следующий PROMPT:

C.
Password:

Пользователь вводит свой пароль.

При вводе пароля эхо-отбражение на псевдотерминале отключается,
поэтому ничего отображаться не будет и даже курсор не будет
двигаться, чтобы подсматривающему за вашей спиной нельзя было
определить даже число символов в пароле. При вводе пароля лучше
на экран вообще не смотреть, Windos-овская привычка видеть какие-то
звездочки или просто смещение курсора при нажатии клавиши будет
вас сбивать. Я использовал пароли длиной 8 символов из 57-символьного
алфавита: латиница 25 букв нижнего регистра (кроме l), 24 буквы
верхнего регистра (кроме I и O) и 8 цифр (кроме O и 1), исключив
символы похожего начертания, которые, как показала практика,
студенты часто путают.

Получив резульТаты ввода пользователем login и password, процесс
login производит аутентификацию пользователя. Аутентификация
пользователя - это процедура доказательства того, что сидящее за
терминалом физическое лицо является именно тем пользователем,
которому выдан данный аккаунт, таким образом ответственность за
все последующие действия будет нести именно этот пользователь.

Если аутентификация прошла успешно, процесс login с помощью
системного вызова ядра chown (от англ. change owner) меняет своего
владельца root (этот суперпользователь был владельцем процесса
login, а также всех предшествующих процессов в его родословной
от прародителя всех процессов - первопроцесса INIT, выполняющего
роль Адама-Евы в системе, идентификатор PID этого процесса-прародителя
равен 1). Так вот, сделав вызов chown, процесс login меняет своего
владельца на пользователя, прошедшего аутентификацию. Если
продолжим пример с сеансом работы Марии Лепешевой, то владельцем
процесса login станет mlepes. Сменив владельца, процесс login
сразу же породит процесс login-shell, который унаследует владельца
от процесса-родителя (в нашем случае, mlepes).

Процесс предоставления терминального доступа (сессии) может
отличаться от вышеприведенного примера, например в случае
использоваания другого протокола терминального доступа к системе
(например ssh вместо telnet). Также если вы уже вошли на один
из хостов корпоративной сети, в которой имеется централизованная
система аутентификации, то при получении терминальной сессии с
этого компьютера на другом компьютере данной корпоративной сети
вы уже не можете поменять свой логин, на этом другом хосте ваш
аккаунт должен иметь такой же логин, с которым вы зашли на первый
хост, пароль на другом хосте может быть и другим, логин не будет
запрашиваться, а пароль спросит непосредственно демон терминального
доступа, он же сам проведет аутентификацию и запустит на этом
другом хосте ваш login-shell, если вы пройдете аутентификацию по
паролю. Выяснить точно какова процедура вашей аутентификации и
предоставления вам терминальной сесии можно по родословной вашего
login-shell. Как получить родословную, описано в файле конспекта
лекций lec/base2 в конце п. 6. (на момент 9 января 2011г - это
строки 733 - 763). Когда дойдете до этого конспекта, сделайте это
на лаб. занятиях.


2. Понятие терминальной сессии.

Какая конкретно программа выступит в роли login-shell - задано в
аккаунте владельца процесса. Мною при создании аккаунтов студентов
задан интепретатор командной строки (используется также короткое
русское назване - оболочка) bash. Этот процесс login-shell откроет
сеанс работы пользователя (в нашем примере mlepes) и станет
прародителем всех процессов родословного поддерва процессов
владельца mlepes. Сеанс работы пользователя называется терминальной
сессией. Завершится сессия с сохранением всей вашей работы для
начисления баллов за нее командой logout, посланной по запросу
(PROMPT-у) login-shell. Если покинуть систему другим образом,
наприер просто закрыть окно telnet-клиента или перезагрузить
Windows на вашем рабочем месте или закрыть сеанс работы Windows,
внезапно срубив клиента терминального доступа telnet или ssh
без предварительного выхода из сессии в системе FreeBSD командой
logout, результат вашей сессии может и не сохраниться и не будет
учтен при оценке вашей работы.

Процесс login-shell имеет три открытых файла, из них один для
ввода, его числовой файловый дескриптор 0, в UNIX принято его
наименование STDIN (стандартный вводной поток), это файл, открытый
для ввода, устройством ввода назначена клавиатура терминала сессии.
Остальные два файловых дескриптора открыты для вывода: дескриптор
с числовым значением 1 именуется STDOUT (стандартный выводной
поток) и с числовым значением 2 - STDERR (стандартный вывод
сообщения об ошибках). Устройством вывода для обоих этих файловых
дескрипторов назначен дисплей терминала.

В ходе сессии пользователь может запускать различные программ в
интерактивном режиме (в каждый момент времени только один процесс
в данной сессии находится в интерактивном режиме, поэтому интерактивные
программы работают поочередно). Параллельно может работать множество
фоновых процессов в данной сессии, а также некоторые процессы могут
быть после запуска преобразованы в процессы-демоны (daemon), не
связанные ни с какой терминальной сессией. Но владельцем всех
поочередно отработавших интерактивно процессов, и работающих фоновых
процессов, и даже долгоживущих демонов будет владелец терминальной
сессии из которой был запущен процесс. Например, сейчас, в момент
написания этих строк 8 января 2011г, в системе еще функционирует
демон Виктории Мозалевской (владелец-пользователь процесса vimoza),
из своей сессии 10 месяцев назад она преобразовала этот процесс в
демона и забыла завершить процесс, уходя с лабораторных занятий по курсу
"Cетевых техологий" на 8 семестре весной 2010г. Если не потребуется
перезагрузить систему, процесс-демон будет жить и год и два, и более,
пока компьютер не рассыпется от времени. Если он мне помешает, я
могу, зная пароль суперпользователя root временно перейти из своей
сессии с сессию root и, пользуясь неограниченными правами этого
псевдополдьзователя, убить чужой процесс-демон.

Помимо владельца-пользователя, любой процесс при запуске наследует
от shell все три открытых файла STDIN, STDOUT и STDERR. Однако
в командной строке можно закрыть для запускаемой программы любой
(любые) из этих трех файлов

Начиная работать в FreeBSD, привыкшим к Windows и другим продуктам
Microsoft нужно усвоить несколько отличий от продукции Microsoft
не только FreeBSD, но вообще любого UNIX-а (MacOS, HPUX, SOLARIS,
любая разновидность LINUX, AIX и т.д.). Так что это скорее
особенности программных продуктов фирмы Microsof, нарушающей
сложившиеся стандарты в компьютерных технологиях с момента
возникновения этой фирмы в целях рекламы и рыночного успеха.

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

Во-вторых, в качестве разделителей элементов маршрутного имени и
как имя корневого директория используется символ обычной слеши
(знак деления /), а не символ backslash \, как в продуктах Microsoft.
Символ backslash в любых UNIX используется для экранирования
следующего за ним символа.

Файловый доступ через иерархическое дерево системы с единым корнем
"/" осуществляется ко всем устройствам компьютера, разделам жесткого
диска, или дисков, если их более одного, даже к дисками или
директориям на других компьютерах, предоставленных иными системами
для разделенного использования как сетевые ресурсы локальной и
корпоративной IP-сети. Не существует подразделeния всех доступных
ресурсов на отдельные логические устройства A: , B: , C:, ... ,
как в продуктах Mikrosoft. В это единое иерархическое дерево
UNIX-системы могут монтироваться также виртуальные файловые системы,
предоставляющие "read-only" доступ к управляющим таблицам всех
существующих в данный момент процессов, а также опознанных операционной
системой внешних устройств.

Имеются отличия от продуктов Microsoft в структуре текстовых файлов.
В качестве стандартного символа новой строки newline
(типового разделителя записей файлов) принят символ с кодом 10
(шестнадцатиричное 0xa, или восьмеричное 012), интерполируемый в
литералах двойных кавычек как "\n". В программных продуктах фирмы
Microsoft в качестве newline используется пара символов c кодами
13 и 10, интерполируемая в двойных кавычках программами Microsoft
как "\n", но в любом UNIX как "\r\n".

Различаются также кодировки символов. Символы с кодами 0-127
стандартизованы во всех системах, включая и продукты Microsoft,
и не зависят от страны, в которой локализована система при установке,
это кодировка ASCII, в которой коды 0-31 и 127 - это управляющие
специальные символы, остальные 95 кодов - это отображаемые символы,
включающие английский алфавит (26 латинских букв нижнего и 26
латинских букв верхнего регистра, знаки пунктуации, арифметических
операций и т.д.). А вот диапазон кодов 128-255 в байтовых кодировках
зависит от локализации, произведенной при установке системы. Набор
символов в этом диапазоне кодов зависит от страны. А кроме этого
еще и от того, это система Microsoft или любая другая. Для России
для кодов 128-255 все UNIX-ы используют кодировку koi8-r, а
Microsoft использует две разных кодировки cp866 и cp1251.

Поэтому при передаче текстовых файлов между системами UNIX и
продуктами Microsoft необходимо преобразование информации:

a) замена всех символов с кодами в диапазоне 128-255 на
cоотвествующий код в иной таблице кодов:

koi8-r <--> cp1251/cp866

b) замена всех символов newline :

"\n" <--> "\r\n"

Если п. a) не обязателен для файлов, содержащих тексты только на
английском, знаки препинания и цифры, без символов кириллицы и
друих символов в диапазоне кодов 128-255, то п. a) обязателен
всегда. Поэтому п. a) и п. b) зачастую реализованы двумя
отдельными утилитами, поэтапно применяемыми к преобразовываемому
тексту. В нашем курсе п. a) реализуется утилитой-фильтром xcode,
опциями которой задается кодировка вводной и кодировка выводимой
информации. Если опция вводной кодировки опущена, применяется
автоопознание, если опущена опция выводной кодировки, по
умолчанию полагается выводная кодировка koi8-r. П. b) реализуется
двухименной утилитой:

unix2dos # для "\n" --> "\r\n"
dos2unix # для "\r\n" --> "\n"


Расмотрим как оболочка bash в роли login-shell организует
сеанс работы:

4. Оболочка выдает на экран терминала PROMPT (приглашение) и ожидает
ввода командной строки. Пользователь вводит командную строку (ввод
завершается клавишей Enter).

Оболочка производит разбор и интерпретацию командной строки и вызывает
на выполнение заданную в командной строке встроенную команду или исполняемый
файл. В случае вызова исполняемого файла оболочка порождает новый процесс,
владелец которого наследуется от оболочки, т.е. в нашем примере mlepes.
В случае встроенной команды необходимые действия выполняет сам процесс
оболочки. По завершении порожденного оболочкой процесса (для вызываемого
файла) или по завершении работы вызванной подпрограммы самой оболочки (в
случае встроенной команды) управление возвращается в точку выдачи на экран
PROMPT (в начало п.4). Этот цикл продолжается весь сеанс работы до выдачи
команды:

logout

Эта команда завершает процесс оболочки login-shell , следовательно
завершается сеанс работы пользователя. Сеанс работы пользователя
называетс сессией или терминальной сессией (пользователь работает с
локального или удаленного терминала.



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

- уровень вложенности оболочкиi: s=1,2,... ;
- число приостановленных процессов, или выполняемых в фоновом
режиме (число job-ов): j=0,1,... ;
- имя пользователя (username);
- маршрутное имя текущего директория;
- завершающий символ $ (для обычного пользователя) или # (для
суперпользователя root), после которого следует пробел и
ожидание ввода команды.

Квадратные скобки и двоеточия применяются для разделения полей
приглашения. Пример приглашения:

s=1[j=0]:mlepes:~:$

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

Поскольку кажому пользователю часто приходится в маршрутных именах
использовать маршрут своего HOME, оболочка bash имеет тильда-расширение:
символ ~ (тильда), может использоваться вместо абсолютного (от
корня) маршрутного имени HOME владельца сессии, при интерпретации
командной строки символ тильды ~ будет заменяться на абсолютный
(от корня) маршрут HOME-директория пользователя-владельца сессии.

Маршрутное имя текущего директория выводится в приглашении перед
завершающим приглашение символом доллара между ограничителями -
двоеточиями, в вышестоящем примере :~: . И здесь символом тильды
~ обозначается полное маршрутное имя HOME-директория владельца
сессии. Итак в этом примере приглашения вы видите, что это сессия
пользователя mlepes и текущим директорием является ее HOME.

Пользователь может создать поддиректорий в своем HOME, независимо
то того какой в данный момент у него текущий директорий, послав
следующую команду:

mkdir -v ~/dfirst

Например, создать в текущем директории поддиректорий dfirst:

s=1[j=0]:mlepes:~:$ mkdir -v dfirst

От начала строки до символа $ и пробел после него - это PROMPT,
который оболочка bash вывела на экран. Правее - командная строка,
введенная с клавиатуры пользователем (в нашем примере mlepes).
Командная строка состоит из одного или более слов, разделяемых
пробелом. Ни запятая, никакой другой символ, кроме пробела не
разделяет слова. Пробел является специальным символом оболочки для
разделения слов. Словом для bash является последовательность любых
символов (не только алфавитно-цифровых), ограниченная пробелом или
концом командной строки (Enter).

Первое слово командной строки - это имя исполняемого файла, который
запускается на выполнение (или имя функции оболочки bash). Функции
оболочки называются встроенными командами, в bash почти 100
встроенных команд (англ. builtin). Исполняемые файлы, включенные в
стандартное программное обеспечение системы называются утилитами.
В данном примере первым словом является имя утилиты mkdir (от
англ. "make directory").

Далее идут необязательные элементы команды (которые могут и
отсутствовать):

Опции - это 0 или более слов, начинающихся с символа дефис "-",
каждая опция задает определенный режим выполнения встроенной
команды или утилиты. В примере единственная опция -v (от англ.
verbal), она задает "разговорчивый (вербальный)" режим, т.е.
утилита будет сообщать на экран о том, что сделано, без этой опции
поддиректорий также будет сделан, но никакого вывода на экран не
будет.

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

Если опустить опцию -v, команда не будет выводить на экран имена
создаваемых поддиректориев. Можно создать несколько поддиректориев
одной командой, если задать в ней несколько аргументов:

s=1[j=0]:mlepes:~:$ mkdir -v dsecond dthird

Если все делалось правильно, в текущем директории должно быть уже
3 поддиректория. Убедимся в этом. Утилита просмотра директория
ls (от англ. list - список, подразумевается список элементов директория).
В команде можно задать один или более аргументов - имен директориев,
содержание которых нужно показать. Если ни одного аргумента не задано,
будет показано содержание текущего директория.
В данном случае текущей директорий - это HOME пользователя mlepes
(Марии Лепешевой). Если приглашение оболочки не настроено так, чтобы
показывать текущий директорий, полное маршрутное имя текущего директория
можно узнать послав команду pwd (от англ. print work directory - сообщить
рабочий директорий).

Пошлем команду просмотра текущего директория без параметров,
командная строка будет содержать только одно обязательное первое
слово - имя команды:

s=1[j=0]:mlepes:~:$ ls

dfirst dsecond dthird

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

s=1[j=0]:mlepes:~:$ ls -l

Теперь выдача стала намного интересней:

total 6
drwxr-xr-x 2 mlepes g4206 512 3 сен 2009 dfirst
drwxr-xr-x 2 mlepes g4206 512 3 сен 2009 dsecond
drwxr-xr-x 2 mlepes g4206 512 3 сен 2009 dthird

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

Далее информация по каждому элементу директория располагается в
отдельной строке.
Затем идет по одной строке с аттрибутами каждого из выведенных
элементов. Разделилтем полей в строках являются пробелы, полей
всего 6, но 5 поле состоит из трех подполей, также разделяемых
пробелами. Поля следующие:

- mode (тип и права файла);
- число имен файла (жестких связей);
- владелец-пользователь файла;
- владелец-группа файла;
- длина файла в байтах;
- дата создания или последнего изменения содержания файла
(это по умолчанию, но если добавить опцию -u, то это
будет момент последнего обращения к файлу даже если он
при этом открывался только для чтения, если вместо -u
добавить опцию -c, то это будет момент последнего изменения
любой характеристики файла, кроме характеристик времени).
Если от выводимого момента времени до посылки команды
просмотра директория прошло меньше года, то вместо номера года
выводится момент времени (часы:минуты). Но если добавить
опцию -T, то время всегда будет выводиться в полном формате 4-х
подполей:

день месяц часы:минуты:секунды год

- последнее подполе - это имя файла (жесткая связь).

Поясним подробнее отдельные поля выводимых командой ls -l строк.
Начинается строка с 10 символов (называемых mode, русского аналога
названию нет, можно произносить "моуд"). Первый из этих символов
показывает тип файла, и "d" означает директорий (англ. directory).
В любом UNIX директорий - это тип файла, а всего в UNIX существует
6 типов файлов, существующих в UNIX. Если на месте "d" стоит дефис
"-", это тип файла, называемый обычным или ординарным или
регулярным файлом. Этот тип включает в себя и текстовые, и бинарные,
и графические, и музыкальные, и видеофайлы, и файлы программ, и
файлы данных. Следующие 9 символов - это права для этого файла,
рассмотрим их чуть позже.

Вслед за полем mode идет число имен (жестких связей), у директориев
их не менее 2 - имя директория в родительском директории (для
главного корня файловой системы это имя их одного символа слешь
/) и еще одно обязательное имя для любого директория это имя из
одного символа точки . , с помощью этого имени осуществляется
ссылка из этого директория на самого себя. В нашем примере у каждого
из трех директориев по 2 имени (жестких связей). Имена, начинающиеся
на точку не попадают под расширения шаблонов имен и без специальной
опции -a не показываются командой ls. Просмотрите имена на точку в
пустом директории, например в dsecond:

ls -la dsecond # Это эквивалентно команде ls -l -a dsecond

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

Далее идет имя владельца-пользователя файла (mlepes - USER или или
логин или LOGNAME) и имя группы-владельца файла (g4206 - GROUP).
Эти аттрибуты файла определяют совместно с 9 символами прав из
поля mode определяют чьи процессы и что именно могут делать с
файлом. Аттрибуты-имена удобны для человека, операционная система
пользуется числовыми идентификаторами, однозначно связанными с
именами - UID (user identifier) и GID (group igentifier). Можно
увидеть числовые значения этих идентификаторов файла задав в команде ls
дополнительную опцию -n , причем две однобуквенные опции можно слить,
присоединив их к общему символу - следующим образом:

ls -l -n # или
ls -ln

В нашем примере будет выведено

total 6
drwxr-xr-x 2 26209 4206 512 3 сен 2009 dfirst
drwxr-xr-x 2 26209 4206 512 3 сен 2009 dsecond
drwxr-xr-x 2 26209 4206 512 3 сен 2009 dthird

Увидеть идентификаторы пользователя mlepes , если ее аккаунт еще
имеется в системе, можно с помощью команды id :

id mlepes

будет выведено (сравните с выдачей ls -l) :

uid=26209(mlepes) gid=4206(g4206) groups=4206(g4206),3000(deprive)

Увидеть свои идентификаторы из своей сессии может каждый пользователь,
послав команду id без аргументов. Узнайте про себя и сравните с выдачей
информации ls -l для элементов в своем HOME.

Далее идет длина файла в байтах. Длина файла типа d - т.е. директория
всегда кратна 512 байтам, потому что директорий - это бинарный файл с
внутренней структурой записей переменной длины, сначала для него
выделяется один сектор - 512 байт, по мере роста числа элементов в нем
когда пространства оказывается недостаточно, оно добавляется по одному
сектору.



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


Если нужно что-то посмотреть или скопировать из HOME другого
пользователя, абсолютный маршрут его HOME задается с помощью
тильда-расширения так: ~nakasi , где nakasi - это login другого
пользователя. Например, если Мария Лепешева хочет просмотреть
содержание поддиректория даты занятий 16 марта в HOME Натальи
Касицкой, она может послать из своей сессии команду:

ls -l ~nakasi/d0316/

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


Создадим еще несколько обычных файлов различными способами.

Последующе 9 символов поля mode подразделяются на 3 тройки
символов, и характеризуют права доступа к данному файлу. Чтобы
понять их, сначала заглянем правее, на поле 3 и 4 : mlepes и
g4206. Любой файл любого типа в любом UNIX имеет два аттрибута
владельцев. Это владелец-пользователь, указанный в третьем поле
(mlepes) и владелец-группа, указанная в четвертом поле (g4206).
Возникает вопрос, как это система решила, что хозяином этого файла
(типа d, т.е. директория) должна быть Мария Лепешева? И откуда
системе известно, что она обучается в группе 42-06 ?



Вспомним начало этой
методички, как начинается сеанс работы любого пользователя (сесия):
аутентификация --> процесс login меняет владельца с root на
прошедшую аутентификацию mlepes и порождает процес login-shell
(владелец по наследству уже mlepes) --> у всех далее порождаемых
в этой сессии процессов, процесс login-shell либо непосредственый
родитель, либо дед (через 1 поколение), либо прадед (через 2) и
т.д. Владельцем-пользователем по наследованию (либо непосредствено,
либо последовательно по всем поколениям) явялется mlepes. Таким
образом любой процесс в этой сессии будет иметь в качестве
аттрибута-владельца mlepes.


прямо или через 1,2,... поколния

Правило для любого типа UNIX:
При создании файла любого типа владелец-пользователь нового файла
наследуется от владелца процесса, создающего файл.

Теперь должно быть понятно, что сколько бы Мария Лепешева ни
работала в UNIX, в тех директориях или в других, везде и всегда
при создании файлов она будет либо получать сообщение о том, что
у нее нет необходимых прав (Permission denied), а там, где права
есть, владельцем-пользователем созданного файла будет mlepes, и
никто другой. Для изменения владельца-пользователя файла существует
команда chown, но право на это имеет только суперпользователь root.
Физический пользователь, чтобы это сделать должен знать пароль
для перехода в сессию root.

Разберемся теперь с группой-владельцем файла, правила наследования
которой различны в разных типх UNIX. В Linux-ах, к примеру
группа-владелец файла при создании файла наследуется также, как и
владелец-пользователь от процесса, создавшего файл. Но, если на
заре эпохи UNIX каждый пользователь входил только в одну группу,
то в современых UNIX с целью более гибкого администрирования и
тонкого разграничения прав любой пользователь может входить в
несколько групп, среди которых нужно выделять одну группу, которая
будет становится группой-владельцем создаваемых процессами этого
пользователя. А группа-владелец у любого файла только одна.
Поэтому, в системе LINUX, если, к примеру, какой-то пользователь
входит в 8 групп, среди этих во всем прочем полностью равноправных
груп необхдимо выделить одну, для того чтобы именно она становилась
группой-владельцем всех создаваемых процессами данного пользователем
файлов.

Исторически такое выделение и в LINUX-ах и во FreeBSD и в любом
другом современном UNIX осталось. При создании аккаунта для нового
пользователя (это выполняется от имени root с помощью улилиты
adduser) одна группа задается обязательно, она называется первичной
и содержится в поле группы файла /etc/passwd. Прочие группы, в
которые входит пользователь могут вообще не задаваться, а если они
нужны, то их можно задать в следующем шаге утилиты adduser, а
можно впоследствии постепенно, по мере необходимости долавлять
или удалять простым редактированием от лица root файла групп
/etc/group. Так вот в LINUX именно первичная группа пользователя будет
группой-владельцем всех файлов, создаваемых процессами пользователя.

А во FreeBSD наследование группы-владельца файлов производится
по-другому. Файл наследует группу владельца от директория, в
котором он создается. В дальнейшем root, а также и владелец-пользователь
файла может изменить группу-владельца файла на другую с помощью
команды chgrp (root может изменить на любую другую группу, а
владелец-пользователь только на одну из тех групп, в которые он
сам входит). Например, каждый студент входит в свою первичную
группу (для mlepes - это g4206), а кроме того в группу deprive.

Измените группу-владельца одного из директориев (dsecond) c g4206
на deprive:

chgrp deprive dsecond
ls -l

total 6
drwxr-xr-x 2 mlepes g4206 512 25 авг 22:00 dfirst
drwxr-xr-x 2 mlepes deprive 512 25 авг 22:04 dsecond
drwxr-xr-x 2 mlepes g4206 512 25 авг 22:04 dthird

####### далее очень коротко, обяснения - на лекции


Скрытые файлы

ls -la

total 16
drwxr-xr-x 2 mlepes g4206 512 Aug 31 17:22 .
drwxr-xr-x 27 root g4206 512 Aug 7 11:09 ..
-rw------- 1 mlepes g4206 176 Aug 31 16:11 .bash_history
-rw-r--r-- 1 mlepes g4206 1001 Aug 7 09:29 .bash_login
-rw-r--r-- 1 mlepes g4206 69 Aug 7 09:29 .bash_logout
-rw-r--r-- 1 mlepes g4206 797 Aug 7 09:29 .exrc
drwxr-xr-x 2 mlepes g4206 512 25 авг 22:00 dfirst
drwxr-xr-x 2 mlepes deprive 512 25 авг 22:04 dsecond
drwxr-xr-x 2 mlepes g4206 512 25 авг 22:04 dthird


Просмотр содержания файла.

less .bash_history # пользоваться автодополнением (Tab)


Команда history

стрелка вверх-вниз

!17

Директорий текущего дня занятий

dMMDD

mv -v dthird d0901
ls -l

mv -v d* d0901/
mv: rename d0901 to d0901/d0901 Invalid argument
# dfirst -> d0901/dfirst
# dsecond -> d0901/dsecond


Какие еще файлы можно просматривать?

fortune

Алиасы

alias

1. История создания UNIX.

Предтечей UNIX явился проект операционной системы MULTICS
(Multiplexed Information and Computing Services), разрабатываемый
в 1965-69 гг в Bell Labs (Bell Telephone Laboratories, являющаяся
филиалом компании AT&T) совместно с GE (General Electric Company)
и Массачусетским институтом технологии (MIT). Это должна была
быть многопользовательская многозадачная операционная система с
разделением времени. Однако проект завершен не был и был закрыт
в 1969г. Увлеченные идеями этого проекта молодые сотрудники Bell
Labs Денис Ритчи (Denis Ritchie), Кен Томпсон (Ken Thompson),
Брайан Керниган (Brian Kernigan) добились разрешения на продолжение
работ с очень малым финансированием, получили для этой цели
небольшой компьютер PDP-7 c объемом оперативной памяти 4 килобайта(!),
и создали для него первую многозадачную (реально - 2 задачи),
многопользовательскую (2 пользователя) систему с разделением
времени, которую назвали UNIX. Ограничения определялись аппаратными
причинами.

В настоящее время UNIX - это обобщенное название нескольких
десятков различных операционных систем, сохраняющих принципы
организации системы первого UNIX и имеющих сходные, характерные
для всех UNIX, черты. Все без исключения UNIX отсчитывают свое
системное время в числе секунд, прошедших с 00:00 01 January
1970. Этот момент считается моментом рождения UNIX и началом эпохи
UNIX. В операциях с календарем, датами и временем именно с этого
момента число секунд преобразуется в дату, день недели, часы,
минуты и обратно.

В 1971 UNIX была перенесена на более мощный компьютер PDP-11 и
использована в реальной многопользовательской системе обработки
текста. К тому времени она уже выросла: 16 килобайт занимала
собственно система и 8 килобайт отводилось прикладным программам.
Объем дисковой памяти был 512 килобайт, максимальный размер файла
- 64 килобайта. Многие небольшие текстовые редакторы, используемые
в настоящее время несут это ограничение объема файлов - 64 K.

Все эти первые UNIX были ассемберные на языке системы команд PDP,
т.е. не могли быть перенесены на другие платформы, а должны были
писаться заново. В начале 70-х Кен Томпсон начал работать над
компилятором FORTRAN под UNIX, в результате создал интерпретируемый
язык B. Денис Ритчи переработал его в компилируемый язык С,
позволяющий генерировать машинный код. В 1973г ядро UNIX было
переписано на языке С. Это означало, что теперь за считанные
месяцы можно перенести UNIX на любую платфорому, где имеется
компилятор С. Кроме того значительная модернизация и внесение
изменений в оерационную систему UNIX теперь не представляло
значительного труда. Число работающих под UNIX компьютеров в Bell
Labs уже превысило 25 и для сопровождения UNIX была сформирована
группа USG (UNIX System Group).

UNIX бурно развивалась (к 1977г. число работающих под UNIX систем
превысило 500). Каждая новая версия снабжалась новой редакцией
руководства программиста, откуда и сами версии получили название
Edition. Всего было разработано 10 Editions, первая выпущена в
1971, последняя - в 1989г. В соотвествии с Федеральным законодательством
AT&T не имела права на распространение UNIX и до 1975г редакции
с 1 по 5 выпускались для внутреннего пользования. Только с шестой
редакции (1975г) фирма AT&T начала предоставлять лицензии
научно-образовательным и коммерческим организациям и UNIX вышла
за пределы Bell Labs. До этого вне Bell Labs UNIX могла исползоваться
только для учебных целей некоторыми университетами.

В 1974г в Калифорнийском университете в Беркли была установлена
четвертая редакция UNIX и начата работа над созданиием ветви BSD
UNIX (Berley Software Distribution). Первая версия BSD, основанная на
шестой редакции выпущена в 1978 и дала начало классу BSD-систем.
Важным событием для развития этой ветви UNIX явился контракт с
Пентагоном на разработку семейства протоколов TCP/IP в BSD-UNIX.
Работа закончена в 1981, а ее результаты вошли в пакет 4.2BSD, выпущенный
в 1983. Эта версия включала поддержку работы в сетях Ethernet и
способствовала распространению локальных сетей.
Это дата рождения и начала эпохи Internet.

Затем был выпущен пакет 4.3BSD, содержащий дальнейшее расширение
поддержки сетевых функций операционной системы. Эти пакеты не
являлись самостоятельными полными операционными системамами а
были дополнением к UNIX. Фактически они были доступны только при
условии приобретения лицензии на код AT&T, контролирующей
распространение UNIX в 70-х и 80-х годах.

C популярностью UNIX дорожали лиценззии AT&T, необходимые, так
как в основе ядра BSD лежала шестая редакция UNIX. Поэтому в
Беркли переписали ядро и исключили из него код AT&T, выпустив
в 1989 пакет Networking Release 1 , имеющий свободное распространение,
причем для приобретения его не требовалась лицензия на код AT&T.

В 1991 появился пакет Networking Release 2 (Net/2), явяющийся уже
почти полной операционной системой, независимой от лицензии AT&T.
Последние недостающие шесть файлов исходного кода ядра в Net/2
были переписаны программистом Биллом Джолицем (Bill Jolitz), в
результате для платформы i386 появилась свободно распространяемая
операционная система 386/BSD - непосредственная предшественница
NetBSD и FreeBSD. В середине 90-х от NetBSD отделилась OpenBSD.
Последними, созданными в Беркли, стали системы 4.4BSD и BSD Lite,
появившиеся в 1993. Среди коммерческих систем преемником кода
Net/2 стала компания BSDI, выпускающая системы BSDI 1.0 (1993),
BSDI 2.0 (1995)...

2. Развитие FreeBSD и ее выбор как базового UNIX для обучения.

Среди свободно распространяемых систем BSD-ветви наибольшее
признание получила FreeBSD, возникшая в 1994 (версия 1.0 выпущена
в ноябре 1993, но содержала много недоработок). Фактически как
полнофункциональная и надежная система FreeBSD, безупречная с
точки зрения претензий фирм, обладающих правами на распространение
коммерческих лицензий на использование программного кода UNIX,
началась с выпуска Release FreeBSD 2.0 в январе 1995г. Ветвь
FreBSD 2 функционирует и продолжает развиваться до сих пор (в
апреле 2006г выпущен Release FreeBSD 2.2.9). В начале FreeBSD
выпускалась для платформы i386, по мере ее развития и роста
популярности, кроме i386, c 4 версии - для alpha c 5 версии -
для amd64, ia64, pc98, c 6 версии - для ppc, sparc64. К настоящему
моменту FreeBSD занимает доминирующее положение среди серверных
систем в Internet. Практическая часть курсов, перечисленных в
начале данного файла, выполнялась в течение 3 лет на FreeBSD
5.5, выпущенной 24 мая 2006г. С 1 сентября 2009г учебные занятия
выполняются на FreeBSD 7.2, выпущенной 4 мая 2009г.


Поясним как развивается FreeBSD, чтобы было понятно почему после
версий 6.0(ноябрь 2005) и 6.1(7 мая 2006) выходит версия 5.5.
Смена старшего номера (номера версии) связана, кроме расширения
функций, стандартных утилит, состава внешних устройств, связана
с изменениями в привычных наименованиях и маршрутах, средствах и
способах администрирования. Поэтому большие группы людей предпочитают
еще долгое время оставаться в рамках прежней привычной версии,
однако развивают ее внося появляющиеся в мире и нужные им новации.
Поскольку число таких людей постепенно уменьшается, интервалы
между последующими выпусками данной версии увеличиваются, а когда
энтузиастов версии становится совсем мало, она перестает
модернизироваться и естественым образом умирает. Например в апреле
2006г вышел выпуск FreeBSD 2.2.9 c более чем 7-летним интервалом
от предыдущего выпуска 2 версии FreeBSD 2.2.8 (декабрь 1998). А
начало 2 версии - FreeBSD 2.0 (ноябрь 1994).

Приведем таблицу интервалов выпуска версий FreeBSD для i386:

FreeBSD 1.0 (ноябрь 1993) - ... - FreeBSD 1.1.5.1 (июль 1994)
FreeBSD 2.0 (ноябрь 1994) - ... - 2.2.8 (декабрь 1998) -
- 2.2.9 (апрель 2006)
FreeBSD 3.0 (октябрь 1998) - ... - FreeBSD 3.5 (июнь 2000)
FreeBSD 4.0 (март 2000) - ... - FreeBSD 4.11 (январь 2004)
FreeBSD 5.0 (январь 2003)- ... - 5.4 (май 2005) - 5.5 (24 мая 2006)
FreeBSD 6.0 (ноябрь 2005) - 6.1 (7 мая 2006) - 6.2 (12 января 2007) -
- 6.3 (18 января 2008)
FreeBSD 7.0 (27 февраля 2008)


На данный момент ( 1 сентября 2008г ) последним выпущенным
дистрибутивом FreeBSD является FreeBSD 7.0 (27 февраля 2008).

С сентября 2009 на компьютер, на котором проводятся лабораторные
занятия поставлен FreeBSD Release 7.2, выпущенный в мае 2009.

Организационная структура комитета FreeBSD. В число официальных
разработчиков системы в настоящее время включено около 4000
человек.ю Из их числа выделено около 400 коммитеров, обепечивающих
отбор и контроль предлагаемого программного обеспечения. Во главе
стоит организационное ядро - 9 человек из состава коммитеров,
переизбираемое коммитерами на 2 года, и осуществляющее одминистративное
руководство, разрешение конкурентных предложений по развитию
системы. Таким образом обеспечивается единая и плановая линия
развития системы, концентрация значительного числа самых
квалифицированых программистов в мире, и достигнуты авторитет и
положение FreeBSD, как самой надежной операционной системы и
системы номер один для Internet-серверов.


Рассмотрим почему для обучения выбрана именно система FreeBSD:

1. FreeBSD является доминирующей серверной системой по числу
крупнейших мировых Internet-серверов, для управления которыми
выбрана именно она. Например, это сервер Yahoo, успешно
справляющийся с десятками тысяч соединений в сутки, с тысячами
соединений в данный момент.

2. Системно-технической базой большинства курсов в МГТУ
им.А.Н.Косыгина
является WINDOWS. Это "user-oriented" операционная система,
т.е. прежде всего система для рабочих станций, ориентированная
на непрофессионального пользователя. Как вторую систему для
освоения в дополнение к WINDOWS, целесообразно выбрать именно
серверную систему FreeBSD, а, к примеру, не одну из семейства
Linux, знакомого более широким массам, но развивающегося также
в направлении User oriented, т.е. становящейся все более и
более альтернативой Windows для тех же применений.

3. FreeBSD удается до сих пор сохранять монолитность и
единственность. Это позволяет концентрировать потенциал
громадной массы очень квалифицированных программистов-разработчиков
в едином направлении, не распыляя силы и обеспечивает очень
хороший уровень поддержеки и сопровождения системы. В отличие
от этого Linux, имеет единым только ядро, развиваемое и
поддерживаемое его автором, Линусом Торвальдсом (Linus Torvolds).
Полностью же операционных систем на основе этого ядра имеется
множество, среди которых и коммерческие и свободно распространяемыe
различными небольшими фирмами и группами программистов (Mandrake,
Slackware, RedHat, Debian, Ubuntu ... - более 30 различных
дистрибьютеров). Разные системы семейства Linux имеют различия,
иногда существенные, в способах установки, настройки,
администрирования, в составе утилит и функциональности. Как
следствие этого программистcкие силы распылены, поддержка,
сопровожение, доступный справочный материал и документация
существенно уступают по качеству системе FreeBSD.

4. Общепризнано прекрасное качество электронной документации FreeBSD,
что является очень важным для освоения и работы в системе.
Документация многоуровневая, включая подробные комментарии в
образцах конфигурационных файлов (на языке BournShell, сокращенно
sh). Низшим уровнем можно считать предоставляемые исходные
тексты программ на языках С (в основном, включая ядро, утилиты
и портируемые программы), но многие утилиты на Perl, Python и др.

Для получения справки по любой теме достаточно набрать команду

man [секция] тема

Имеются хорошие изданные книги на русском языке по системе FreeBSD.

5. Выбор версии 5.5, а не 7.0 для обеспечения лабораторных работ
в 2006г обусловлен следующим:

5.1. Книга [RS], указанная в числе основных источников, в
английском оригинале вышла в 2003 после выпуска версии 5.0 и
ориентирована уже именно на версию 5. По версии 7 пока нет
литературы, методически отработанной и рассчитанной на начинающего
пользователя. Изменение старшего номера - номера версии связано
с существенными изменениями в операционной системе, а номер
выпуска (вторая цифра через точку) меняется при менее значительных
дополнениях, исправлениях выявленных ошибок и т.д. В русском
переводе книга вышла в 2004 и продается с дистрибутивом версии
5.2 на CD. Таким образом студенты, котороые в результате
курса заинтересуются этой операционной системой, могут приобрести
книгу и получить и методически отработанное отличное руководство
на русском языке и дистрибутив знакомой версии.

5.2. В период подготовки Release 0 новой версии (в настоящий момент,
1 сентября 2009г это FreeBSD 8.0 она имеет статус CURRENT,
многое еще недостаточно оттестировано, часть изменений еще не
окончательно доработано). Она доступгна для любого пользователя,
но ставить и использовать ее стоит только очень опытным
специалистам, которые могут принять участие в тестировании и
доработке системы. Как только будет выпущен Release FreeBSD
8.0, эта 8 ветвь FreeBSD приобретет статус STABLE и может быть
рекомендована любому пользователю. Я для учебного процесса
предпочитаю использовать выпуски, начиная с 1 или 2, когда
версия становится уже вполне стабильной и появляется книга по
этой конкретной версии (но сейчас поставил 7.2, не дождавшись
книги по 7 версии).





3. Прочие UNIX-ы и их классификация.

При классификации современных UNIX-ов прежде всего их относят к
одной из двух ветвей: BSD или System V, к которой относится Linux
и большинство современных коммерческих UNIX-ов. Эту другую ветвь
UNIX представляют системы, в основу которых легло продолжение
работ под контролем AT&T:

- выпущенные в Bell Labs System III (1982), System V (1983);
- выпущенные в новом подразделении AT&T Information Systems
(ATTIS)
System V Release 3 (SVR3) - 1987 и System V Release 4 (SVR4),
выпущенная в 1989, которая объединила черты нескольких известных
коммерческих UNIX: System V, SunOS, HPUX и т.д.
- в рамках этой ветви появился и первый свободно распространяемый
UNIX - Linux. (конец 1992г). Ядро Linux поддерживается и
развивается его автором - Линусом Торвальдсом и является
свободно распространяемым. Но ядро - это еще не вся система,
котрая может использоваться для практических целей. Требуется
множество утилит и прикладных программ, работающих под управлением
данного ядра, чтобы можно было работать в системе. Множество
дистрибьютеров на основе одного и того же ядра Linux комплектуют
различные операционные системы, некоторые из них - коммерческие,
есть и свободно распространяемые. Некоторые отмирают в
безвестности, едва появившись, некоторые широко рекламируются,
раскручиваются и приобретают популярность. К 1996 году было
уже более 30 различных Linux-ов, причем различия бывали весьма
существенные - каждый дистрибьютер по-своему представлял цели
и ориентированность своего Linux-а. В настоящее время наиболее
популярные Linux-ы это RedHat, Mandrake, Slackware, Ubuntu.

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

Из современных коммерческих UNIX-ов к ветви BSD относится
операционная система MAC OS компьютеров Apple Macintosh (Макинтош).
Фирма Apple сначала разрабатывала собственный UNIX для них, но
затем сосредоточила все усилия на графических и мультимедийных
приложениях, а в качестве ядра просто было взято ядро очередной
версии FreeBSD. Это один из факторов, позволивший компьютерам
Макинтош и фирме Apple занять лидирующее положение в сфере
выполнения профессиональных графических и мультимедийных работ,
вытеснив Silicon Graphics в сферах выпуска книг и журналов, монтажа
и озвучивания кинофильмов, рекламы, плакатов и т.д.

К ветви System V относится современный UNIX HP-UX для компьютеров
фирмы Hewlet Packard, занимающей лидирующее положение в сфере
многопроцессорных (64-процессорных) супер-компьютеров для организации
гигантских баз данных (ну разумеется еще и принтеров).

К ветви System V относится современный UNIX Solaris для компьютеров
фирмы Sun Micrjsystems, который однако сохранил некоторые черты
BSD, в рамках которой он зародился и некоторый период времени
развивался.

Современный UNIX AIX для компьютеров фирмы IBM (не путайте эти
компьютеры, работающие на процессорах фирмы IBM, с компьютерами
IBM PC, работающими на платформе процессоров INTEL и их аналогов)
настолько свеобразен, что трудно его отнести к какому-либо
семейству, он сам по себе, что впрочем скорее является его
недостатком, чем достоинством, поскольку усложняет переход на
него специалистов с других UNIX и не способствует совместимости.


4. Свободно распространяемое программное обеспечение.

Коммерческие UNIX-ы являются черезвычайно дорогими операционными
системами в связи с тем что для их разработки необходимы программисты
самой высокой квалификащии и объем программирования весьма велик.
Стоимость многих коммерческих UNIX-а в сотни раз выше стоимости
WINDOWS, что являлось препятствием к их широкому распространению
и тормозило развитие их и в целом информакционных технологий.
Выходом явилось создание фонда свободно распространяемого
программного обеспечения. Официальное открытие этого проекта
состоялось 27 сентября 1983г и назван он был GNU, как аббревиатура
General Not Unix, отразив в названии протест против необходимости
приобретения дорогих лицензий на UNIX фирмы AT&T для использования
кода операционной системы UNIX для распространения программных
продуктов, разработанных под UNIX. В настоящее время большая часть
свободного программного обеспечения, наоборот, разрабатывается и
используется в рамках UNIX, которые часто называются UNIX-подобными,
поскольку фирма AT&T теперь выдвигает претензии на использование
названия UNIX, поскольку не может уже предъявялять претензии к
использованию ее кода, полностью переписанного в рамках FreeBSD
(претензии к Linux по поводу кода попрежнему периодически возникают,
в первом издании своей книги в начале 1996г. "Секреты UNIX" Джеймс
Армстронг даже называет Линуса Торвальдса финским хакером).

Основателем и главой фонда свободно распространяемого обеспечения
(Free Software Foundation, как часть проекта GNU) является Ричард
Столлмен. В 1985г он предоставил для свободного распространения
в фонд первый большой программный продукт, который создавал лично
в течение многих лет - универсальный многофункциональный текстовый
редактор EMAX и который поддерживает и развивает до настоящего
момента, и сейчас EMAX -- один из самых мощных и развитых текстовых
редакторов, работающий как в текстовом, так и в графическом
режимах.

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

- GNU GPL, по которой все производные продукты должны также
распространяться по GNU GPL, то есть обязаны быть свободно
распространяемыми и раскрывать свои исходные коды (open source).

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

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

Динамика появления свободно распространяемого продукта такова:

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

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

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

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

Свободно распространяемые приложения достаточно широко распространены
сейчас не только в мире UNIX, но и под WINDOWS. Для сравнения
качества достаточно поставить, скачав из Internet соотвествующие
свободно распространяемые продукты, поработать на них под WindowsXP
и самому сравнить свободный браузер Mozilla FireFox и коммерческий
Internet Explorer; свободно распространеяемый Notepad++ c
коммерческим Блокнотом и т.д. Особенно велико функциональное
расширение Notepad++, например в нем поддерживается множество
окон с запоминанием редактируемых файлов для послдедующего сеанса
работы вплоть до текущего положения курсора в каждом окне,
поддерживается синтаксив более 30 языков программирования
(практически всех используемых в настоящий момент, так что он
может служить универсальной средой программирования и т.д.).

В настоящее время в фонде наиболее качественный и функционально
богатый Web-server Apache, самый быстрый из всех SQL-СУБД MySQL,
почтовый сервер Sendmail, самый универсальный и наиболее быстро
развивающийся в настоящий момент язык программирования Perl и
многие другие программные продукты, по уровню, качеству,
функциональным возможностям превосходящие все коммерческие аналоги.

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

Что является стимулом для предоставления своей разработки в фонд?
Поскольку все продукты в фонде авторские, то автор приобретает
известность и подтвержение квалификации. Имя автора обеспечивает
ему отличное резюме и возможность высокооплачиваемых заказов.
Люди, постоянно работающие в фонде, зарабатывают (не хуже, а
зачастую и много больше коммерческих программистов) на преподавании,
написании и издании книг, на заказах по внедрению и адаптации
разработок фонда в фирмах и учреждениях. В качестве примера можно
привести Ларри Уолла (Larry Wall - автор свободно распространяемого
языка Perl, возглавляющий и поныне комитет поддержки и развития
Perl), который является высокооплачиваемым внештатным работником
одного из ведущих в мире издательств книг по Информационным
технологиям - O'Reilly).

2. Основные характеристики любого UNIX.

1. Многозадачность (истинная) с разделением времени.
2. Многопользовательская (с обеспечением защиты и независимости
каждого пользователя)
3. Виртуальная память со свопингом страниц.
4. Унифицированное расширенное понятие файла и единое иерархическое
дерево директориев.
5. Кроме небольшой резидентной части ядра, привязанной к ассемблеру
платформы, вся остальная часть ОС написана на C.
6. Развитые средства межпроцессного взаимодействия, включая семафоры,
сигналы, сокеты, FIFO и т.д.
7. Кеширование диска и оптимизация файловых операций.
8. Наличие и строгое соблюдение стандартов.
9. Большой объем свободно распространяемого программного обеспечения.
(девиз Томпсона и Ритчи "Live free or die").


3. Пользователи и их атрибуты.
Структура файлов /etc/passwd и /etc/master.passwd

Все известные системе пользователи имеют регистрационные записи в
файле /etc/passwd. Структура записи:

login:*:uid:gid:GECOS:homedir:login-shell

Поля записи:

login - имя пользователя (еще в различных контекстах его называют
logname, username или uname). Максимальная длина имени 16
символов, но многие программы для отображения предусматривают
только 8 знакомест, так что лучше ограничиться длиной не более
8 символов. Допустимые символы: латинские буквы в нижнем регистре,
цифры, подчеркивание и дефис.

* - обозначает место, где в ранних UNIX-ах в 70-е годы, когда не было
хакеров, хранился пароль. В современных UNIX исходное (нешифрованное)
значение пароля вообще нигде в системе не хранится, а пароль
при вводе обрабатывается стандартной функцией хеширования
(многократного перетасовывания, замены и удаления бит в битовой
строке, представляющей пароль в компьютерной памяти). Результатом
обработки пароля функцией хеширования является хеш-код стандартной
длины (в FreeBSD используется функция хеширования MD5,
вырабатывающая 128-битовый хеш-код). Полученный хеш-код ппроля
хранится в другом файле /etc/master.passwd, закрытом для всех,
кроме суперпользователя root (uid=0).

uid - идентификатор пользователя - целое число длиной 16 бит
(т.е. в диапазоне 0 - 65535). Для операционной системы именно
uid является инедтификатором пользователя и используется при
проверке прав доступа к файлам и другим ресурсам системы.
При создании аккаунтов пользователя на нескольких хостах сети
желательно, чтобы во всех аккаунтах у него было одинаковое значение
uid, иначе при переносе файлов с одного хоста на другой они могут
стать недоступными для него.

gid - идентификатор первичной группы пользователя. Каждый пользователь
должен входить хотя бы в одну группу (но не более, чем в 15 групп).
Первая группа, в которую он входит задается в данном поле, остальные
- в файле /etc/group. Идентификатор группы - это целое число
длиной 16 бит (0-65535).

GECOS - задается общая информация о пользователе ( ФИО, E-mail,
телефон и т.д.). Для операционной системы это просто комментарий.

homedir - маршрутное имя home-директория, в котором пользователь имеет
все права и может создавать свое поддерево директориев для хранения
своих файлов.

login-shell - маршрутное имя исполняемого файла, запускаемого
автоматически при каждом входе пользователя в систему. Обычно
это интерпретатор команд операционной системы (`shell', в
переводе на русский `оболочка'), при запуске образующий процесс
обеспечивающий интерактивную работу пользователя и который
завершается только при завершении данной сесии (сеанса работы)
пользователя. Наиболее распространены оболочки:
- с-shell (многое в синтаксисе взято из языка С);
- korn-shell (рекомендован стандартом POSIX);
- bourn-shell (на нем принято писать скрипты - т.е. командные файлы
во всех видах UNIX, но он не имеет удобных средств для
интерактивной работы)
- bash (bourn again shell) - это самая свежая из широко
распространенных оболочек по синтаксису она совпадает с
bourn-shell, т.е. используется тот же язык, как для скриптов,
но включает все удобства интеративных оболочек C-shell и
Korn-shell. Именно эта оболочка используется в курсах.


Пример записей файла /etc/passwd:

jkursa:*:27507:4507:Julia M. Kursakova:/cell/45_07/jkursA:/usr/local/bin/bash2
amilit:*:3211:4203:Andrew A. Militeev:/cell/42_03/amilit:/usr/local/bin/bash2
mscher:*:3522:4503:Mary S. Scherbakova:/cell/45_03/mscher:/usr/local/bin/bash2

Этот файл открыт для чтения всем, поскольку он может использоваться
любым процессом, например для нахождения соотвествия login <==>
uid (по uid определить login и наоборот), а также для определения
стандартной группы gid пользователя uid. Пароли в исходном
незашифрованном виде вообще нигде в системе не хранятся. Невзирая
на то, что файл называется passwd, пароли и в зашифрованном виде
в нем не хранятся (название осталось со времен начала UNIXов,
когда опасности неавторизованного доступа было намного меньше и
этот файл содержал зашифрованные пароли во втором поле).

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

Паролем root в любой системе владеет только один человек -- главный
администратор системы. Отметим, что даже при том, что читать
файл master.paswd может только один человек, владеющий паролем
суперпользователя root, там хранится не исходный вид пароля,
который позволяет пользователю войти в систему, а только хеш-код
( иногда не вполне верно называемый зашифрованным паролем),
получаемый из исходного пароля. По хеш-коду можно проверить,
правильно ли пользователь ввел пароль, выполнив хеширование того,
что он ввел, но невозможно восстановить, что же именно он ввел.

Этот доступный только суперпользователю файл /etc/master.passwd
имеет все те же поля, но во втором поле содержится зашифрованный
пароль, и имеется еще три дополнительных поля, размещающихся между
полями `gid' и `GECOS':

- класс регистрации -- это ссылка на конкретную запись в файле
/etc/login.conf, которая содержит пользовательские квоты на
использование ресурсов (например, определен класс prisoner и
ограничены диапазоны времени, когда он может логиниться -- в
соотвествии с расписанием лабораторных занятий).

- время последнего изменения пароля; 0 - если не изменялся с
момента создания аккаунта,

- время окончания срока действия аккаунта; 0 - если не ограничен.

На самом деле операционная система в процессе работы не пользуется
ни файлом /etc/passwd ни секретным файлом /etc/master.passwd, было
бы слишком неэффективно всякий раз искать нужную запись в текстовом
файле, последовательно читая все записи от начала файла до нужной
записи. На основании содержания этих файлов создаются две двоичных
базы данных, соответственно, /etc/pwd.db и /etc/spwd.db, в
которых имеются индексы по всем полям, обеспечивающие быстрый
прямой доступ к любой нужной записи.


Немного подробнее о суперпользователе root. Для него никаких
запретов нет, полномочия его не проверяются, ему разрешено все в
системе. Пароль root известен только одному человеку -- главному
администратору системы и даже он не входит под ним в систему -- у
него есть еще один login. Он переходит в root при помощи команды
su (от switch user, т.е. переключить сессию на другого пользователя)
только на короткое время для выполнения действий, допустимых только
суперпользователю root (например, создать новые аккаунты или удалить
устаревшие аккаунты) и выполнив эти действия возвращается к своему
логину (команда exit). Для переключения сессии на суперпользователя
необходимо знать пароль суперпользователя и быть членом привелегированной
группы wheel (gid=0).

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

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


Пример записеЙ файла /etc/master.passwd:

vkuzne:$1$ywADvYWB$0cnWyw5Im5LC/.ZxXUf06.:24505:4504:prisoner:0:0
:Viktoriya S. Kuznetsova:/cell/45_04/vkuzne:/usr/local/bin/bash2
klapin:$1$GvTGCKcJ$1zISrKiLdni4hE6O4qUNe0:24219:4204:prisoner:0:0
:Kirill S. Lapin:/cell/42_04/klapin:/usr/local/bin/bash2
ppopov:$1$uBijefD5$PJ133xC0/GXD9FYv8IlQG0:24015:4004:prisoner:0:0
:Paul A. Popov:/cell/40_04/ppopov:/usr/local/bin/bash2
amilit:$1$DdDCdO80$osTIzjlbClSfI5i5vT717.:3211:4203:prisoner:0:0:
Andrew A. Militeev:/cell/42_03/amilit:/usr/local/bin/bash2
mscher:$1$tspYYGpN$nMdraU38m/Pf.Wm6qq97d.:3522:4503:prisoner:0:0:
Mary S. Scherbakova:/cell/45_03/mscher:/usr/local/bin/bash2

Поле шифрованного (хешированного) пароля независимо от его длины,
занимает 34 знакоместа и разбито на 3 подполя, разделителями которых
служат символы `$' :

:$1$`8 знакомест'$`22 знакоместа':

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

Второе подполе -- префикс - это строка длиной 8 знакомест, каждое
из котрых содержит один символ из следующих 64-х:

./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz

Содержание префикса определяется при создании аккаунта или
при смене пароля при помощи датчика случаных чисел. Генерируется
8 случайных целых чисел в диапазоне 0-62 и берутся символы на
соотвествующих позициях вышеуказанной строки (позиции нумеруются
с 0, как элементы массива в языках C и Perl).

Затем система запрашивает ввод нового пароля (двукратно, чтобы
исключить случайные опечатки). Для пароля могут использоватьтся
любые символы, но рекомендуется ограничить алфавит вышеуказанным,
чтобы не переусложнить пользователю вход в систему (обычно из него
еще исключается точка). Для студенческих аккаунтов на хосте
prison.kmstu.local алфавит сммволов пароля сокращен до 57 символов
(не используются также O, 0, 1, l, I, которые плохо различаются в
напечатаных аккаунтах и студенты их часто путали):

23456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz

Если потребуется повысить надежность пароля, то можно это сделать
соответствующим образом увеличив длину пароля. Для обеспечения
надежности пароля имеет значение только число N всех возможных
паролей и равновероятность использования каждого. Если N = 2**b и
все пароли равновероятны, то криптостойкость характеризуется
величиной b - эффективной длиной пароля в битах b = log2( N ).
Если в алфавите из которого составляется пароль всего a символов,
а длина пароля l символов этого алфавита, то N = a ** l. Таким
образом эффективная длина пароля в битах:

b = log2( a ** l ) = l * log2( a ) = l * ln( a ) / ln( 2 )

Введенный пароль конкатенируется с префиксом (содержимым подполя 2)
и направляется на вход функции хеширования MD5. Например, если
пользователь изменяет свой пароль и назначает себе новый пароль
длиной 10 символов, то на вход функции хеширования поступает строка
из 8 + 10 = 18 байт. Функция MD5 дополняет ее стандартным заполнителем
до 512бит (64 байт) и хеширует, выдавая 128-битный хеш-код. (MD5
обрабатывает входную информацию блоками стандартной длины - 512
бит).

Полученный 128-битный хеш-код разбивается на 6-ти битные сегменты,
получается 21 полных сегментов, а последний 22-й сегмент содержит
2 бита (128 = 21*6 + 2). Числовое значение каждого 6-ти битного
сегмента трактуется как номер позиции в строке из 64-х следующих
символов:

./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz

Каждыи из 21 полных сегментов кодируется символом, находящимся в
этой строке на позиции с этим номером. Последний 22-й сегмент
содержит всего 2 бита, его возможные числовые значения 0, 1, 2 или 3,
значит он кодируется соотвествующим символом "/" "." "0" или "1" .
Полученная строка длиной 22 символа является содержанием 3-го подполя,
т.е. символьной формой представления хеш-кода, который зависит от
исходного пароля и от префикса.

При входе пользователя в систему вслед за вводом login-а, она
запрашивает у него исходный пароль, известный только ему одному.
Пользователь вводит пароль, система находит по login-у его
запись в файле master.passwd, выбирает из него префикс,
конкатенирует его с введенным паролем, результат подает на ввод
хеш-функции MD5, кодирует вывод MD5 по стандартному 64-символьному
алфавиту (последняя из вышеприведенных строк) и сравнивает полученный
результат с содержанием 3-го подполя в его записи в файле master.passwd.

Криптостойкость при подборе отдельно взятого пароля при известном
префиксе (т.е. если злоумышленник добрался до файла master.passwd,
например администратор скопировал его, как пример, в файл, открытый для
доступа):

b = 8 * ln( 57 ) / ln( 2 ) = 46.672

Это эффективная длина в битах вашего пароля на хосте prison


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

префиксы + исходные пароли -- хеш-коды

Для составления словаря для взлома всех 8-символьных паролей
криптостойкость:

b = 16 * ln( 63 ) / ln( 2 ) = 95.653 бит

Число всевозможных вариантов комбинации пароля и префикса таким образом
превышает 2 ** 95 или 10 ** 28. Такое число хеширований нужно
провести для составления полного словаря для взлома 8-символьного
пароля. Если предположить, что найдется многопроцессорный
суперкомпьютер или специализированное суперустройство параллельных
вычислений, на котором одно хеширование проводится за
1 мксек (вместе с накоплением результата в супернакопителе),
то за 1 сек будет хешироваться 1000000, т.е. 10 ** 6 вариантов.
В году 365 * 24 * 60 * 60 = 31535000 секунд, поэтому за год
непрерывной работы будет хешироваться 32 * 10 **12 вариантов.
Для хеширования всех вариантов понадобится

10 ** 28 / ( 32 * 10 **12 ) = 3 * 10 ** 14 = 300 000 000 000 000 лет

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

При подборе одного отдельно взятого пароля 8-символьного пароля
при известном префиксе число всех возможных вариантов пароля
превышает 2 ** 46, при равновероятности всех вариантов при подборе
в среднем требуется проверка половины их числа, т.е. 2 ** 45 или
34 * 10 ** 12 вариантов. На том же гипотетическом суперкомпьютере
эта задача займет

( 34 * 10 ** 12 ) / (32 * 10 ** 12 ) = 1.06 т.е. более года,

что также практически нереально. Обратите внимание насколько
криптостойкость снижается, если известен префикс, т.е. при
раскрытии файла master.passwd.

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

Файл /etc/master.passwd изменяется командами:

adduser - Создать новые аккаунты

rmuser - Удалить аккаунт и все файлы этого пользователя

vipw - Редактировать файл паролей

/etc/master.passwd passwd - Смена пароля

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

chfn - Изменение поля GECOS

chsh - Изменение поля login-shell

Первые три команды доступны только суперпользователю root (uid=0),
последюущие доступны и обычным пользователям, но обычный пользователь
может поменять только свой пароль, GECOS и login-shell.

Все перечисленные команды вносят изменения в двоичные базы данных
/etc/pwd.db и /etc/spwd.db автоматически. Если же суперпользователь
прибегает к непосредственному редактированию файла /etc/master.passwd,
то он должен по окончании редактирования послать команду pwd_mkdb
для синхронизации двоичных баз данных (т.е регистрации в них и в
/etc/passwd текущего состояния /etc/master.passwd).

Кроме суперпользователя (uname=root, uid=0), в системе имеется ряд
псевдопользователей. Псевдопользователь имеет запись в /etc/passwd
и в /etc/master.passwd, но ему не соответствует никакое физическое
лицо. От имени псевдопользователей запускаются различные системные
процессы с различными правами доступа к файлам и другим ресурсам
системы. Примеры записей файла /etc/paswd, соотвествующих
псевдопользователям:

daemon:*:1:1:Owner of many system processes:/root:/usr/sbin/nologin
operator:*:2:5:System &:/:/usr/sbin/nologin
bin:*:3:7:Binaries Commands and Source:/:/usr/sbin/nologin
tty:*:4:65533:Tty Sandbox:/:/usr/sbin/nologin
kmem:*:5:65533:KMem Sandbox:/:/usr/sbin/nologin
games:*:7:13:Games pseudo-user:/usr/games:/usr/sbin/nologin
news:*:8:8:News Subsystem:/:/usr/sbin/nologin
man:*:9:9:Mister Man Pages:/usr/share/man:/usr/sbin/nologin
sshd:*:22:22:Secure Shell Daemon:/var/empty:/usr/sbin/nologin
pop:*:68:6:Post Office Owner:/nonexistent:/usr/sbin/nologin
www:*:80:80:World Wide Web Owner:/nonexistent:/usr/sbin/nologin
nobody:*:65534:65534:Unprivileged user:/nonexistent:/usr/sbin/nologin

В поле шифрованного пароля в файл /etc/master.passwd для
псевдопользователя записывается значение `*', которое не может
быть получено ни для какого пароля, это означает что псевдопользователь
не может войти в систему с терминала и работать из сессии.

Если поле пароля в /etc/master.passwd вообще пусто, это означает,
что данный пользователь может войти в систему без пароля. Некоторые
администраторы создают аккаунты для новых пользователей без пароля,
но требуют, чтобы при первом входе в систему пользователь сам
назначил себе пароль.

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


3.1. Упражнения на закрепление материала по аутентификаци
пользователя для терминального доступа в системе FreeBSD.

В методических материалах имеется следующий директорий:

/cell/public/7sem/2010/lab/passwd/

Скопируйте его в свой HOME со всем его содержимым (все поддерево).
Для рекурсивного копирования всего заданного поддерева в команде
cp имеется опция -r . Важное замечание: в качестве копируемого
объекта - источника задается поддерево без завершающего его
разделителя / , даже если он автоматически добавится при наборе
маршрута с исполдьзованием автодополнения по клавише Tab, нужно
замыкающий разделитель / стереть перед тем как посылать команду
нажатием Enter, если не сотрете, то в директорий-мишень скопируется
только все содержимое поддерева без самой заданной вершины. Итак,
командная строка рекурсивного копирования поддерева passwd:

cp -pvr /cell/public/7sem/2010/lab/passwd ~/

Поддерево вместе с его вершиной скопировалось в ваш HOME. Сделайте
текущим новый скопированный поддиректорий passwd и просмотрите его
содержание:

cd ~/passwd
ls -l

total 54
-rwxr-xr-x 1 virtub g4207 369 Sep 15 16:54 getpwd.pl
-rwxr-xr-x 1 virtub g4207 960 Sep 15 16:54 getpwd_u.pl
-rw-r--r-- 1 virtub g4207 18988 Sep 15 16:54 master.passwd
-rwxr-xr-x 1 virtub g4207 19154 Sep 15 16:54 master_passwd.txt
-rw-r--r-- 1 virtub g4207 5412 Sep 15 16:54 passwd.txt
-rwxr-xr-x 1 virtub g4207 1995 Sep 15 16:54 setpwd.pl
-rwxr-xr-x 1 virtub g4207 1922 Sep 15 16:54 testpwd.pl

Имеется реальный файл master.passwd, вышедший из употребления летом
2007г, когда я менял версию FreeBSD, инсталлируя FreeBSD 5.5.
Просмотрите его, актуальный на сегодняшний день относится к тем
немногим ресурсам, на чтение которых у вас нет прав. Файл
master_passwd.txt - тот же файл для просмотра в среде WINDOWS.

Исполняемый файл (Perl-программа) getpwd.pl - генерация паролей
длиной 8 символов, написанная мной специально для генерации
студенческих паролей и использованная при создании ваших аккаутнтов.
Вся программа имеет объем 4 строки и может являться иллюстрацией
лаконичности языка Perl. Просмотрите программу и позапускайте ее
несколько раз. При запуске указывать маршрут обязательно, даже для
текущего директория:

cat getpwd.pl
./getpwd.pl
./getpwd.pl
. . .

Программа getpwd_u.pl генерирует пароли произвольной длины, которая
задается как аргумент командной строки запуска программы:

./getpwd_u.pl 6
./getpwd_u.pl 12
./getpwd_u.pl 4
./getpwd_u.pl 46
. . .

Программа setpwd.pl запрашивает 2-кратный ввод пароля вслепую и
запоминает хеш-код в файле ./pwd точно в таком же формате, как
в реальном файле master.passwd:

setpwd.pl
cat pwd

Программа setpwd.pl запрашивает 2-кратный ввод пароля вслепую и
запоминает хеш-код в файле ./pwd точно в таком же формате, как
в реальном файле master.passwd.


Программа testpwd.pl запрашивает 2-кратный ввод пароля вслепую и
если хеш-код введенного пароля совпадает в запомненным в файле ./pwd,
сообщает, что правильно был введен тот самый пароль, который был
задан при последнем вызове программы setpwd.pl. Программа имеет три
вида сообщения:
- второй ввод пароля несовпал с первым,
- двукратный ввод идентичен, но не совпал с установленным при
последнем запуске setpwd.pl,
- все ОК, двукаратный ввод идентичпен и он в точности совпадает
с установленным при последнем запуске setpwd.
Запуская программу несколько раз добейтесь каждого из этих сообщений:

testpwd.pl
testpwd.pl
testpwd.pl
testpwd.pl
. . .

Файл passwd.txt содержит конкатенацию текстов всех 4 Perl-программ для
просмотра в среде WINDOWS.

4. Группы. Структура файла /etc/group.

Пользователи объединяются в группы, причем один пользователь может
входить в несколько групп (в FreeBSD -- до 15-ти). Каждый пользователь
должен входить по крайней мере в 1 группу, ее идентификатор `gid'
задается в 4-м поле файлов /etc/passwd и /etc/master.passwd. Если
не предполагается его работа ни в какой группе, то для него создается
специальная группа, имя которой совпадает с его login-ом, в которой
он является единственным членом.

Если пользователь должен входить более чем в одну группу, это
задается в файле /etc/group, задающем имена и состав всех групп.
Структура записей файла /etc/group:

gname:*:gid:<список lognames>

Каждая строка определяет группу с именем `gname' и идентификатором
`gid', в которую входят:
- все пользователи, у которых `gid' является группой, заданной в файле
/etc/passwd
- пользователи с перечисленными логинами в `списке lognames'.


Примеры записей файла /etc/group:

g4003:*:4003:strel
g4503:*:4503:strel,vstude
deprive:*:3000:smatyt,amilit,amiron,spetru,lrozhk,asalni, ... ,atamar

В группу (gid=4003, gname=g4003) входят:
- все пользователи, у которых gid=4003 является группой,заданной
в файле /etc/passwd
- пользователь strel (преподаватель)

В группу (gid=4503, gname=g4503) входят:
- все пользователи, у которых gid=4503 является группой,заданной
в файле /etc/passwd
- пользователи strel и vstude (виртуальный студент)

В группу (gid=3000, gname=deprive) входят:
- все пользователи, у которых gid=3000 является группой,заданной
в файле /etc/passwd (таковых в нашем случае ни одного нет)
- пользователи, здесь перечислены uname всех студентов, в настоящий
момент 144 реальных и 4 виртуальных.

Этот файл открыт для чтения всем, поскольку он может использоваться
любым процессом, например для нахождения соотвествия gname <==> gid
(по gid определить gname и наоборот), а также для определения
является ли пользователь uid членом группы gid .

5. Стандартные потоки и их перенаправление (redirection).
Конвеер (pipe).

Всякий раз как пользователь запрашивает вход в систему, для
открываемой сессии в системе выделяется терминал (или псевдотерминал
при сетевом доступе пользователя). Когда пользователь пройдет
процедуру аутентификации (введет правильный login и password),
запускается интерпретатор команд `login-shell' - программа,
заданная в последнем поле регистрационной записи данного пользователя
(в файле /etc/passwd). В течение сессии shell выдает приглашения
для ввода командных строк, проверяет их синтаксически, производит
их интерполяцию и интерпретацию и запускает заданные программы
на выполнение. Shell ведет историю команд, управляет заданиями
(job-ами), предоставляет средства автодополднения и редактирования
вводимых командных строк. Сессия будет продолжаться вплоть до
завершения `login-shell' с помощью команды `logout' или `exit'.

Сразу в начале своей работы Login-shell открывает три файла, называемых
стандартными потоками:

fd=0, STDIN (cтандартный поток ввода), назначая ему терминал (клавиатуру);
fd=1, STDOUT (стандартный поток вывода), назначая ему терминал (экран);
fd=2, STDERR (стандартный поток сообщений об ошибках), назначая ему
терминал (экран) тот же как для STDOUT.

fd обозначает значение файлового дескриптора, возвращаемое системном
вызовом `open()', выполняемым для открытия файла.

Эти три файла наследуются каждой запускаемой программой. Таким образом
каждая программа при запуске уже имеет три открытых файловых дескриптора
0, 1, 2 для потоков STDIN, STDOUT, STDERR. По умолчанию этим потокам
остаются назначенные клавиатура и экран терминала. Однако при помощи
перенаправления можно каждому из этих потоков назначать заданный файл.
Это делается при помощи символов перенаправления:

> файл >> файл - перенаправление STDOUT в файл с перекрытием или
с добавлением в конец файла.

2> файл 2>> файл - перенаправление STDERR в файл с перекрытием или
с добавлением в конец файла.

< файл - перенаправление STDIN на чтение из файла вместо
ввода с клавиатуры.




Примеры

cat f1 f2 {f1}.{f2} --> STDOUT (экран)

cat STDIN (клавиатура) --> STDOUT (экран)
конец данных с клавиатуры - после Enter нажать комбинацию клавиш ^d

cat f1 f2 > f12 {f1}.{f2} --> f12

cat fa >> f12 {f12} = {f1}.{f2}.{fa}

wc fb - выводит на STDOUT число строк, слов и символов в файле `fb'


Конвеер.

Оболочки UNIX позволяют непосредственно передавать выводимые
в STDOUT данные одной программы на вход STDIN другой программы,
не прибегая к их сохранению во временном рабочем файле. Таким
образом может строится цепочка из нескольких программ. Для управления
конвеером порождается дочерний процесс оболочки, завершающийся при
завершении или разрыве конвеера. Синтаксис конвеера:

программа_1 | программа_2 | ... | программа_N



Рекомендуемые упражнения:

1. Просмотреть файлы /etc/passwd и /etc/group:

less /etc/passwd

less /etc/group -

2. Выделить записи, касающиеся себя из этих файлов:

cat /etc/passwd | egrep "свой login"

cat /etc/group | egrep "свой login"

cat /etc/group | egrep "свой gid"


3. В какие группы входите вы, в какие пользователь strel, виртуальный
студент vstude, суперпользователь root:

groups

groups strel

groups vstude

groups root

4. Какие имеются полномочия у каких пользователей на файлы /etc/passwd,
/etc/master.passwd, /etc/group, /etc/pwd.db, /etc/spwd.db

ls -l /etc/passwd
ls -l /etc/master.passwd
ls -l /etc/group
ls -l /etc/pwd.db
ls -l /etc/spwd.db

5. Кто может запускать на выполнение команды passwd, adduser, rmuser,
chpass, vipw, .

ls -l /usr/bin/passwed
ls -l /usr/sbin/adduser
ls -l /usr/sbin/rmuser
ls -l /usr/bin/chpass
ls -l /usr/sbin/vipw

6. Просмотреть свои сессии за текущий месяц

last | egrep "свой login"




6. ПОНЯТИЕ О ПРОЦЕССАХ.


Весь UNIX делится на файлы и процессы

Существует 6 типов файлов:
- -- обычный файл (обычный файл иногда называют регулярным)
d -- директорий
l -- символическая связь (link)
b или c -- специальныфй файл устройства с символьным или блочным
интерфейсом
p -- именованный канал (pipe)
s -- сокет

Данные обозначения типов используются в выдаче команды
ls -l файл
(самый первый символ в строке описания файла в выдаче этой команды).

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

Процесс состоит из выделенного ему адресного пространства и набора
структур данных для управления выполнением программы. Адресное
пространство представляет собой совокупность страниц памяти (1
-- 8кб), выделенных ядром данному процессу. В адресное пространство
процесса загружается программный код процесса, используемые им
библиотеки функций, переменные, стек, а также вторая часть структур
данных, используемых ядром для управления процессом. В соотвествии
с концепцией виртуальной памяти в каждый момент времени либо все
страницы адресного пространства процесса могут находиться в
физической ОП, либо часть страниц в физической ОП, а часть выгружена
на диск в SWAP-раздел, либо все страницы выгружены на диск в
SWAP-раздел.

В период загрузки системы после инициализации ядра и выявления им
и проверки всех аппаратных устройств системы, ядро запускает несколько
особых процессов-демонов:
swapper (pid=0), init (pid=1), pagedaemon (pid=2), ....
Среди них только один процесс init имеет отдельный исполняемый
файл /sbin/init, остальные являются просто частью программного
кода ядра, но оформлены в виде процессов, чтобы можно было
использовать обычные средства для наблюдения и управления
их работой. Все процессы ядра, включая init, создаются нетиповым
способом. Типовым способом порождения нового процесса является
клонирование уже существующего процесса. Любой процесс, созданный
по окончании загрузки знает своего родителя (имеет аттрибут ppid).
Первым процессом, который начинает клонироваться является
процесс init, который таким образом явяется "прародителем" любого
процесса в системе.

Если двигаться по родословному дереву любого процесса повторя команду:
ps -O ppid,start,user -p <pid>
и подставляя каждый раз в качестве <pid> очередной <ppid>, через
какое-то число шагов неизбежно дойдем до процесса init (pid=1).


Пример (строки выдачи написаны в порядке, обратном их получению):

ps -O ppid,user,start -p 35383


PID PPID USER STARTED TT STAT TIME COMMAND

94985 1 root 28Aug03 ?? IsJ 0:00.74 /usr/sbin/inetd -Ww -l

35382 94985 root 6:24PM ?? SsJ 0:00.15 telnetd

35383 35382 root 6:25PM p4 IsJ 0:00.04 login -h ws3.msta.ac.ru -p

35392 35383 strel 6:25PM p4 S+J 0:00.15 -bash (bash)



При завершении любого процесса он посылает сигнал о своем завершении
родительскому процессу и данные по использованию им времени процессора
и других ресурсов передаются в управляющие структуры данных родителя.
Поэтому, например, используя ключ -S в команде ps , можно получить
процессорное время, израсходованное в сессии пользователя его
login-shell -ом и всеми потомками, завершенными на данный момент времени,
т.е всеми командами в данном сеансе.

Если процесс-родитель не ждет завершения потомка, а продолжает
выполняться параллельно с ним и завершается раньше потомка, все
его незавершенные потомки передаются процессу init (их аттрибут
ppid устанавливается равным 1). Если этого почему-либо не происходит
(например из-за аппаратных сбоев), то при завершении такого
"осиротевшего" процесса, сигнал о завершении, который процесс
пошлет родителю, окажется недоставленным за неимением родителя,
управляющая структура с данными по использованию ресурсов не
уничтожается, а остается в системе. Такой процесс называется
зомби, когда фактически процесса нет, но его управляющие структуры
не уничтожены и занимают память в области ядра. Освободиться от
процессов-зомби можно только перезагрузив систему.


7. ВЛАДЕНИЕ ФАЙЛАМИ И ПРОЦЕССАМИ


Атрибуты процесса RUID EUID RGID EGID. В обозначениях реальных
пользователя и группы процесса часто буква R опускается:
UID - это RUID процесса,
GID - это его RGID.


Каждый файл в UNIX принадлежит определенному пользователю и определенной
группе. Можно сказать, каждый файл имеет 2 атрибута владельцев:
владелец-пользователь uid и владелец-группа gid.

Атрибуты файла(ов) можно просмотреть при помощи команды `ls':

ls -ln /celli/42_02/amilit/

total 14
-rw-r--r-- 1 3211 4203 99 18 сен 11:25 err
drwxr-xr-x 5 3211 4203 512 18 сен 17:48 kdtree
-rw-r--r-- 1 3211 4203 0 11 сен 11:40 matchlines
-rw------- 1 3211 4203 3644 18 сен 11:21 meinf
-rwxr-xr-- 1 3211 4203 305 18 сен 11:25 mntpoint
u g o N uid gid fsize mtime name


Без использования опции `-n' в колонках uid и gid будут отображаться
не числовые, а строковые значения uname (т.е. login владельца-пользователя)
и gname (имя группы-владельца).

ls -ln /celli/42_02/amilit/

total 14
-rw-r--r-- 1 amilit g4203 99 18 сен 11:25 err
drwxr-xr-x 5 amilit g4203 512 18 сен 17:48 kdtree
-rw-r--r-- 1 amilit g4203 0 11 сен 11:40 matchlines
-rw------- 1 amilit g4203 3644 18 сен 11:21 meinf
-rwxr-xr-- 1 amilit g4203 305 18 сен 11:25 mntpoint



Аттрибуты для исполняемых файлов suid, sgid, t(sticky-bit)

см. в разделе ufS


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


UNIX использует следующий алгоритм обеспечения доступа процесса к
файлу:

1. Сравниваются EUID процесса с uid файла. Если совпадают,
то проверяются права класса доступа `u' (владелец-пользователь
файла). Если затребованное действие с файлом (чтение-`r',
запись-`w' или запуск на выполнение-`x') запрещено, то сообщение
`Permission denied' и отказ в доступе без дальнейших проверок
возомoжности доступа по правам группы-владельца (класс доступа
`g') и всех прочих (класс доступа `o'). Если затребованное
действие разрешено, то оно производится.

Если EUID процесса не совпадает с uid файла, то переход к п.2.

2. Сравниваются EGID процесса с gid файла. Процесс имеет
атрибут-массив, включающий от 1 до 16 значений групп. Ищется
совпадение какой-то из групп процесса с gid файла. Если совпадение
имеется, то проверяются права класса доступа `g' (группа-владелец
файла). Если затребованное действие с файлом (чтение - `r',
запись - `w' или запуск на выполнение - `x') запрещено, то сообщение
`Permission denied' и отказ в доступе без дальнейшей проверки
возомoжности доступа по правам всех прочих (класс доступа `o').
Если затребованное действие разрешено, то оно производится.

Если ни одна группа процесса, включая и дополнительную EGID, не
совпадает с gid файла, то переход к п.3.

3. Проверяются права класса доступа `o' (все прочие). Если
затребованное действие с файлом (чтение - `r', запись - `w' или
запуск на выполнение - `x') запрещено, то сообщение `Permission
denied' и отказ в доступе. Если затребованное действие разрешено,
то оно производится.



Команда chmod

см. в разделе lec/unix/ufs_3




Команда umask

см. в след. файле лекций


8. Клонирование процессов.

8.0. Необходимые сведения о языке Perl.

Упрежнения по клонированию процессов написаны на языке Perl. Первой
строкой исполняемого файла Perl-программы является задание маршрутного
имени к интерпретатору для выполниния Perl-программ это обязательно
должна быть первая строка исполняемого файла программы и первый
символ стоять в самой первой позиции. Это символ комментария, но
в этой позиции и если после него сразу же следует восклищаетльный
знак эта пара символов образует метазнак, обозначающий, что далее
идет маршрутное имя интоерпретатора для данного исполняемого файла.
Пусть мы хотим назвать прорамму sb.pl ( .pl - суффикс, обычно
используемый в именах Perl-программ. Вызываем редактор ee (easy
editor) и при вызове зададим имя вводимого или изменяемого файла:

ee sb.pl

Набираем первую строку, которая называется sha-bang от названий
первых двуx символов, образующих метазнак # (sharp - диез) и ! (bang):

#!/usr/bin/perl

Следующая строка программы - команда print, выводящая в STDOUT
информацию о программе и о процессе.

При вызове программы на выполнение, имя по которому программа была
вызвана (т.е. первое слово командной строки вызова программы)
содержится в специальной переменной Perl-процесса $0 (после
символа доллар цифра 0). Первый символ доллара обозначает, что
даннная переменная является скаляром, т.е. хранит единственное
значение ( а не множество значений, как в массиве). А цифра 0
играет роль имени, т.е. является обозначением этой специальной
переменной.

Идентификатор процесса содержится в специальной переменной $$ -
первый доллар это признак скаляра, второй доллар - имя специальной
переменной Perl-процесса. Идентификатор владельца процесса содержится
в специальной переменной Perl-процесса $< . Выодим значения этих
специальных переменных:

print "Стартовала программа $0 " .
"образовав процесс pid: $$ владельца uid: $< \n";

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


8.1. Системный вызов fork().

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

1. Порожденному дочернему процесс (т.е. процессу-копии) ядро
присваивает новый уникальный идентификатор процесса PID.

2. В качестве идентификатора родительского процесса PPID порожденному
дочернему процессу (т.е. процессу-копии) ядро присваивает PID
процесса-источника копирования.

3. Порожденный дочерний процесс освобождается от сигналов, ожидающих
доставки.

4. В качестве возвращаемого значения системный вызов fork() возвращает
в порожденном дочернем процессе 0 , а в родительском процессе --
PID порожденного дочернего процесса. В случае ошибки (например,
системный вызов fork() не может завершиться нормально в связи
с превышением лимита числа процессов владельца процесса, вызвавшего
fork() ) возвращается отрицательное значение -1 (дочерний процесс в
этом случае не образуется).


8.2: Скелет организации процессов-серверов с установлением соединения

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

Работающая программа и имеется в файле fork.pl , лежащем в поддиректории
/cell/public/7sem/2008/lec/unix/fork_shell/, и кроме того ее текст
имеется ниже
Соседние файлы в предмете Операционные системы