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

unix

.txt
Скачиваний:
1
Добавлен:
14.01.2020
Размер:
641.74 Кб
Скачать
#20110221 - использование find для просмотра дерева - конец п.9 #20110202 - поправлено форматирование комментариев и err - extrf п.12 #20101119 - расширен раздел 12.1 : добавлены строки 848 - 966
#20100822 intr0_Str


Эта начальная Методичка рассчитана на 8 часов лабораторных занятий

Вводная работа

После нажатия иконки TN мышью на рабочем столе в Windows в
полноэкранном режиме раскроется Telnet (протокол удаленного
терминального доступа). Сделайте следующее по пунктам, номера
которых завершаются двоеточием:

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

NODE: prison

LOGIN: ваш login из выданного вам аккаунта, например, pmokin

PASSWD: ваш пароль из выданного вам аккаунта, например, Yqp7TnZo

Если ответы введены правильно, ваш компьютер в ауд.1226 становится
удаленным терминалом к комьютеру в ауд. 1344, работающему в
операционной системе FreeBSD (это наиболее популярный для
Internet-серверов UNIX). Вся группа студентов параллельно работает
на одном компьютере под FreeBSD. У каждого, прошедшего процедуру
аутентификации, открывается терминальная сессия (так называется
сеанс работы в FreeBSD). Лидером сессии является процесс интерпретатора
команд, который еще называют оболочкой (англ. shell). Оболочка
для ввода и интерпретации команд выбирается системным администратором
и может быть индивидуальной для каждого полдьзователя в соотвествии
с его пожеланиями. По умолчанию в FreeBSD принята оболочка tcsh.
В нашем случае я решил установить более распространенную во всех
UNIX, в том числе и в LINUX, оболочку bash. Итак у вас на экране
приглашение оболочки bash для ввода комнды.

Когда вам нужно будет завершить сеанс работы в системе FreeBSD,
это делается командой logout. Команда logout завершит сеанс
только из среды login-shell, т.е. из той оболочки верхнего уровня,
в которой начался ваш сеанс работы, приглашение для ввода команд
этой оболочки начинается с параметра s=1. Если вы из login-shell
вызывали вложенную оболочку, то в приглашении будет значение s=2
или s=3, ..., соотвественно глубине вложенности оболочки. Тогда
перед тем как посылать команду logout нужно снижать уровень
вложенности оболочки до 1, посылая команды exit.

Полезно сразу попрактиковаться: выйти и повторно войти в FreeBSD.
При повторном входе может потребуется отвечать только на два
поcледних запроса из трех. Можете даже сделать это несколько раз,
пока вам не удастся с первого раза и легко вводить ваш пароль.

*** описание приглашения можно при первом чтении пропустить ***

Приглашение для ввода команд настраивается лично для себя каждым
пользователем. Вид приглашения задается значениями переменных
окружения PS1 и PS2, которые могут быть изменены пользователем,
их начальные значения заданы в файле ~/.bash_login, который также
может редактироваться пользователем. Исходный вариант приглашения:

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

выдает в приглашении следующую полезную информацию:

s=1 - уровень вложенности оболочки (shell), в ходе сеанса может
увеличиваться, logout возможен только при значении 1, для
понижения уровня при значиях, больших 1, служит команда exit.

j=0 - число приостановленных и фоновых программ в данном сеансе (jobs).
Пусть вы, выполняя работы, с этой же консоли просматриваете
файлы методичек, результаты выдачи, редактируете файлы и
т.д. При этом вы не закрываете процессы, а временно
приостанавливаете их, с тем чтобы периодически возобновлять
процесс с точки останова и продолжать интерактивную работу
с ним. Тогда каждый приостановленный процесс порождает в
текущей вашей оболочке задание (job) и значение j в приглашении
будет увеличиваться. Не стоит увеличивать его более 5, а
то процедура завершения вашей сессии станет достаточно
трудоемкой и вы не сможете оперативно завершить свою работу.

Выход на предыдущий уровень вложенности оболочки (exit для
понижения s), а также завершение сессии (logout из уровня
s=1) возможно только при отсутсвии job-ов на каждом покидаемом
уровне оболочки (j=0). Уменьшение производится последовательным
закрыванием остановленных процессов. Для этого поледовательно
каждый job переводится в интерактивный режим командой fg
и интерактивный процесс завершается. Чаще всего это бывает
процесс просмотра файла стандартным PAGER-ом, который завершается
путем нажатия клавиши буквы q нижнего регистра (произведено
от слова quit).

Список всех jobs выдается командой j (точнее, это алиас
команды jobs -l ). Остановленные задания можно возобновлять
в произвольном порядке c помощью команды:

fg НОМЕР

где НОМЕР - это номер в начале соотвествующей строки в выдаче
команды jobs -l (алиас j).

Приостановка процесса просмотра файла стандартным PAGER-ом
производится нажатием комбинации клавиш ctrl-z, при этом будет
в текущей оболочке будет образовываться новый job.

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

~ - маршрутное имя текущего директория, символом тильды обозначается
абсолютный (от корня) маршрут вашего персонального
HOME-директория. В ходе работы будет изменяться например
":~/demo_names:" или ":/cell/public/7sem/2010/lab/passwd:".
Это так называемое тильда-расширение оболочки.

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

Квадратные скобки и двоеточия - это просто произвольно выбранные
разделители, чтобы приглашение сделать легко читаемыМ.

************* описание приглашения закончилось **************

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

2: Создадим поддиректорий с именем d0902, для чего пошлем команду:

mkdir d0902 (от англ. make directory - сделать директорий)

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

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

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

drwxr-xr-x 2 pmokin g4502 512 14 cен 09:23 d0902

В списке характеристик мы видим слева 10 символов вплотную, без
разделителей (drwxr-xr-x) - это тип и права файла. Первый символ
- тип файла, в нашей пока единственной строке это файл типа d,
от англ. directory, таким образом первый символ из 10 говорит
нам, что это поддиректорий. Если бы это был не директорий, а
обычный файл, то вместо d стоял бы дефис (-). Следующие три
символа (rwx) указывают права владельца этого файла (r - читать
содержание файла, от англ. read, w - писать в этот файл, от
англ. write, x - для обычного файла означает, что его можно
запускать на выполнение, для директория - делать его текущим и
использовать для прохода в маршрутных именах). Следующие три
символа (r-x) указывают права пользователей, входящих в
группу-владельца файла. Здесь дефис означает отсуствие права.
Последние три символа (r-x) указывают права любого другого
пользователя, т.е не владельца файла и не входящего в
группу-владельца файла. Видим, права всех, кроме владельца
файла, отличаются от него отсутствием права на запись. И только
владелец файла может как угодно изменить права файла (rwxr-xr-x)
с помощью команды chmod, она описана в следующих методичках.

2 - это указывает сколько имен имеет файл на данный момент.

*** Сведения об именах файлов и директории можно пропустить ***

В отличие от Win-Dos в любом UNIX имя файла не является его
атрибутом, атибутом является только число имен. Имена могут
создаваться и удаляться. Имена файлов - это записанные в
директориях указатели на фактически безымянные файлы. Физически
обычный файл будет удален на носителе, только когда счетчик
имен сбросится на 0, т.е. при удалении последнего имени. Файл
типа d , т.е. директорий, кроме имени при своем создании в
некотором директории, где он является поддиректорием, обязательно
имеет еще одно имя - это точка в нем самом для того чтобы можно
было из текущего директория запускать на выполнение программы,
для этого требуется маршрутное имя, например ./wm_names .
Таким образом директорий (файл типа d) имеет как минимум 2 имени
и удаляется физичекски при удалении предпоследнего. Директорий
может иметь и более 2-х имен, если в нем есть поддиректории,
поскольку из каждго аоддиректория на него указывает имя,
обозначаемое двумя точками. Однако имя, явялющееся указателем
сверху (со стороны корня) из родительского директория, в котором
сам он является поддиректорием, может быть только одно, и это
то самое имя, которое было задано в команде соэдания этого
директория. Другое такое имя операционная система создать не
позволит, потому что при этом была бы нашушена строгая иерерхическая
структура дерева логической файловой системы UNIX.

****** Сведения об именах файлов и директориев закончилось ******

Далее в строке характеристик следует владелец-пользователь файла
(pmokin), владелец-группа файла (g4502), длина файла в байтах
(512), время создания или последнего изманения файла (14 cен
09:23), а когда с этого момента пройдет более года, если он не
изменялся, вместо времени будет указан год (14 cен 2010).
Директорий является бинарным файлом со сложной логической
структурой и его длина растет секторами, поэтому длина
файла-директория всегда кратна 512 байтам (это размер сектора
на диске). Завершает строку характеристик имя файла (d0902),
которое правильнее было бы называть именем указателя на безымянный
файл, но называют все-таки именем файла, подразумевая указатель.

4: Создадим обычный файл в HOME. Это можно сделать либо с помощью
любого текстового редактора, например ee , либо перенаправив
в новый файл информацию, выводимую на экран (стандартный выводной
поток STDOUT). Рассмотрим перенаправление STDOUT. Используем
команду echo, которая выводит в STDOUT все свои аргументы.
Попробуйте послать такую команду:

echo Это мой пробный файл

Команда echo, как попугай, выведет все свои 4 аргумента в STDOUT
и вы увидите на экране повторение списка аргументов команды. Аргументом
команды является любая строка непробелов ограниченная пробелами.
При выводе команда echo будет в качестве разделителя использовать
один пробел. Если вы в комндной строке между словами сделаете
более одного пробела, то при выводе нескольно пробелов будут
превращены в один пробел. А если вы возмете в командной строке
нескольно слов в кавычки или одинарные апострофы, то все "закавыченное"
станет единым аргументом и все пробелы сохранятся.

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

Чтобы STDOUT команды перенаправить в файл, используются символ
> (с перезаписью файла) или пара символов >> (для добавления в
конец файла), за которым задается имя файла. Если заданного файл
не существует, он создается как в случае >, так и >> :

echo Это мой пробный файл > newfile1
echo "Это другой (c >>) пробный файл" >> addfile2
echo Это добавленная строка в существующий файл >> addfile2

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

echo Это другой "(c >>)" пробный файл >> addfile2

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

ls -l

5: Команда смены текущего директория - cd

Имя команды образовано из английского change directory - изменить
директорий. Текущий директорий еще называют рабочий директорий
(work directory). Есть еще команда pwd (от англ. print work
directory) - эта коканда показывает абсолютный маршрут текущего
директория. Попробуйте послать ее:

pwd

Вы увидите /cell/g4502/pmokin - это полное маршрутное имя
(от корня), разумеется в том случае если вы - Петя Мокин и
учитесь в группе 45-02. Поскольку этот маршрут очень часто
используется каждым пользолвателем в FreeBSD имеется его
краткое обозначение символом тильды ~ , вы видите
это обозначение в пригшлашении ввода команды.

А теперь поменяем текущий директорий:

cd /cell

Посмотрите на приглашение, видите, произошло изменение текущего
директория, просмотрите, что в нем

ls -l

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

cd p Tab Tab u Tab (выскочит public) Tab Tab / Tab Tab и т.д.

По дороге просматривайте директории. А как вернуться повыше, назад
поближе к корню? В любом директории есть имя .. - это имя родительского
директория. Его можно даже увидеть, если в команде ls добавить
опцию -a - показывать и те имена, которые начинаются с точки,
так именуются файлы, выполдняющие специальные системные функции.
Пошлите команду:

ls -la

В числе обычных имен вы уведите

. # Это одно из имен текущего директория
.. # Это одно из имен родительского директория

Чтобы подняться на один шаг выше к корню нужно послать команду

cd ..

А как можно быстро вернуться в свой HOME? Для этого нужно послать
команду:

cd ~

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

cd

Такая команда сделает текущим ваш HOME. Петя пошлет - вернется
в /cell/g4502/pmokin

Вы пошлете - в своем HOME окажтесь.



6: Вывод файлов на экран.
Вывести содержание файлов на экран можно с помощью команды
конкатенаци файлов cat . Эта команда читает последовательно
все файлы, имена которых заданы ей, как аргументы, и все
объединенное содержание выводит в STDOUT. Если задать в команде
cat только один аргумент (имя файла) , то будет выведено на
экран содержание этого файла:

cat newfile1
cat addfile2

Можно объединить эти файлы, например поставив вперед содержание
более позднего файла:

cat addfile2 newfile1

Можно, используя перенаправление, создать файл с объединенным
содержанием файлов-аргументов команды cat

cat addfile2 newfile1 > sumfile3

ls -l
cat sumfile3

Не следует использовать в качестве файла перенаправления (справа
от > или >>) ни один из файлов - аргументов команды cat.
Произойдет зацикливание: чтение файла и запись в него же. Обычно
это приводит к лавинообразному увеличения длины файла до
заполнения вашей квоты дискового пространства. Прервать
зациклившуюся команду можно нажав и удерживая клавишу Ctrl,
коротко нажать и отпустить клавишу с (латиское в нижнем
регистре), далее будем эту комбинацию прерывания активной
программы обозначать ^c. Далее нужно просмотреть директорий,
и если в нем есть файл гигантской длины, удалить его командой
rm. Команда удаления описана в следующем пункте.



7: Просмотр больших файлов, превышающих размер экранного окна.

Если файл не уместится на одном экране, команда cat покажет
только последние 24 строки, а последующие убегут за верхнюю границу
экрана. Для просмотра файлов, превышающих число строк экранного
окна применяется команда пролистывания или вьюер less (Еще
по-английски такие программы называют PAGER - постраничник).
Еще программу less можно называть утилитой. Утилитой называется
любая системная (включенная в стандартное программное обеспечение
системы) программа, представленная в виде исполняемого файла в
одном из директориев, к которым мрописаны маршруты вызова, т.е.
это программы, которая может запускаться на выполнение по ее
базовому имени, без маршрута. Все множество команд в системе
подразделяется на утилиты и встроенные команды (builtin), код
которых является одним из блоков программного кода оболочки
(интерпретатора команд). Если имя файла, который нужно просмотретьш,
например, result, то просмотр с пролисыванием вверх-вниз делается
командой:

less result

Выход из PAGER-а less , чтобы вернуться к вводу командных строк
из среды less производится нажатием буквы q (нижнего регистра).
Опция -F (верхиий регистр) добавит утилите less удобство
просмотра маленьких файлов. PAGER less -F автоматически сравнит
число строк в файле с высотой экранного окна и если файл целиком
умещается в окно, то less -F выведет файл в окно и сама
автоматически завершится, не ожидая вашего нажатия q. Если же
файл больше окна, то налиставшись туда-сюда для выхода из среды
less и возврата ко вводу команд вам нужно будет нажать q :

less -F result

Нажатие многих клавиш в среде утилиты less является посылкой
внутренних команд этой утилиты (не требующих завершающего
посылку Enter). Например:

q - завершение утилиты;

G - прыгнуть на конец просматриваемого файла,

g - на начало просматриваемого файла;

= - выдать на экран общее число строк файла и
номера строк в верхей и нижней строках
экранного окна, т.е. текущее место экранного
окна по файлу;

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

185 Enter - Если набираемое число завершить не клавишей G,
а клавишей Enter, произойдет перемещение на заданное число
строк вперед по файлу.

Полностью все внутренние команды утилиты less, а также ее опции
можно просмотреть в руководстве, послав команду man (от англ.
manual - руководство), это команда FreeBSD, а не внутренняя
команда less, поэтому из less нужно выйти с помощью клавиши q:

man less

Набрав другое имя любой команды, можно просмотреть ее документацию.
У команды less очень много возможностей, опций, внутренних команд.
Данный manual, это только внешнее описание всех опций и команд
утилиты less имеет объем 1600 строк, это более чем вдвое больше
всей данной методички, и никаких повторов или детальных разъяснений
для чайников там нет - это лаконичная документация для специалистов
и очень высокого качества документация. К тому же все на английском.
Это все к тому, что углубляться в ее изучение не нужно, не выберетесь
до конца семестра, но полезно полистать и найти уже знакомые опции и
команды, получите представление о качстве и объеме документации
FreeBSD.

В среде less постарайтесь не нажимать клавишу v - это внутренняя
команда перехода из среды просмотра less в среду редактирования
очень мощного, но сложного редактора vi, если случайно это
произошло, вы сразу не заметите, они очень похожии, только внизу
по центру появится т.н. ruler - указатель номеров строки и
позициий курсора, а справа будет высвечиваться указатель режима.
Но уж точно потом заметите, когда захотите выйти и наберете q -
выйдет сообщение, что такой команды в среде vi нет. Чтобы
выбраться обратно из vi в less нужно нажать клавишу Esc - и
посмотреть, что внизу слева высветится режим Command , затем
набрать три символа :q! (двоеточие, q, восклицательный знак),
они высветятся в нижней строке экрана, и Enter - вы вернетесь в
среду less, из которой уже выйдете простым нажатием q.

8: Удаление файлов - команда rm

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

ls -l
rm Удаляемое_имя_файла
ls -l

Если команда сработает без ошибок и удалит указанное имя, то
никаких сообщений на экран не выведется. До и после команды
удаления просматриваем текущий директорий с помощью команды
ls -l, чтобы увидеть, что файлы действительно были удалены. Это
не очень удобно, лучше было бы пользователю от команды удаления
получить подтверждение, что удалено именно то имя, которое он
собирался удалить. Многие команды имеют опцию -v (от английского
слова verbal - разговорчивый, в смысле того, что команда должна
сообщать, что она делает). В команде rm такая опция имеется,
лучше использовать команду удаления с этой опцией, тогда она
будет выдавать на экран все удаляемые имена. Одной командой
можно удалить несколько имен, если задать их в качестве аргументов:

rm -v Удаляемое_имя_1 Удаляемое_имя_2 ...

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

rm -v wr*

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

wor, wrump, wr, w, wring5

то вышестоящая команда удалит 3 файла:

wrump wr wring5

(в первом случае шаблон * накроет 3 символа "ump", во втором
случае накроет 0 символов, в последнем случае 4 символа "ing5").
Останутся в текущем директории только 2 файла: файл wor, поскольку
второй символ o имени файла не совпадет со вторым символом
аргумента команды r, а также останется файл w, поскольку со
вторым символом аргумента команды r вообще нечего сравнивать.

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

f > w
f > wr
f > wor
...

ls -l # просмотрите, что вы натворили в директории

cat wor # просморите тексты, хотя бы в некоторых из
cat wr # созданных вами файлов

Удаляйте эти файлы по одному, группами, или используя шаблоны:

rm -v wor
ls -l
rm -v w???? # символ шаблона ? обозначает один любой символ
ls -l

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

Шаблоны имем файлов могут применяться в любой команде, в том числе
и в ls -l, чтобы выдавать характеристики не всех элементов в
директории, а только тех имен, которые совпадают с шаблоном:

ls -l *[0-9] # элемент шаблона квадратные скобки обозначает
# один символ из перечисленных в квадратных скобках
# [0-9] эквивалентно [0123456789]
# напомним, что символ шаблона * обозначает
# ноль или более любых символов в имени файла

9: Удаление директориев.

Удаляются только пустые директории, то есть сначала нужно удалить
все элементы (имена файлов и поддиректориев содержащихся в
директории). Только после того, когда в нем не будет содержаться
ни одного имени, кроме двух, неотъемлимо присутствующих в любом
директории:
. (ссылка из директория на самого себя) и
.. (ссылка на родительский директорий),
директорий может быть удален.

Попытка удаления непустого директория будет отвергнутм с сообщением
"Directory not empty" (Директорий не пуст).

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

rmdir -v Имя_удаляемого_директория

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

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

mkdir -v d_sacrifice

f > d_sacrifice/file27

mkdir -v d_patetrnal

mkdir -v d_patetrnal/subdir1

f > d_paternal/subdir1/file28

rmdir -v d_*

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

rm -v -d Удаляемые_файлы_и_пустые_директории

rm -vd Удаляемые_файлы_и_пустые_директории

rm -dv Удаляемые_файлы_и_пустые_директории

Для команды rm (но не для rmdir) существует опция -r рекурсивного
удаления заданного поддерева, вершина которого задана в аргументах
команды. Удаляемое поддерево будет циклически просматриваться
слева-напрво и сверху-вниз и последовательно снизу вверх удаляться
для каждого поддоректория все файлы, когда он опустеет, удалится и
сам директорий. Опция -r автоматически подразумевает и опцию -d,
поэтому не обязательно явно ее указывать. Совместно с -r может
использоваться опция -i (от англ. interactive, интерактивно).
При этом перед удалением каждого элемента команда будет запрашивать
подтверждение, действительно ли этот элемент можно удалить.
При отрицательном ответе уцелеет и этот элемент и вышестоящие
директории, поскольку они уже не будут пустыми, останутся, но
файлы в них будут уничтожаться, если вы будете посылать на то
разрешения. Пример:

rm -rvi d_paternal

Создайте поддерево, нашпигуйте его файлами, потом запустите команду
рекурсивного удаления.

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

find mysubtree # mysubtree - имя директория-вершины поддерева
find ./ # просмотр поддерева текущего директория

find ~ # просмотр дерева своего HOME от корня

find ~ | less # пролистывание дерева не умещающегося на экране
find ~ | less -F # автоматический (не требуя нажатия q) выход из
# среды less, если число строк вывода умещается
# на один экран

Использование конвеера | для комбинирования процессов, обрабатывающих
данные более подробно рассмотрено ниже, в п.11 D.

Создайте свое поддерево и просмотрите его с помощью find

Просмотрите большое поддерево /cell/public

Просмотрите поддерево поменьше /cell/public/6sem

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

cd /cell/public
find 6sem | less
find ./ | less


10: Копирование файлов и директориев.

************ надо написать и объяснить разницу между копированием
и созданием файла путем перенаправления STDOUT > >> примеры ,
объяснить работу опций -p -r может быть даже дать здесь примеры
прогона через фильтр egrep $USER egrep data сессий - результата
команды last и по дате прогон через xcode и unix2dos
**************************

Команда копирования (cp - от англ. copy) читает файл-источник и
создает новый файл-мишень, записывая в него содержание файла-мишени.
Пусть мы хотим скопировать файл-источник ~/d1/d2/f1, создав
файл-мишень ~/d0314/newf. Это сделает любая из 5 команд:

cp -v ~/d1/d2/f1 ~/d0314/newf # оба аргумента заданы абсолютными
# (от корня) маршрутными именами
# поэтому команда не зависит от
# текущего директория
# Если текущим директорием является ~/d1/d2 ( cd ~/d1/d2 ), то:

cp -v f1 ~/d0314/newf #или
cp -v f1 ../../d0314/newf

# Если текущим директорием является ~/d0314 ( cd ~/d0314 ), то:

cp -v ~/d1/d2/f1 newf #или
cp -v ../d1/d2/f1 newf

Опция -v (от англ. verbal - сообщать на STDERR о результатах команды).

Аттрибут "дата создания/модификации" файла-мишени будет соответсвовать
моменту выполненя команды копирования и отличаться от значения
этого аттрибута файла-источника. Обычно желательно, чтобы значения
этого аттрибута у файла-мишени было такое же, как у файла-источника.
Для этого служит опция -p (от англ. preserve - сохранить, уберечь).
Сохраняются значения всех аттрибутов, для которых в принципе
возможно сохранение. Например, владельца файла сохранить невозможно,
владельцем-пользователем файла-мишени всегда будет только тот,
кто выполняет команду копирования, независимо от владельца
файла-источника, а владелец-группа будет унаследована от директория,
в котором создается файл-мишень.

Если последним аргументом команды cp является уже существующий
директорий, у которого для вас есть право записи, то файл-источник
копируется в файл-мишень со своим базовым именем в этот директорий.
В этом случае (то есть в случае последнего аргумента - директория)
аргументов-источников может быть и более одного, каждый из них
скопируется со своим базовым именем в директорий-мишень. Для
задания множества файлов-источников могут использоваться шаблоны
имен файлов: ? - один любой символ, * - 0 или более любых
символов и т.д. (см. подробнее в du3_Str).

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

which cat # ответ будет /bin/cat
ls -li /bin/cat

Первая мишень - в вашем директории текущей даты занятий:

cp -vp /bin/cat ~/d0318/
ls -li ~/d0318/cat

Вторая мишень - в HOME-директории студента другой группы. Для этого
нужно использовать виртуального пользователя, который имеется в каждой
группе/
/tmp, у него для любого пользователя (для любого класса доступа)
есть право записи, значит и для вас:



11: Контрольное задание для самопроверки.

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

пустая строка строка звездочек или плюсиков или дефисов, любого
разделяющего символа пустая строка


Выглядеть все должно примерно так:


My mother loved children -- she would have given anything if I had
been one.
-- Groucho Marx

*****************************

Elliptical, n:
The feel of a kiss.

*****************************

Experience teaches you that the man who looks you straight in the
eye, particularly if he adds a firm handshake, is hiding something.
-- Clifton Fadiman, "Enter Conversing"

*****************************

. . .

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


11. Выводы.

Главная цель первых пунктов (1-10) данной методички это дать
практическое понятие о командной строке в любом UNIX-е, в частности
в FreeBSD. Подведем итог этих пунктов (приводимые ниже примеры можно
выполнять):

A. Главным разделителем элементов командной строки является пробел,
причем везде, где стоит пробел может стоять и более одного пробела.

B. Основная часть командной строки состоит из элементов 3-х типов:

- имя встроенной команды (builtin) , утилиты или исполняемого
файла пользователя;

- опции;

- аргументы

Имя команды или исполняемого файла пользователя явялется
обязательным элементом любой командной строки, все остальные
элементы могут отсуствовать (например команда pwd, выдающая
на экран маршрут текущего директория, или команда cd,
возвращающая пользователя в его HOME).

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

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

Так как первым словом (ограниченным справа либо концом строки,
либо пробелом) в командной строке может быть только исполняемый
файл (если не это не builtin), то для первого слова командной
строки реакция на одинарное или двойное нажатие клавиши Tab
особое. Если для аргументов по заданному началу файла в данном
директории есть однозначное продолжение имени на один или более
символов, это продолжение автоматически вносится в набираемую
командую строку. Если есть более одного продолжения или их нет
совсем, по первому нажатию Tab ничего не происходит. По повторному
нажатию Tab ниже набираемой строки на экран выдаются все имена
в данном директории, содержащие возможноые продолжения. Если
продолжений нет, то сколько на Tab не дави, ничего не произойдет.
Анализ имен делается только в рамках очередного директория,
до которого вы добрались, правильно набрав весь маршрут слева.

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

less -F ~/.bash_logout

less -f ~

Опция -F утилиты less обеспечивает автоматический выход из
среды просмотра (не требуется нажимать клавишу q) если все
строки файла уместились в одном экранном окне и листать не
нужно. У каждого из вас в HOME имеется несколько скрытых
файлов, имена которых начинаются с точки. В файле
~/bash_logout содержится программа из 5 командных строк
для вывода на ваш экран прощального сообщения о завершении
сеанса, если ваша команда logout завершилась благополучно.
Просматер этот файл вы увидите, что в одной физической
строке может быть задано несколько командных строк через
разделитель ; (точка с запятой).

Опция -f позволяет просматривать файлы любы типов,
без нее утилита less открывает тольк файлы обыкновенного
типа (в строке характеристик которого первый символ дефис)
Во второй командной строке вышестоящего примера пролистывается
файл типа d - директорий, а именно ваш HOME. Поскольку
директорий не имеет структуры отдельных строк, оканчивающихся
символом новой строки, то что вы увидите на экране более всего
похоже на мусор. На самом деле кое-что понять можно, если
вспомнить, что пока у вас мало элементов на экране размер
файла типа d 512 байт, по мере наполнения HOME его размер
скачком увеличиться до 1024, 1536 и т.д. Содержание этих
байтов вы и видите на экране, причем null-байты (с кодом 0)
изображаются двумя символами ^@ каждый байт. Это такие
байты на жестком диске, в которые с момента разметки этого
дискового пространства еще ничего не записывалось.


D. В одной физической строке может быть объединено две или более
командных строки, т.е. запущено две или более прораммы передающих
обрабатываемые данные по цепочке слева-направо. Для этого за
первой командой должен следовать символ вертикальной черты
| , задающий pipe (по русски переводят "конвеер", хотя точнее
было бы "канал"), за которым следует командная строка запуска
другой программы. Конвеер соединят стандартный выводной поток
STDOUT левой запущенной программы без всяких промежуточных
файлов непосредственно со стандартным вводным потоком STDIN
правой программы. Например (выполните это):

ls -l /usr/bin | less

Просматриваете директорий /usr/bin, содержащий 428 имен утилит,
для пролистывания этого длинного списка передаете его по конвееру
утилите less. Напомню, что для выхода из среды less нужно нажать
клавишу q (в нижнем регистре).

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

ls -l /usr/bin | egrep '9 [wm]' | less

Здесь список имен из директория /usr/bin направляется на вход
фильтра, который будет анализировать каждую очередную строку
и пропустит ее на выход только в том случае, если в ней найдется
подстрока длиной 3 символа, совпадающая с "9 w" или с "9 m".
Прошедшие сквозь такой фильтр строки подаются на вход утилиты
less для пролистывания на экране. Утилита egrep служит для
отбора строк, в которых совпадет регулярное выражение, заданное
как аргумент этой утилиты. Цифра 9 и пробел в регулярном
выражнии литерально представляют самих себя, то есть совпадают
с такими же символами в анализируемой строке. Элемент в
квадратных скобках совпадает с одним символом анализируемой
строки, любым, который перечислен в квадратных скобках.

E. Перенаправление.
Любая запускаемая на выполнение программы наследует от обололчки
(интерпретатора команд 3 открытых файла:

- вводной файл STDIN (дескриптор 0), с этим дескриптором связана
клавиатура терминала, но в командной строке запуска программы,
используя символ перенаправления стандартного ввода < , можно
вместо клавиатуры назначить вводной файл, из которого будут
вводится данные :

КОМАНДНАЯ СТРОКА < ВВОДНОЙ_ФАЙЛ

- выводной файл STDOUT (дескриптор 1), с которым связан экран
терминала, но в командной строке запуска программы,
используя символ перенаправления стандартного вывода > , можно
вместо клавиатуры назначить выводной файл, в который будут
выводится данные с перезаписью с начала файла. Если использовать
удвоенный символ перенаправления стандартного вывода >> данные
будут выводится с добавлением в конец файла. Как в случае перенаправления
> , так и >> , если файл, заданный справа от символа перенаправления,
не существует, он будет создан и открыт для вывода:

КОМАНДНАЯ СТРОКА > ВЫВОДНОЙ_ФАЙЛ

КОМАНДНАЯ СТРОКА >> ВЫВОДНОЙ_ФАЙЛ

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


КОМАНДНАЯ СТРОКА 2> ФАЙЛ_ВЫВОДА_ОШИБОК

КОМАНДНАЯ СТРОКА 2>> ФАЙЛ_ВЫВОДА_ОШИБОК


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

В текстильном университете впервые UNIX FreeBSD начали изучать
студенты в составе одной группы 45-98 в феврале 2001 на 6 семестре
в курсе "Технология клиент-сервер". Это был очень маленький по
объему курс (1час лекций и 1час лабораторных в неделю). Всего за
семестр 8 лекций и 8 лабораторных занятий. С тех пор по текущий
момент рос объем часов курсов, в которых использовалась система
FreeBSD и включая гр 40,42,45/07 накопились аккаунты студентов 37
групп общим числом 726 студентов (472 мужчины и 254 женшины). Для
создания аккаунтов использовались списки из деканата, в которых
для каждого студента указывалось полностью его фамилия, имя и
отчество. Возникла идея написать программу подсчета частоты
повторения мужских имен, женских имен студенческого поколения и
частоты мужских имен предшествующего поколения (отчества). Программа
была сделана и , вместе со списками всех групп, выполнявших
лабораторные занятия на FreeBSD составила демонстрационную работу.

Выполните ее по следующим пунктам:

12.1: Создание символьной связи (Link).

Чтобы не набирать длинные маршруты каждый раз, когда вам
понадобится что-нибудь скопировать или просмотреть в директориях,
где лежать методички сделаем в своем HOME символьную связь к
директорию 2010 следующей командой:

ln -s /cell/public/7sem/2010 ~/2010

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

less /cell/public/7sem/2010/lab/intr0_Str

можно использовать значительно более короткую запись:

less ~/2010/lab/intr0_Str

Если у себя в HOME сделать символьную связь к директории lab:

ln -s /cell/public/7sem/2010/lab ~/lab

то, потеряется возможность использовать ее для удобного доступа
к материалам в директории lec, которая имеется у символьной связи
~/2010/lec/ ..., но доступ к методичкам в lab станет проще:

less ~/lab/intr0_Str

А если создать символьную связь к самой методиче:

ln -s /cell/public/7sem/2010/lab/intr0_Str ~/intr0

доступ к методичке можно сделать совсем коротким:

less ~/intr0

но ее возможности вообще сузятся до единственного объекта-файла
intro_Str

Аналогом такой связи в Windows является ярлык, но это не совсем то
же самое, что symlink (от англ. Symbolic Link - символьная связь).
В проф. жаргоне российские специалисты так и по-русски называют этот
тип файла - симлинки, в фольклоре это вполне устоявшийся термин,

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

ln -sv /cell/g4207/winserv/public/7sem ~/winpub7
ln -sv /cell/public/7sem/2010/lab ~/lab
ln -sv /cell/public/7sem/2010/lec ~/lec
и т.д.

(Опция -v от англ. view - показывать что сделала команда)

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

ls -l ~/winpub7/
ls -l ~/lab/
ls -l ~/lec/
и т.д.

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

ls -l ~/lab
ls -l ~/lab/
ls -ld ~/lab/

(опция -d, использованная в последней командной строке, предписывает
показывать не содержание директория-мишени, а информацию про сам
этот директорий, не раскрывая его)

Можно сделать symlink на экзаменацционные вопросы и задачи
аналогичного экзамена 2009 года. Обновляются они очень незначительно
и выложены будут только на самом последнем лаб.занятии. Раньше
обновлений просто не будет существовать. В этом году этого не
наблюдается. Итак симлинк на прошлогодний экзамен:

ln -s /cell/public/7sem/2009/exam/ ~/exam2009

Смотрим вопросы по UNIX

less ~/exam2009/q_unix.txt | xcode | less

Смотрим вопросы по защите

less ~/exam2009/q_nsec.txt | xcode | less

и понимаем, что нужно не только посещать все лекции, но читать
в течение семестра, а не только перед экзаменов не свои записи
во время лекции - этого мало, а методички, выложенные для вас.
За 4 дня подготовки перед экзаменом вы сможете разобраться
максимум с 4 вопросами по защите(по 12 часов работы над
вопросом), а их 18. Как можно будет оценить вашу подготовку
если освоено 20% материала?


А вот как сделать симлинк к своей личной папке на сетевом диске
класса 1226 в папке вашей группы:

ln -s /cell/g4507/winserv/kserma ~/mywindir

# в качестве примера взята Ксения Ермакова из гр 45-07

Если вы еще не делали себе такую папку средствами WinXP или посредством
команды mkdir из своей пользовательской сессии FreeBSD, то попытка
просмотреть папку через новый симлинк окончится сообщением, что нет
такого файла или директория (No such file or directory). Сам симлинк
будет сделан в любом случае:

ls -l ~/mywindir # здесь в любом случае будет все OK
ls -l ~/mywindir/ # здесь может быть и "No such file or directory",
# если директория-мишени вы еще не делали
# тогда сделайте его посредством нового симлинка:

mkdir -v ~/mywindir/ # как и команда ls, так и mkdir по умолчанию
# не проследует к мишени симлинка, поэтому
# приходится ставить в конце слешь, обозначая
# что вы не хотите в совем HOME стереть симлинк
# с именем mywindir, перекрымв его директорием
# с таким же именем, а хотите проследовать, куда
# показывает симлинк и сделать там то, чего не
# хватает, т.е. директорий (папку, ибо показывает
# на диск, управляемый Win2000). Если считать,
# что это тот самый симлинк из примера для Ксении,
# то будет создана папка kserma на диске файловой
# системы NTFS, управляемой Win2000 на сервере,
# размещенном в 1226. А если это ваш симлинк,
# то будет создана ваша папка в директории вашей
# группы на сервере в 1226.

Теперь вы можете просмотреть эту новую папку и убедиться что она
есть, но пока пуста. Она же видна из WinXP из окна "Мой компьютер"
--> сетевой диск группы". Можете сделать файл в своей сесии FreeBSD,
лучше делать файл в своем HOME, а потом положить его из своего
HOME в эту папку, подняв с помощью cat и прогнав через конвертер
кодов xcode (koi8r --> cp1256) и конвертер символов "\n" unix2dos
(\x0a --> \x0d0a), при этом к имени результата обязательно добавить
.txt, чтобы без проблем открывать этот файл редакторами Word и
Notepad++. Теперь эта папка не пуста. Можно брать его себе на
флешку. Аналогично делается обратная передача - делаете
txt-файл на WinXP и через эту папку с флешки передаете в свой
HOME на хост prison под FreeBSD. Подробно об этом читайте в начале
методички du1_Str.

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

12.2: Копирование архива демонстрационной работы в свой HOME.

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

cp -vp ~/2010/lab/demo_names.tgz ~/

А если вы сделали и символьную связь ~/lab , то скопировать архив
можно более короткой командой

cp -vp ~/lab/demo_names.tgz ~/

Но если вы не сделали ни Link ~/2010 ни Link ~/lab, то в команде
копирования придется писать полный маршрут к копируемому источнику:

cp -vp /cell/public/7sem/2010/lab/demo_names.tgz ~/

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

Теперь рассмотрим команду копирования. Команда копирования cp
(от англ. copy взяты 1 и 3 буквы) выше используется с опциями
-v (сообщать что она делает на экран) и -p (в созданной копии
оставить все характеристики с такими же значениями как в источнике,
который копируется, в частности время создания или модификации
копируемого объекта). В качестве мишени (последний аргумент
команды) выше использовано имя существующего директория со слешью
в завершении имени. В этом случае предшестующих в командной строке
аргументов-источников может быть один или более (выше используется
только одинаргумент-источник). Каждый из заданных предшествующими
аргументами файл поочередно будет открываться, читаться и
записываться в новый файл, который будет назван базовым именем
источника, но в том директории, который задан последним аргументом
команды cp. То есть в результате команды, приведенной выше в
ваш HOME будет записан файл demo_names.tgz, содержание которого
в точности совпадает с содержанием файла-источника. Благодаря
опции -p в команде сp, дата и время создания этого нового файла
также будут взяты от соответсвующего источника, это не будет
фактический момент коппрования.

Итак пошлите команду

ls -l

и убедитесь что в ваш HOME скопировался архив demo_names.tgz,
сделанный в 22 августа в 11:30.

12.3: Извлечение демонстрационной работы из архива
(распаковка архива).

Распакуйте этот архив целиком следующей командой:

tar -xvzf demo_names.tgz 2> extrf
less -F extrf

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

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

Опция -v, как обычно, означает verbal - оглашать, выводить в STDOUT
имена извлекаемых из архива файлов и директориев.

Опция -z обязательно указыавется для сжатых архивов, а в большинстве
случаев используются сжатые архивы. Дело в том, что архивизация -
это объединение множества файлов или поддеревьев в единый архивный
файл так, чтобы исходную структуру и любой файл в отдельности можно
было потом извлечь из архива. Но при этом размер полученного архива
даже чуть больше, чем сумарный объем всех запакованных в нем файлов.
Сжимается архивный файл по алгоритму Лемпела-Зигфилда отдельной
утилитой gzip, которая автоматически вызывается после создания
архива, если в командной строке создания архива задать опцию -z.
При любой операции с таким архивом (извлечение, просмотр состава
архива, добавление файлов) необходимо задавать опцию -z, чтобы
автоматически привлекалась утилита gunzip для разгзиповки по
алгоритму Лемпела-Зигфилда перед любой операцией. Чтобы любому
пользователю было ясно, нужно задавать или не задавать опцию -z,
имеется соглашение пользователей UNIX присваивать имена несжатым
архивам с суффиксом .tar, а сжатым - с двумя суффиксами .tar.gz,
либо с одним суффиксом .tgz (как правило, используется именно
.tgz). Для операционной системы никакие суффиксы не имеют никакого
значения, это соглашения пользователей, чтобы сообщать другим и
себе для памяти, задавить или не задавать опцию -z в командных
строках работы с данным архивом.

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

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

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

В Telnet можно пролистать 5-6 предшествующих экранов, перейдя в
режим Scroll Lock (нажав одноименную режиму клавишу, для выхода
из этого режима она еще раз нажимается). Однако клавиша Scroll
Lock не решит проблему в общем случае, потому что число извлеченных
файлов может быть и сотни, и тысячи и диапазона 5-6 экранов все
равно не хватит.

В общем случае можно перенаправить STDERR в файл, например в
вышестоящем примере этому файлу дано имя extrf. Затем с помощью
less этот файл пролистывается. В этом случае число строк
ограничивается только вашей квотой дискового пространситва, хватит
и на миллионы строк. Напомню, что выход из less - клавиша q. Также
напомню, что перенаправление STDOUT - это символ >, а перенаправление
STDERR - это двусимвольный метазнак 2>.


12.4: Запуск демонстрационной программы.

Просмотрите ваш HOME и увидите, что в результате распаковки архива
образовался директорий demo_names, в котором уже достаточно много
элементов, так что объем 512 байт, как во всех предшествующих
создаваемых вами директориях, оказался недостаточным и пришлось
его расширить еще на один дисковый сектор (512+512=1024байта).

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

cd demo_names # набрав de или dem, используйте клавишу Tab,
# тогда удостоверитесь, что FreeBSD вас
понимает

Просмотрите директорий:

ls -l | less

Вы увидете 37 файлов со списками 37 групп студентов, когда либо
проходивших какой-либо курс на лабораторной базе FreeBSD, следовательно
имевших аккаунт. Просмотрите 3-4 из этих файлов, чтобы иметь
представление об исходных данным программы:

less -F g4207 less -F g4299
...

Кроме файлов со списками студентов, имеется еще 2 файла, открываемых
программой для ввода. Это файл escnames - исключения в алгоритме
определения пола по имени. Обычно женские имена оканчиваются на
"а" или "я", в противном случае имя - мужское. Этот файл содержит
исключения, пока таких исключений набралось всего 3 имени Илья,
Никита и Любовь. Просмотрите этот файл:

cat escnames

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

ee escnames

Выход из редактора - нажатие Esc и далее по меню.


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

Сама программа mw_names.pl - это исполняемый файл (в правах имеется
разрешение на запуск - x) на языке Perl

-rwxr-xr-x 1 virtub g4207 25807 Aug 22 04:44 mw_names.pl

Разобраться в ней вы не сможете, поскольку этот язык вам пока
совсем неизвестен, но можно просмотреть этот файл, почитать
комментарии, их 90 % объема файла и в них довольно подробно на
русском языке описан алгоритм. Кое-что можно будет понимать. Но
это только для особо интересующихся, можно в программу и не
заглядывать.

Запуск программы:

./mw_names.pl g* | less

После набора ./m по Tab первое слово должно само выскочить,
остальное дописываете. Элемент командной строки g* содержит
символ шаблона

* - ноль или более любых символов.

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

Пролистайте вывод программы и найдите свое имя и свое отчество.

Можно сохранить выдачу программы в файле, если при запуске программы
задать в командной строке запуска перенаправление STDOUT в файл,
например назвав этот файл all_37gr (все 37 групп):

./mw_names.pl g* > all_37gr

Теперь на экране вы увидите только выдачу на STDERR, в который
выводится содержание файлов escnames и patrends , а вся выдача
по статистике имен и отчеств, которая идет на STDOUT, уйдет не на
экран, а в файл. Зато теперь вы можете когда угодно любоваться
этой статисикой без всякой программы:

less all_37gr

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

13. Опции программы mw_names.pl

Программа mw_names.pl имеет 3 опции:

1. -h - Это Help, он длинный, поэтому читать нужно, используя
конвеер с less:

./mw_names.pl -h | less

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


2. -f allstud -- задание файла вывода для общего списка
обработанных студентов, который может использоваться для
выяснения с помощью утилиты egrep ИМЯ allstud кто
именно имеет данное ИМЯ (или данное отчество)


3. -0222 - это значение еще одной опции по умолчанию, оно
будет присвоено ей, если эта опция не задана в командной
строке. Однако в командной строке можно задать ее с
другими цифрами. Цифра в каждой козиции управляет выдачей
информации на STDOUT.

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

Остальные позиции задают режим вывода статистики по:

- по мужским именам (2я позиция слева), - по женским
именам (3я позиция слева), - по отчествам (4я позиция
слева).

В любой из этих позиций (2,3,4) могут стоять значения
0,1,2,3.

Эти значения означают для соотвествующей статистики
следующее:

0 - не выводить информацию, управляемую данной позицией,
1 - сортировать выводимые данные по алфавиту,
2 - каскадная сортировка по частоте+алфавиту,
3 - вывести данные и с сортировакой по алфавиту,
и с сортировкой по частоте + алфавиту.

Примеры:

./mw_names -1031 g* | less

# вывести сообщения по ходу выполнения программы (дублирование
# студентов, вышедших после перерыва в учебе, вторично,
# Лида Смирнова даже дважды прерывала обучение - отпуск по
# рождению ребенка и т.д. , чтобы повторный аккаунт одного i
# и того же человека не добавлял частоты его имени и отчества).
# Про мужские имена - ничего не выводить
# Про женские имена вывести в алфавитной сортировке и
# в каскадной сортировке (Убывание частоты+Алфавит)
# Про отчества вывести в алфавитной сортировке.


14. Знакомство с фильтром для отбора строк по заданному регулярному
выражению egrep RE и опция -f ФАЙЛ демонстрационной программы
mw_names.pl.

Получим список всех студентов с помощью опции -f ФАЙЛ:

./mw_names.pl -f allstuds g* | less

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

./mw_names.pl -f allstuds -0000 g* | less

Просмотрим полученный список всех обработанных ФИО:

less allstuds

Слева у каждой фамилии автоматически программа сформировала
идентификатор длиной 8 цифр - YYYYGGNN:

- 4 значный год поступления, - 2 цифры из номера группы -
40,42,44,45,49, - 2 значный номер студента в списке группы.

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

egrep Васили allstuds

или эквивалентно

cat allstud | egrep Васили

# увидим 8 Василиев

в первом случае утилита egrep откроет вводной файл, заданный
как аргумент в командной строке запуска утилиты и будет его
читать построчно;

во втором случае это сделает утилита сат и передавать на свой
STDOUT, который в командной строке запуска состыкован с STDIN
утилиты egrep.

В UNIX практически все утилиты, обрабатывающие вводные файлы,
заданные в виде аргументов в командной строке вызова, в том
случае если в командной строке нет таких аргументов ожидает
ввода данных для обработки с STDIN. Одной из таких утилит
является egrep, поэтому когда у нее нет ни одного аргумента
- вводного файла, она ждет строки для обработки из SDDIN, и
утилита cat даст ей на STDIN те же самые строки.

Но первым обязательным аргументом egrep, которые нельзя
опустить является регулярное выражение, задающее алгоритм
анализа входных строк. На свой STDOUT утилита egrep пропустит
очередную строку только в том случае, если регулярное выражение
в этой строке получит свое совпадение. В общем виде регулярное
выражение будем обозначать RE (от англ. Regular Expression).
Таким образом общий синтаксив вызова утилиты egrep будет
таким:

egrep RE [ФАЙЛ ...]

Квадратные скобки обозначают необязательность всех аргументов,
кроме первого RE. Многоточие обозначает, что аргументов-файлов
может быть несколько, их можно задать и с помощью шаблонов
имен файлов. Если файлов более одного egrep будет последовательно
открывать их и читать построчно. Но если ни одного аргумента-имени
файла не задано, будет читать свой STDIN. В любом случае egrep
сработает как фильтр - на свой STDOUT пропустить только те
строки, в которых найдет свое совпадение RE.

Простейшим RE является просто подстрока литерально представляющих
самих себя символов, как в примете с 'Васили'

А теперь попробуем выделить всех студентов по имени Петр:

cat allstuds | egrep Петр

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

cat allstuds | egrep ' Петр '

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

А как отобрать всех Петровых и мужчин и женщин. Можно, например,
так:

cat allstuds | egrep '[0-9] Петр'

RE совпадает с любой цифрой, за которой следует один пробел
и 4 символа "Петр".

А как отобрать всех Петровичей и Петровен. Можно, например,
так:

cat allstuds | egrep 'Петр[^ ]+$'

RE совпадает c 4мя символами "Петр",за котроыми следует
любой символ, кроме пробела '[^ ], и такие не-пробелы повторяются
один или более раз '+' и заканчиваются концом иследуемого
текста '$'.

Это уже достаточно сложное RE, но это далеко не единственное
возможное решение.

Этого достаточно для первого знакомства с RE.


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

15.1. Прямо в своем home сделайте поддиректорий search и перейдите в
него:
mkdir ~/search
cd ~/seatrch

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

ln -sv /cell/public/6sem/2011/lab/intr0_Str intr0
ln -sv /cell/public/6sem/2011/lab/du1_Str du1
ln -sv /cell/public/6sem/2011/lab/du2_Str du2
ln -sv /cell/public/6sem/2011/lab/du3_Str du3
ln -sv /cell/public/6sem/2011/lab/n1_Str n1
ln -sv /cell/public/6sem/2011/lec/start_0 start_0
ln -sv /cell/public/6sem/2011/lec/lithis_1 lithis_1
ln -sv /cell/public/6sem/2011/lec/base_2 base_2
ln -sv /cell/public/6sem/2011/lec/ufs_3 ufs_3
ln -sv /cell/public/6sem/2011/lec/vlfs_4 vlfs_4
ls -l

Например мы хотим найти в этих методичках информацию или примеры по
символическим ссылкам. Будем искать подстроку 'ln -s' во всех файлах
текущего директория, то есть во всех 10 файлах методичек, на которые
показывают символьные ссылки из текущего директория, все файлы текущего
директория зададим шаблоном имен файлов * :

egrep 'ln -s' * | less

В следующей команде использовано RE, которое будет совпадать и в том
случае если между "ln" и "-s" будет более одного пробела, потому что
после пробела стоиг метасимвол-квантификатор +, означающий повторение
предшествующего символа (т.е. пробела) один или более раз.

egrep 'ln +-s' * | less


16. Теперь вернемся к шаблонам имен файлов, которые часто путают
с RE, но это совершенно разные вещи:

* - любое число любых символов

? - один любой символ;

+ - один или более любых символов;

[246] - один символ, из тех, которые перечислены в кв.скобках;

[3-8] - все равно, что [345678];

[^01357-9] - один любой символ, кроме перечисленных в кв.скобках;

{aaa,bb,c??d} - любая из альтернатив.

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

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



17. Запуск программ, обработка файлов и интерактивные программы.


Как уже говорилось в данной методичке в п.11.B, запускаемая программа
или команда указывается в виде первого слова командной строки.
Запускаемый исполняемый файл может быть задан в командной строке
запуска маршрутным именем - это маршрут директория плюс базовое
имя исполняемого файла в этом директории. Маршрутная часть имени
может быть абсолютным маршрутом директория (от корня иерархической
системы) или относительным маршрутом (от текущего директория).
Базовая часть имени - это жесткая связь к inode исполняемого файла.
Если исполняемый файл размещен в текущем директории машрутная
часть его имени задается с помощью точки - имени которое имеется
всегда в любом директории с момента его создания - это . - жесткая
связь, указывающая на inode самого этого директория:

./prog.pl # запуск исполняемого файла из текущего директория

~/asimon/d0413/prog.pl # запуск исполняемого файла из любого
# директория по его абсолютному маршрутному
# имени

в этих примерах prog.pl - это базовая часть имени запускаемой
программы, его часто называют просто
базовым именем файла.

В файловой системе /cell в директории с методическими материалами
по курсу в поддиректории lab/progs/utils лежат несколько полезных
программ. Одна из них, koi8xtab.pl, выводит в STDOUT все символы
с кодами 0-127 (ASCII) и с кодами 128-255 (koi8r). Неотображаемые
управляющие символы с кодами K = 0-31 маппируются комбинацией
символа \c (при выводе) или Ctrl (^ - при вводе) и символа с кодом
K+64, неотображаемый символ с кодом 127 маппируется комбинацией
символа \ или ^ и символа с кодом K-64 == 127-64 == 63. Утилита
koi8xtab.pl коды символов представляет в 16-й форме (00-ff) по 16
символов в строке и умещает и ASCII и koi8r на одной экранной
странице без скроллинга (номер строки - это старшая 16-я цифра
кода, номер поля в строке - младшая 16-я цифра кода).

Там же имеется и еще одна утилита ikoi8r_10.pl выводящая в STDOUT
ту же таблицу, но представляющая коды символов в привычной 10-й
форме по 10 символов в строке, при этом нужно уже 25 строк номер
строки - это старшие 2 разряда 3-х значного кода 000-255, а номер
поля в строке - младший разряд кода. На одной экранной странице
такая таблица уже не уместится и нужно будет для листания
использовать конвеер с PAGER-ом less.


Запустим эти утилиты, используя маршрутные имена. Если вы в своем
HOME сделали symlink-и на директорий lab к методичкам лабораторных
работ, то:

~/lab/progs/utils/koi8xtab.pl
~/lab/progs/utils/koi8r_10.pl | less

Если symlink-ов нет, работа поскучнее:

/cell/public/6sem/2011/lab/progs/utils/koi8xtab.pl
/cell/public/6sem/2011/lab/progs/utils/koi8r_10.pl | less


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

echo $PATH

Для виртуального студента virtuu будет выдана следующая длинная
строка:

/sbin:/bin:/usr/sbin:/usr/bin:/usr/games:/usr/local/sbin:
/usr/local/bin:/cell/g4507/virtuu/bin

Разделителем полей является двоеточие, следовательно строка содержит
следующие 8 полей:

/sbin 1 - первоочередные системные утилиты
/bin 2 - первоочередные утилиты общего назначения
/usr/sbin 3 - остальные системные утилиты
/usr/bin 4 - остальные утилиты общего назначения
/usr/games 5 - интеллектуальные и полезные игры
/usr/local/sbin 6 - системный софт, установленный из пакетов
или портов FreeBSD
/usr/local/bin 7 - приложения, установленные из пакетов
или портов FreeBSD
/cell/g4507/virtuu/bin 8 - для личных команд и утилит пользователя

Последнее 8-е поле имеет у каждого студента различные значения и
задает директорий bin именно в его HOME, помещая в это директорий
программы, которые лично он часто использует, он фактически делает
свое личное расширение команд и утилит операционной системы.
Исполняемые файлы, помещенные в это директорий могут вызываться из
любого директория просто по своему базовому имени без маршрута. Они
также будут показываться и автодополняться оболочкой bash по клавише
Tab при наборе первого слова командной строки.

Создайте у себя в HOME поддиректорий ~/bin и скопируйте в него
эти утилиты:

mkdir -v ~/bin

cp -vp ~/lab/progs/utils/koi8* ~/bin/

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

Теперь можете вызывать любую из утилит koi8xtab.pl и koi8r_10.pl
из любого директория, даже не добирая имя до конца, а набрав
пару-тройку начальных символов и используя двойное и одинарное
нажатие клавиши Tab. Попробуйте из директория текущего дня,
из директория /tmp, из главного корня / и т.д. Не делайте текущим
директорий ~/bin - не замусоривайте его рабочими и черновыми файлами.
Помните - это расширение системы команд FreeBSD лично для вас,
здесь должны лежать ваши исполняемые файлы. Вы их владелец,
можете их подработать и отладить как считаете более удобным для себя.
Отладку проводите где-нибудь в диретории текущего дня занятий,
потом отлаженную версию скопируйте или переместите в ~/bin и это
ваша личная дополнительная команда FreeBSD.

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

Исходный код С этой программы лежит в методических материалах в
поддиректории lab/progs/c_prog, файл mntfs.c

cp -pv ~/lab/progs/c_prog/mntfs.c ~/d0421/

это копирование исходного кода С в директорий текущей даты (при
условии если в вашем HOME сделан symlink на директорий lab
методических материалов вашего семестра).

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

cd ~/d0421
ls -l
less mntfs.c

Компилятор С называется cc, имя вводного файла с исходным текстом
C-программы задается как аргумент командной строки запуска
компилятора. Опция для задания имени выводного исполняемого
бинарного файла -o ИМЯ_ИСПОЛНЯЕМОГО_ФАЙЛА. Если, к примеру, мы хотим
назвать исполняемый файл whichfs, то команда компиляции программы
с языка С, содержащейся в файле mntfs.c будет:

сс -o whichfs mntfs.c

На warnings, выводимые на экран через STDOUT, можно не обращать
внимания. Когда компилятор завершится, просмотрите результат его
работы - появившийся бинарный исполняемый файл, права на исполнение
(x) уже поставлены автоматически компилятором в соотвествии с вашей
текущей маской umask:

ls -l

Запустите на исполнение прорамму, задав любой существующий файл
как аргумент:

./whichfs /cell/g4007/winserv/public

Убедитесь, что программа выдала правильный результат. Если вы не
знаете, какой результат будет правильным, найдите соотвествующую
запись для данной файловой системы в выдаче команды df. Или
посмотрите как описана эта файловая система в файле описания
монтируемых систем /etc/fstab/. (Лучше сделайте и то, и другое).
Если программа работает правильно, то есть тестирование показало
правильный результат, переместите ее в состав ваших личных утилит:

mv -v whichfs ~/bin/


Теперь создайте свой поддиректорий в /tmp и запишите в него
какой-нибудь файл. Запишите какой-нибудь файл в этот директорий,
а потом определите в какой файловой системе лежит этот файл с
помощью этой новой личной утилиты:

mkdir /tmp/danoni

f > /tmp/danoni/tfile

whichfs /cell/g4007/winserv/public

#20100913 - du1_Str существенно обновлено Предисловие.
#20091019 du1_Str в Предисловии замена с1serv на winserv?
#20070902.2 du1_Str #20080901 - до п.1-4

ПРЕДИСЛОВИЕ.


Данная методическая разработка является одновременно и руководством
по выполнению лабораторных работ и содержит информацию теоретического
характера входящую в экзаменационные вопросы по курсу . Состоит
она из 4-х частей в 4-х файлах du1_Str, du2_Str, du3_Str и du4_Str,
размещенных в поддиректории lab/ . Кроме того, имеются еще
разработки преимущественно теретического характера, по UNIX и по
криптографическим методам защиты информации которые размещаются
в поддиректориях lec/unix/ -- по UNIX и lec/netsec/ -- по
защите. Методический материал, использовавшийся в прошлых годах,
содержится в поддиректориях public/7sem/2006/ и /2007/.
Оригинальным ведущимся экземпляром является методический материал
на UNIX-хосте, периодически он копируется в студенческие групповые
директории на сетевом диске Win2000-сервера, где элемент маршрутного
имени \7sem за ненадобностью упразднен.

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

Ни в коем случае не используйте кириллицу в именах файлах и папок,
при обработке из разных операционных систем такие имена превратятся
в крякозябры, а для некоторых утилит вообще станут недоступны для
обработки. Пробелы и символ дефиса в именах также вызывают
ненужные проблемы. Обычно для имен как файлов, так и папок
используются латинские буквы нижнего регистра и символ подчеркивания
(для разделения элементов имени вместо пробелов). Использование
верхнего регистра в именах ни к каким проблемам не приводит, но
если для этого нет веских причин, является признаком малого опыта
работы и дурного вкуса. Можно поднять в вехний регистр букву в
середине имени для выделения элемента имени вместо символа
подчеркивания (например директорий apacheDoc, содержащий документацию
по Web-серверу apache). Длинные имена возможны, но при работе
из командной строки начинают вызывать раздражениe, имя должно
максимально коротким, насколько возможно, чтобы не потерялась его
информативность.

В групповом директории на Win2000 создавайте только одну свою
личную папку, все нужное вам дерево папок растите в ней, вне ее
ничего никуда не пишите. Рекомендутеся назвать ее также, как ваш
login - первая буква имени и 5 букв фамилии, разумеется, все в
латинице. Например, для Елены Трубецкой это etrube. Это и
информативно, и быстро набирать в командной строке.

Папку в групповом директории можно создать и из UNIX-хоста, если
этот сетевой диск смонтирован по сети в его иерархическое дерево.
(должен быть всегда смонтирован, проверить можно командой df ,
если вдруг нет его, скажите преподавателю). Для Елены Кушиковой
командная строка создания личной папки в групповом директории
45-07 на Win2000-сервере при любом текущем директории следующая:

mkdir -v /cell/g4507/winserv/ekushi


Команда mkdir создает новый директорий (имя команды происходит
от make directory - создать директорий). Опция -v (от verbal -
разговорчивый) заставляет команду собщить об успешном выполнении,
без нее сообщения будут только в случае неуспеха.

Если текущим директорием является home (обозначается ~ ), то
можно это сделать и следующей командой:

mkdir -v ../winserv/ekushi

Допустим, Елену заинтересовали дополнительные методички по
процессам UNIX и по регулярным выражениям утилиты egrep,
размещенные в директории /cell/public/7sem/2010/add/
(файлы n1_Str и re45_Str). Она захотела их перевести в
Windows-кодировку русского текста cp1251 и скопировать на
свою флешку в виде .txt-файлов, чтобы во внеаудиторное время просмотреть их
в блокноте, либо в Notepad++, либо в Word. Она делает директорий,
где лежат эти файлы текущим (если в данный момент у нее
другой текущий директорий) следующей командой:

cd /cell/public/7sem/2010/add/

Команда cd изменяет текущий директорий, ее имя происходит от
change directory - изменить директорий. Теперь директорий,
содержащий интересующий Елену файл, стал текущим.
Командная строка для конвертирования кодировки этого файла из
KOI8_R в cp1251 и переделкой всех символов новой строки из однобайтового
кода 10 (LF), принятого во всех UNIX-ах в двубайтовый:

код 13 (CR) + код 10 (LF)

будет состоять из соединенных конвеером трех параллельно работающих
программ (процессов) cat, xcode, unix2dos. Утилита xcode занимается
конвертированием кодов кириллицы, а утилита unix2dos конвертиролванием
символов новой строки. Последняя утилита имеет два имени:

- если ее вызвать по имени dos2unix, она конвертирует символы
новой строки из принятых в WIN и DOS - в принятые в UNIX;

- если ее вызвать по имени unix2dos, она конвертирует символы
новой строки из принятых в UNIX - в принятые в WIN и DOS.

Вывод STDOUT последней в конвеере утилиты перенаправляется в файл
на жестком диске Win2000-сервера локальной сети дисплейного класса
1226, в личный поддиректорий Елены в сетевом директории группы,
откуда может быть скпирован на флешку:

cat n1.txt | xcode -w +k | unix2dos > /cell/g4507/winserv/ekushi/n1.txt

Второй файл и другие, ее интересующие файлы, аналогично могут быть
получены на ее флешку.

Команда cat вообще-то соединяет все файлы, имена которых заданы
аргументами командыш, и объединенное содержание направлеяет на
стандартный вывод STDOUT. Имя команды происходит от concatenate
- соединять. В нашем случае задан только один файл, его содержание
направлеяется на STDOUT. По умолчанию для STDOUT назначен экран
терминала, но вертикальная черта | (pipe -конвеер), на клавиатуре
сблокирована в верхнем регистре с \ вверху справа, обозначает,
что STDOUT левой команды без вывода на экран коммутируется со
стандартным вводом STDIN правой команды xcode. Утилита xcode
выполняет перекодировку кириллицы. Входная кодировка задается
опцией со знаком + (в отдельных случаях символ + используется
вместо дефиса для задания опции для протиаоположной функции.
В xcode дефис используется для задания выводной кодировки,
символ + для вводной кодировки), +k (от koi8-r) -w (от windows).
Более подробно см. help для xcode, послав команду

xcode -?

У пытливого студента возникнет вопрос, почему в этом Help
Macintosh выделен отдельно из всех остальных UNIX. Дело в том,
что у него единственного из всех UNIX символ новой строки
это однобайтный код 13 (CR). Может быть поэтому Билл Гейтс,
когда создавал первую операционную систему для персонального
компьютера MSDOS и заодно небольшую фирму MicroSoft, которая выросла
в теперешнего гиганта, никак не мог решить, какой же символ ему
использовать как символ новой строки: LF, как в тогдашнем UNIX
Berkley System Distribution (BSD), или CR, как в тогдашнем
компьютере фирмы Macintosh - решил использовать оба CR+LF
(это шутка, а не исторический факт).

Входную кодировку вообще-то может определить автоматически, но
иногда ошибается, когда в файле мало кириллицы и она встречается
не в начале файла. Кодировка кириллицы для UNIX - это koi8-r.
Опция -w (от Windows) задает выходную кодировку cp1251, принятую
для файлов с расширением .txt в Windows. Перекодированный результат
выводится на STDOUT, но на экран не попадает, поскольку следующая
| коммутирует его на STDIN следующей утилиты unix2dos. Эта утилита
заменяет все символы с кодом 10 (символ новой строки в UNIX) на
пару символов с кодами 13, 10 (двусимвольный признак новой строки
в WINDOS-е) и выводит результат на STDOUT.

Если мы уберем всю последующую часть командной строки, то увидим
результат на экране - по нему побегут крякозябры, поскольку это
кириллица уже не в кодировке koi8-r, на которую настроен вывод
на терминал.

Но далее следует символ > перенаправления STDOUT в файл, заданный
справа. Этот файл находится уже на сетевом диске сервера локальной
сети дисплейного класса 1226, управляемого операционной системой Windows.
Елена берет его на флешку и дома читает в WORD-е.

Существенное замечание. В имени результирующего файла используйте
расширение .txt, проще будет его открывать в WINDOWS. Если вы привыкли
читать WORD-ом, то открывайте сначала пустой WORD, а потом по меню
Файл -> Открыть и по обзору добирайтесь до него.

Примечание преподавателя.

Элемент маршрутного имени /cell/public/7sem/2007 (или 2006),
задающий год 2007 (или 2006) добавлен только с 2007 года, не везде
успел его вставить в последующие примеры. При наборе маррутов
используйте автодополнение (клавишу Tab) на каждом этапе маршрутного
имени. Сами сообразите где и что нужно вставить или изменить в примерах
методички.

Даже набирая команду (первое слово командной строки) нажимайте
дважды Tab после каждой буквы, включая первую. Пока вы не очень
хорошо помните и знаете написание имен основных команд это очень
и очень поможет. Заодно познакомитесь с полным набором утилит в
FreeBSD 7.2. Если наберете только одну первую буквы имени команды
и после нее дважды нажмете Tab, увидите имена всех команд,
начинающихся на данную букву, Дважды Tab после второй буквы
выдаст все команды, начинающиемся на эти две буквы. Постепенно
узнаете все 1030 команд в данной инсталляции FreeBSD.

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


ОСНОВЫ ОПЕРАЦИОННОЙ СИСТЕМЫ UNIX (FreeBSD) и ЗАЩИТА ИНФОРМАЦИИ.

( Часть 1.)

Интерактивная работа с `shell'. Файловая система.
Разграничение доступа. Простые утилиты работы с файлами.



1. Организация сеанса работы.

1.1. Введение

Работа студентов проводится в операционной системе FreeBSD на
удаленном хосте (хостами называются компьютеры, являющиеся узлами
IP-сети). К системе осуществляется сетевой доступ с удаленных
терминалов из дисплейного класса. Станции в дисплейном классе
функционируют под управлением WINDOWS. На каждой станции запускается
приложение под WINDOWS, являющееся клиентом терминального доступа,
работающего поверх протокола TCP (в настоящее время -- это протокол
`telnet', те же функции с большей безопасностью могут выполнять
протоколы `ssh' или `rsh'). Для связи с удаленным хостом задается
доменное имя (или IP-адрес) сетевого интерфейса этого хоста. На
удаленном хосте функционирует процесс-сервер сетевого доступа, с
которым устанавливается соединение. Получив запрос на установление
связи с системой, процесс-сервер выделяет в системе псевдотерминал,
связанный со станцией в дисплейном классе, в результате чего станция
становится удаленным терминалом UNIX-системы.

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

Если номер пункта оканчивается символом двоеточия (например 3.6.4:
, это означает что данный пункт требует конкретного выполнения на
компьютере во время занятий) Прочие пункты (например 4.1. ) требуют
предварительного внеаудиторного прочтения при подготовке к
лабораторной работе.

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

`протокол'://`хост':`логин':`пароль'

Элементы аккаунта:

- протокол - в настоящее время telnet (это информативный элемент
аккаунта, который не вводится)

- хост - IP-aдрес или имя (доменное Имя) удаленного хоста под
FreeBSD (в настоящее время это prison.kmstu.local); вводится
на первый вопрос клиента telnet (HOSTNAME:); поскольку хост
включен в тот же домен, что и рабочая станция (в корпоративной
сети KMSTUnet), можно вводить только имя хоста - prison

- логин - уникальное имя легального пользователя на удаленном
хосте
под FreeBSD, в настоящее время длина имени 6 символов
латинского алфавита в нижнем регистре. Логин составлен из
имени и фамилии студента, в некоторых случаях используется
и отчество. Вводится на второй вопрос клиента telnet (NAME:)

- пароль - в настоящее время длина пароля 8 символов: латинский
алфавит в верхнем и нижнем регистрах с соблюдением регистров
и цифры. Вводится на третий вопрос клиента telnet (PASSWORD:).
При вводе пароля курсор не перемещается и на экране никак
не отображается набор пароля на клавиатуре (отключается
эхо-отображение до завершения ввода пароля нажатием клавиши
Enter). Не путайте букву нижнего регистра l и цифру 1, также
букву верхнего регистра O и цифру 0.

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

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

s=`уровень'[j=`задания']:`логин':`маршрут':$

Элементы приглашения:

- уровень - уровень вложенности оболочки (интерпретатора команд)
bash,
для выхода из системы должен быть 1, если он 2 или более,
нужно выйти на уровень 1 при помощи команды exit, возвращающей
на предшествующий уровень. Для возврата на предшествующий
уровень число заданий должно быть 0 (см. `задания')

- задания - число заданий (job) на данном уровне оболочки bash.
Для
завершения сессии или возврата на предшествующий уровень
оболочки bash необходимо, чтобы заданий не было (j=0). Если
они имеются ( j >= 1), то нужно завершить последовательно все
задания, переводя их в интерактивный режим при помощи команды
`fg' и завершая процесс (если это просмотр или редактирование
текста, то командой утилиты просмотра `q' или редактора
`:wq').

- логин - ваш логин.

- маршрут - маршрут текущего директория. Для маршрута вашего
`home' используется обозначение `~' . Полный маршрут текущего
директория (в UNIX текущий директорий также называют рабочим
директорием) может быть выведен с помощью команды `pwd'

Сессия завершается командой `logout' при s=1 и j=0. При этом
проделанная Вами работа отражается в системе учета и оценки рейтинга.
При завершении сеанса любым другим способом, например закрытием
окна клиента telnet или завершениеам сеанса WINDOWS проделанная
работа может быть не отражена в системе учета и не войдет в
формирование вашего рейтинга.

Только после нормального завершения сессии командой `logout' можно
закрыть окно клиента telnet (Alt-x) и закрыть сеанс WINDOWS.


1.2. Обеспечение безопасности на лабораторных занятиях в дисплейном
классе.

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

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


Необходимо с самого начала работы в системе соблюдать следующие
правила безопасности:

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

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

3. Недопустимо оставлять на виду записку с вашим паролем, сообщать
его по секрету кому бы то ни было.

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

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

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

7. Пользуйтесь полноэкранным клиентом `telnet' (полностью весь
экран в текстовом режиме с буфером 25 строк на 80 колонок), не
пытайтесь использовать мышь, например скопировать через буфер
что-либо из любого окна WINDOWS в окно `telnet' -- это может
привести к сбою псевдотерминала и замусориванию вашего протокола
работы, либо к аварийному завершению псевдотерминала, разрыву
связи и пропаданию данного сеанса в истории команд (history).

8. Не нужно на занятиях работать в каких-либо WINDOWS-приложениях,
а также просматривать мультимедийные файлы (фотографии, фильмы,
аудио-файлы и т.д.), кроме копирования методических материалов
через сетевой диск WINDOWS-сервера на флешку или 3-дюймовые дискеты
Floppy-устройств рабочих станций.

Если вы установили на своем личном компьютере FreeBSD или работаете
еще где-либо под FreeBSD, или какие-то файлы для работы на занятиях
под FreeBSD вы готовите во внеаудиторное время под DOS или
WINDOWS, для переноса данных можно использовать флешку или
3-дюймовые дискеты, Floppy-устройства рабочих станций и ваш
групповой директорий на сетевом диске WINDOWS-сервера.

9. Запрещается устанавливать любые приложения, а также дублировать
ярлыки приложений, файлов и директориев. Сеанс начинается путем
вызова при помощи мыши иконки `tn' на рабочем столе, ввода доменного
имени FreeBSD-хоста, вашего `login' и пароля. Сеанс завершается
командой `logout' из среды `login-shell' (с первого уровеня
вложенности shell: в приглашении для ввода команды s=1) и при
отсуствии незавершеных заданий-job-ов (в приглашении для ввода
команды [j=0]). Уровни вложенности shell образуются при вызове
из shell-а bash : ш9затем, если вы вообще завершаете занятие,
то закройте окно `telnet' при помощи комбинации клавиш `Alt+x' и
далее, как обычно в WINDOWS `ПУСК-ЗАВЕРШЕНИЕ РАБОТЫ'. Если это
случай
Соседние файлы в предмете Операционные системы