|
||
Ответить |
|
#1
|
|
Вес репутации:
0
Регистрация: 27.02.2009
Адрес: Москва
Сообщений: 7,302
Сказал(а) спасибо: 578
Спасибок 2,623
в 1,832 сообщениях |
Основы Linux от основателя Gentoo. -
18.07.2010, 18:55
Часть 1 (1/4)
Предисловие Об этом руководстве Добро пожаловать в первую из четырех частей обучающего руководства по основам Linux, разработанного чтобы подготовить вас к сдаче экзамена Linux Professional Institute 101. В нем вы познакомитесь с bash (стандартной оболочкой командного интерпретатора в Linux), узнаете о большинстве возможностей таких стандартных команд Linux, как ls, cp и mv, разберетесь в инодах, жестких и символьных ссылках, и многом другом. К концу этого руководства у вас сформируется некий фундамент знаний, и вы будете готовы к изучению основ администрирования Linux. К концу всего курса (8 частей), у вас будет достаточно навыков, чтобы стать системным администратором Linux и пройти сертификацию LPIC Level 1 от Linux Professional Institute, если конечно захотите. Данная первая часть руководства отлично подходит для новичков в Linux, а также для тех пользователей, кто хочет освежить или улучшить свое понимание фундаментальных концепций Linux, таких, как копирование и перемещение файлов, создание символических и жестких ссылок, а также стандартных команд обработки текста, включая конвейеры и перенаправления. По ходу мы также дадим множество советов, подсказок и трюков, что делает это руководство насыщенным и практичным, даже для тех, кто уже имеет солидный опыт работы с Linux. Для начинающих большая часть этого материала будет новой, но более продвинутые пользователи Linux найдут это руководство отличным средством, чтобы разложить свои фундаментальные навыки по полочкам у себя в голове. Тем, кто изучал первую версию этого руководства с целью, отличной от подготовки к экзамену LPI, возможно, что вам не нужно его перечитывать. Однако, тем же, кто планирует сдавать экзамены, стоит обязательно просмотреть данную исправленную версию. Введение в bash Оболочка Если вы уже использовали Linux ранее, то наверняка знаете, что после входа в систему вас приветствует приглашение, которое выглядит примерно так: $ А у вас запущен bash? Вы можете убедиться, что используете bash, набрав: $ echo $SHELL /bin/bash О bash Bash — это акроним от Bourne-again-shell, от англ. «ещё-одна-командная-оболочка-Борна» или «рождённая-вновь-командная оболочка» (тут игра слов Bourne/born — прим. пер.), и является оболочкой по умолчанию для большинства Linux-систем. Задача оболочки получать от вас команды, через которые вы взаимодействуете с Linux-системой. После того, как вы закончили ввод команд, вы можете выйти из оболочки (exit) или закончить сеанс (logout), в этом случае вы увидите приглашение входа в систему. Кстати, вы также можете выйти из оболочки bash нажав control-D в приглашении. Использование «cd» Вы, возможно, уже обнаружили, что пялиться на приглашение bash — не самое впечатляющее занятие в мире. Ну что ж, давайте узнаем как путешествовать по нашей файловой системе. В приглашении введите пожалуйста следующую команду (без $): $ cd / Пути Чтобы узнать текущую рабочую директорию в bash нужно набрать: $ pwd / Абсолютные пути Ниже несколько из них: /dev /usr /usr/bin /usr/local/bin Относительные пути Другой тип пути называется «относительный путь». bash, cd, и другие команды всегда интерпретируют их относительно текущей директории. Относительные пути НИКОГДА не начинаются с /. Так, если мы сначала переместимся в /usr: $ cd /usr $ cd local/bin $ pwd /usr/local/bin Использование .. Относительные пути могут также содержать одну или более ".." директории. Директория ".." специальная; она указывает на родительскую директорию. Так, продолжая с примера выше: $ pwd /usr/local/bin $ cd .. $ pwd /usr/local Кроме того, мы также можем использовать ".." в существующем относительном пути, позволяющем нам переместиться в директорию «рядом» с той, в которой находимся: $ pwd /usr/local $ cd ../share $ pwd /usr/share Примеры относительных путей Относительные пути могут быть чуточку более сложными. Ниже несколько примеров, попробуйте самостоятельно догадаться, где вы окажитесь после набора каждой из этих команд. $ cd /bin $ cd ../usr/share/zoneinfo $ cd /usr/X11R6/bin $ cd ../lib/X11 $ cd /usr/bin $ cd ../bin/../bin Понимание . Перед тем как мы закончим изучение cd, есть несколько моментов, которые необходимо прояснить. Во-первых, есть еще одна специальная директория ".", которая означает «текущая директория». Хотя она и не используется с командой cd, но часто используется для выполнения программы из текущей директории, как в следующем примере: $ ./myprog cd и домашняя директория Если бы мы хотели переместиться в нашу домашнюю директорию, то могли бы набрать: $ cd $ ./myprog /home/drobbins/myfile.txt $ ./myprog ~/myfile.txt Другие домашние директории пользователей Bash воспримет одиночную ~ как указатель на вашу домашнюю директорию, но вы также можете использовать её для указания на домашние директории других пользователей. Например, если мы хотели сослаться на файл под названием fredsfile.txt в домашней директории пользователя fred, то могли бы набрать: $ ./myprog ~fred/fredsfile.txt Часть 1 (2/4) В данном отрывке рассмотрены команды работы с файловой системой и файлами, такие как ls, mkdir, touch, mv, cp, затронуто использование echo и cat. Рассказано про иноды файловой системы. Использование команд Linux Знакомство с ls А сейчас, мы быстренько пройдемся по команде ls. Скорее всего вы уже хорошо знакомы с этой командой, и знаете, что набрав ls получите список содержимого текущей рабочей директории: $ cd /usr $ ls X11R6 doc i686-pc-linux-gnu lib man sbin ssl bin gentoo-x86 include libexec portage share tmp distfiles i686-linux info local portage.old src $ ls -a . bin gentoo-x86 include libexec portage share tmp .. distfiles i686-linux info local portage.old src X11R6 doc i686-pc-linux-gnu lib man sbin ssl Вы также можете задать одну и более директорий или файлов в командной строке с ls. Если вы укажите файл, то ls покажет вам только этот файл. А если зададите директорию, то ls выдаст ее содержимое. Опция -l очень удобна, когда необходимо посмотреть права доступа, владельца, время последнего изменения и размер в списке содержимого директории. В следующем примере мы использовали опцию -l чтобы отобразить содержимое моей директории /usr: $ ls -l /usr drwxr-xr-x 7 root root 168 Nov 24 14:02 X11R6 drwxr-xr-x 2 root root 14576 Dec 27 08:56 bin drwxr-xr-x 2 root root 8856 Dec 26 12:47 distfiles lrwxrwxrwx 1 root root 9 Dec 22 20:57 doc -> share/doc drwxr-xr-x 62 root root 1856 Dec 27 15:54 gentoo-x86 drwxr-xr-x 4 root root 152 Dec 12 23:10 i686-linux drwxr-xr-x 4 root root 96 Nov 24 13:17 i686-pc-linux-gnu drwxr-xr-x 54 root root 5992 Dec 24 22:30 include lrwxrwxrwx 1 root root 10 Dec 22 20:57 info -> share/info drwxr-xr-x 28 root root 13552 Dec 26 00:31 lib drwxr-xr-x 3 root root 72 Nov 25 00:34 libexec drwxr-xr-x 8 root root 240 Dec 22 20:57 local lrwxrwxrwx 1 root root 9 Dec 22 20:57 man -> share/man lrwxrwxrwx 1 root root 11 Dec 8 07:59 portage -> gentoo-x86/ drwxr-xr-x 60 root root 1864 Dec 8 07:55 portage.old drwxr-xr-x 3 root root 3096 Dec 22 20:57 sbin drwxr-xr-x 46 root root 1144 Dec 24 15:32 share drwxr-xr-x 8 root root 328 Dec 26 00:07 src drwxr-xr-x 6 root root 176 Nov 24 14:25 ssl lrwxrwxrwx 1 root root 10 Dec 22 20:57 tmp -> ../var/tmp Смотрим на директории Иногда вы захотите взглянуть на директорию, а не внутрь нее. В этом случае вы можете указать опцию -d, которая скажет ls рассматривать любую директорию, как внутреннюю: $ ls -dl /usr /usr/bin /usr/X11R6/bin ../share drwxr-xr-x 4 root root 96 Dec 18 18:17 ../share drwxr-xr-x 17 root root 576 Dec 24 09:03 /usr drwxr-xr-x 2 root root 3192 Dec 26 12:52 /usr/X11R6/bin drwxr-xr-x 2 root root 14576 Dec 27 08:56 /usr/bin Так вы можете использовать -d чтобы смотреть на директорию, но также можно использовать -R для противоположного: не только лишь глянуть внутрь директории, но и рекурсивно посмотреть все директории с файлами внутри нее! Мы не включим в руководство никакого примера вывода для этой опции (поскольку обычно он очень объемный), но возможно вы захотите попробовать несколько команд ls -R и ls -Rl, чтобы почувствовать как это работает. Наконец, опция -i может использоваться для отображения числа инодов для объектов в списке файловой системы: $ ls -i /usr 1409 X11R6 314258 i686-linux 43090 libexec 13394 sbin 1417 bin 1513 i686-pc-linux-gnu 5120 local 13408 share 8316 distfiles 1517 include 776 man 23779 src 43 doc 1386 info 93892 portage 36737 ssl 70744 gentoo-x86 1585 lib 5132 portage.old 784 tmp Каждому объекту файловой системы назначен уникальный индекс, называемый номером инода. Это может показаться банальным, но понятие инодов очень важно для понимания большинства операций в файловой системе. Рассмотрим например ссылки "." и "..", которые появляются в каждой директории. Чтобы полностью понять, чем на самом деле является директория "..", мы сперва взглянем на номер инода у /usr/local: $ ls -id /usr/local 5120 /usr/local $ ls -id /usr/local/bin/.. 5120 /usr/local/bin/.. На самом деле, мы даже можем увидеть общее количество ссылок ведущих на этот, 5120 инод, используя команду ls -dl: $ ls -dl /usr/local drwxr-xr-x 8 root root 240 Dec 22 20:57 /usr/local /usr/local /usr/local/. /usr/local/bin/.. /usr/local/games/.. /usr/local/lib/.. /usr/local/sbin/.. /usr/local/share/.. /usr/local/src/.. Давайте быстренько пройдемся по команде mkdir, которая используется для создания новых директорий. Следующий пример создает три новых директории, tic, tac, и toe, все внутри /tmp: $ cd /tmp $ mkdir tic tac toe $ mkdir won/der/ful mkdir: cannot create directory `won/der/ful': No such file or directory $ mkdir won $ mkdir won/der $ mkdir won/der/ful $ mkdir -p easy/as/pie touch Сейчас мы собираемся окинуть взглядом команды cp и mv, используемые для копирования, переименования и перемещения файлов и директорий. Но начнем обзор воспользовавшись командой touch, чтобы создать файл в /tmp: $ cd /tmp $ touch copyme echo Теперь, когда файл существует, давайте добавим немного данных в него. Можно сделать это с помощью команды echo, которая принимает аргументы и печатает их на стандартный вывод. Сперва, команда echo сама по себе: $ echo "firstfile" firstfile $ echo "firstfile" > copyme $ ls -l copyme -rw-r--r-- 1 root root 10 Dec 28 14:13 copyme Чтобы вывести содержимое файла на терминал, используйте команду cat: $ cat copyme firstfile $ cp copyme copiedme $ ls -i copyme copiedme 648284 copiedme 650704 copyme А сейчас давайте воспользуемся командой mv для переименования copiedme в movedme. Номер иноды останется прежний; однако, имя файла, указывающее на инод, изменится. $ mv copiedme movedme $ ls -i movedme 648284 movedme Пока мы рассказываем об mv, давайте посмотрим, как еще можно использовать эту команду. mv, помимо возможности переименовать файлы, позволяет перемещать один или более файлов в другое место в иерархии директорий. Например, чтобы переместить /var/tmp/myfile.txt в директорию /home/drobbins (которая является моей домашней), я наберу (а мог бы вопсользоваться ~ — прим. пер.): $ mv /var/tmp/myfile.txt /home/drobbins Мы также можем воспользоваться mv для перемещения нескольких файлов в одну директорию. К примеру, чтобы переместить myfile1.txt и myarticle3.txt в /home/drobbins, потребуется набрать: $ mv /var/tmp/myfile1.txt /var/tmp/myarticle3.txt /home/drobbins <!-- Вопросы задаем на форуме, не в ЛС --> |
#2
|
|
Вес репутации:
0
Регистрация: 27.02.2009
Адрес: Москва
Сообщений: 7,302
Сказал(а) спасибо: 578
Спасибок 2,623
в 1,832 сообщениях |
21.07.2010, 13:48
Часть 1 (3/4)
В этом отрывке рассмотрены жесткие и символьные ссылки, а также разобрано удаление файлов и директорий с помощью команд rm и rmdir. Создание ссылок и удаление файлов Жесткие ссылки Мы уже упоминали термин «ссылка», когда рассказывали о взаимоотношениях между директориями (их именами) и инодами (индексным номерами, лежащими в основе файловой системы, которых мы не замечаем). Вообще в Linux существует два типа ссылок. Тип, о котором мы уже говорили ранее, называется «жесткие ссылки». Каждый инод может иметь произвольное число жестких ссылок. Когда уничтожается последняя жесткая ссылка, и не одна программа не держит файл открытым, то Linux автоматически удаляет его. Новые жесткие ссылки можно создать воспользовавшись командой ln: $ cd /tmp $ touch firstlink $ ln firstlink secondlink $ ls -i firstlink secondlink 15782 firstlink 15782 secondlink Символьные ссылки В практике, символьные ссылки (или символические, иногда «симлинки» — от англ.) используются гораздо чаще, чем жесткие. Симлинки — это файлы особого типа, которые ссылаются на другие файлы по имени, а не прямо по номеру инода. Они не спасают файлы от удаления; если файл, на который указывает ссылка, исчезает, то симлинк перестает работать, ломается. Символические ссылки можно создать передав для ln опцию -s. $ ln -s secondlink thirdlink $ ls -l firstlink secondlink thirdlink -rw-rw-r-- 2 agriffis agriffis 0 Dec 31 19:08 firstlink -rw-rw-r-- 2 agriffis agriffis 0 Dec 31 19:08 secondlink lrwxrwxrwx 1 agriffis agriffis 10 Dec 31 19:39 thirdlink -> secondlink Симлинки детально Символические ссылки в целом более гибкие, чем жесткие. Вы можете создавать символьные ссылки на любой объект файловой системы, включая директории. И благодаря тому, что их реализация основана на путях (не инодах), можно совершенно свободно создать символьную ссылку указывающую на объект другой файловой системы. Однако, сей факт также делает их сложными в понимании. Предположим, что мы хотим создать ссылку в /tmp, которая указывает на /usr/local/bin. Нам следует набрать: $ ln -s /usr/local/bin bin1 $ ls -l bin1 lrwxrwxrwx 1 root root 14 Jan 1 15:42 bin1 -> /usr/local/bin $ ln -s ../usr/local/bin bin2 $ ls -l bin2 lrwxrwxrwx 1 root root 16 Jan 1 15:43 bin2 -> ../usr/local/bin $ ls -l bin2 lrwxrwxrwx 1 root root 16 Jan 1 15:43 bin2 -> ../usr/local/bin $ mkdir mynewdir $ mv bin2 mynewdir $ cd mynewdir $ cd bin2 bash: cd: bin2: No such file or directory По этой причине, избегать создания ссылок с относительной информацией о пути, иногда будет хорошей идеей. Тем не менее, существует множество случаев, где относительные символические ссылки крайне удобны. Рассмотрим пример в котором мы хотим создать альтернативное имя для программы в /usr/bin: # ls -l /usr/bin/keychain -rwxr-xr-x 1 root root 10150 Dec 12 20:09 /usr/bin/keychain # cd /usr/bin # ln -s /usr/bin/keychain kc # ls -l keychain -rwxr-xr-x 1 root root 10150 Dec 12 20:09 /usr/bin/keychain # ls -l kc lrwxrwxrwx 1 root root 17 Mar 27 17:44 kc -> /usr/bin/keychain Пока это решение будет работать, но создаст проблему, если мы решим переместить оба файла, /usr/bin/keychain и /usr/bin/kc в /usr/local/bin: # mv /usr/bin/keychain /usr/bin/kc /usr/local/bin # ls -l /usr/local/bin/keychain -rwxr-xr-x 1 root root 10150 Dec 12 20:09 /usr/local/bin/keychain # ls -l /usr/local/bin/kc lrwxrwxrwx 1 root root 17 Mar 27 17:44 kc -> /usr/bin/keychain Это привело к тому, что симлинк kc сейчас не работает. Как относительные, так и абсолютные пути в символьных ссылках имеют свои достоинства, и, в зависимости от вашей задачи, нужно использовать соответствующий тип пути. Часто, и относительный, и абсолютный путь, будут работать одинаково хорошо. Пример ниже будет работать, даже после перемещения обоих файлов: # cd /usr/bin # ln -s keychain kc # ls -l kc lrwxrwxrwx 1 root root 8 Jan 5 12:40 kc -> keychain # mv keychain kc /usr/local/bin # ls -l /usr/local/bin/keychain -rwxr-xr-x 1 root root 10150 Dec 12 20:09 /usr/local/bin/keychain # ls -l /usr/local/bin/kc lrwxrwxrwx 1 root root 17 Mar 27 17:44 kc -> keychain rm Итак, мы знаем как использовать cp, mv и ln, настало время узнать о том, как можно удалять объекты из файловой системы. Обычно это делается с помощью команды rm. Чтобы удалить файлы, просто укажите их в командной строке: $ cd /tmp $ touch file1 file2 $ ls -l file1 file2 -rw-r--r-- 1 root root 0 Jan 1 16:41 file1 -rw-r--r-- 1 root root 0 Jan 1 16:41 file2 $ rm file1 file2 $ ls -l file1 file2 ls: file1: No such file or directory ls: file2: No such file or directory $ rm -i file1 file2 rm: remove regular empty file `file1'? y rm: remove regular empty file `file2'? y Если вы все еще учитесь пользоваться командой rm, то может быть полезным добавить при помощи вашего любимого текстового редактора следующую строку в ваш файл ~/.bashrc, и затем выйти (logout) и войти (login) в систему вновь. После этого, всякий раз, когда вы наберете rm, оболочка bash преобразует ее автоматически в команду rm -i. Таким образом, rm будет всегда работать в интерактивном режиме: alias rm="rm -i" Для удаления директорий у вас имеется два варианта. Вы можете удалить все объекты внутри директории и затем воспользоваться rmdir для удаления самой директории: $ mkdir mydir $ touch mydir/file1 $ rm mydir/file1 $ rmdir mydir Самый лучший способ удалить директорию состоит в использовании опций «рекурсивного принуждения» (recursive force) команды rm, чтобы приказать ей удалять указанную директорию, также как и объекты содержащиеся внутри: $ rm -rf mydir |
#3
|
|
Вес репутации:
0
Регистрация: 27.02.2009
Адрес: Москва
Сообщений: 7,302
Сказал(а) спасибо: 578
Спасибок 2,623
в 1,832 сообщениях |
22.07.2010, 23:49
Часть 1 (4/4)
В данном, четвертом, отрывке рассматривается использование джокеров (wild cards) *, [] и ? для подставления путей по шаблону. Использование джокеров Знакомство с джокерами В повседневном использовании Linux часто случается, когда вам нужно выполнить единичную операцию (например rm) на множестве объектов файловой системы за раз. В подобных ситуациях вписывать множество файлов в командную строку, зачастую, довольно обременительно: $ rm file1 file2 file3 file4 file5 file6 file7 file8 $ rm file[1-8] $ rm file* Неподходящие шаблоны Если вам необходимо перечислить все объекты файловой системы в /etc, начинающиеся с «g», а также сам g, то можно ввести: $ ls -d /etc/g* /etc/gconf /etc/ggi /etc/gimp /etc/gnome /etc/gnome-vfs-mime-magic /etc/gpm /etc/group /etc/group- $ ls -d /usr/bin/asdf*jkl ls: /usr/bin/asdf*jkl: No such file or directory Синтаксис джокеров: * и ? Так, мы уже посмотрели как работает globbing, теперь же стоит рассмотреть синтаксис джокеров. В качестве джокеров используются специальные символы: * — совпадает с нулевым или большим количеством символов. Это значит: «тут может быть все что угодно, включая и ничего». Примеры:
? — равен любому одному символу. Примеры:
Этот джокер похож на ?, но более точен. Чтобы его использовать, поместите любые символы, какие вам нужны, внутрь []. Полученное выражение будет удовлетворять любому одному из этих символов. Вы также можете воспользоваться "-", для указания диапазона, и даже комбинации диапазонов. Примеры:
Конструкция [!] эквивалентна конструкции [], за исключением того, что вместо совпадения с символами внутри скобок, она удовлетворяет любому символу, который НЕ перечислен между [! и ]. Пример:
Сейчас несколько предостережений, чтобы быть осторожными во время использования джокеров. Поскольку bash обрабатывает относящиеся к джокерам символы (?, [, ] и *) особым образом, вам надо особенно позаботиться, когда вы пишите аргумент для команды, содержащий эти символы. Например, если вы хотите создать файл, содержащий строку "[fo]*", то следующая команда может не дать желаемого результата: $ echo [fo]* > /tmp/mynewfile.txt $ echo '[fo]*' > /tmp/mynewfile.txt $ echo \[fo\]\* > /tmp/mynewfile.txt Примечание: Двойные кавычки работают также как и одиночные, но всё еще разрешают bash делать некоторую ограниченную обработку. Следовательно, одиночные кавычки — ваш лучший выбор, если вы действительно заинтересованны в буквальной передаче текста в команду. Получить больше информации о раскрытии джокеров можно набрав man 7 glob. Чтобы получить больше информации о кавычках в bash, наберите man 8 glob и прочитайте раздел под названием QUOTING. Если в ваши планы входит сдача экзаменов LPI, то рассматривайте это как свое домашнее задание. |
#4
|
|
Вес репутации:
0
Регистрация: 27.02.2009
Адрес: Москва
Сообщений: 7,302
Сказал(а) спасибо: 578
Спасибок 2,623
в 1,832 сообщениях |
14.12.2010, 02:32
Часть 2 (1/5): Регулярные выражения
Предисловие: Эта часть самоучителя (Часть 2) идеальна для тех, кто уже имеет неплохие базовые знания bash и хочет получить качественное введение в основные задачи администрирования Linux. Если в Linux вы новичок, мы рекомендуем вам сперва закончить первую часть (см. выше) данной серии практических руководств. Для некоторых, большая часть данного материала будет новой, более опытные же пользователи Linux могут счесть его отличным средством подвести итог своим базовым навыкам администрирования. Если вы изучали первый выпуск данного самоучителя с целью, отличной от подготовки к экзамену LPI, то вам, возможно, не нужно перечитывать этот выпуск. Однако, если вы планируете сдавать экзамен, то вам настоятельно рекомендуются перечитать данную, пересмотренную версию самоучителя. Регулярные выражения Что такое «регулярное выражение»? Регулярное выражение (по англ. regular expression, сокр. «regexp» или «regex», в отечестве иногда зовется «регулярка» — прим. пер.) — это особый синтаксис используемый для описания текстовых шаблонов. В Linux-системах регулярные выражения широко используются для поиска в тексте по шаблону, а также для операций поиска и замены на текстовых потоках. В сравнении с глоббингом Как только мы начнем рассматривать регулярные выражения, возможно вы обратите внимание, что их синтаксис очень похож на синтаксис подстановки имен файлов (globbing), который мы рассматривали в первой части. Однако, не стоит заблуждаться, эта схожесть очень поверхностна. Регулярные выражения и глоббинг-шаблоны, даже когда они выглядят похоже, принципиально разные вещи. Простая подстрока После этого предостережения, давайте рассмотрим самое основное в регулярных выражениях, простейшую подстроку. Для этого мы воспользуемся «grep», командой, которая сканирует содержимое файла согласно заданному регулярному выражению. grep выводит каждую строчку, которая совпадает с регулярным выражением, игнорируя остальные: $ grep bash /etc/passwd operator:x:11:0:operator:/root:/bin/bash root:x:0:0::/root:/bin/bash ftp:x:40:1::/home/ftp:/bin/bash Понимание простой подстроки В общем случае, если вы ищите подстроку, вы просто можете указать её буквально, не используя каких-либо «специальных» символов. Вам понадобиться особо позаботиться, только если ваша подстрока содержит +, ., *, [, ] или \, в этом случае эти символы должны быть экранированы обратным слешем, а подстрока заключаться в кавычки. Вот несколько примеров регулярных выражений в виде простой подстроки:
С помощью регулярных выражений используя метасимволы возможно осуществлять гораздо более сложный поиск, чем в примерах, которые недавно рассматривали. Один из таких метасимволов "." (точка), который совпадает с любым единичным символом: $ grep dev.sda /etc/fstab /dev/sda3 / reiserfs noatime,ro 1 1 /dev/sda1 /boot reiserfs noauto,noatime,notail 1 2 /dev/sda2 swap swap sw 0 0 #/dev/sda4 /mnt/extra reiserfs noatime,rw 1 1 Использование [] Если мы хотим задать символ конкретнее, чем это делает ".", то можем использовать [ и ] (квадратные скобки), чтобы указать подмножество символов для сопоставления: $ grep dev.sda[12] /etc/fstab /dev/sda1 /boot reiserfs noauto,noatime,notail 1 2 /dev/sda2 swap swap sw 0 0 Использование [^] Вы можете обратить значение квадратных скобок поместив ^ сразу после [. В этому случае скобки будут соответствовать любому символу который НЕ перечислен внутри них. И опять, заметьте что [^] мы используем с регулярными выражением, а [!] с glob: $ grep dev.hda[^12] /etc/fstab /dev/hda3 / reiserfs noatime,ro 1 1 #/dev/hda4 /mnt/extra reiserfs noatime,rw 1 1 Отличающийся синтаксис Очень важно отметить, что синтаксис внутри квадратных скобок коренным образом отличается от остальной части регулярного выражения. К примеру, если вы поместите "." внутрь квадратных скобок, это позволит квадратным скобкам совпадать с "." буквально, также как 1 и 2 в примере выше. Для сравнения, "." помещенная вне квадратных скобок, будет интерпретирована как метасимвол, если не приставить "\". Мы можем получить выгоду из данного факта для вывода строк из /etc/fstab которые содержат строку dev.sda, как она записана: $ grep dev[.]sda /etc/fstab $ grep "dev\.sda" /etc/fstab Матасимвол * Некоторые метасимволы сами по себе не соответствуют ничему, но изменяют значение предыдущего символа. Один из таких символов, это * (звездочка), который используется для сопоставления нулевому или большему числу повторений предшествующего символа. Заметьте, это значит, что * имеет другое значение в регулярках, нежели в глоббинге. Вот несколько примеров, и обратите особое внимание на те случаи где сопоставление регулярных выражений отличается от glob-подстановок:
Начало и конец строки Последние метасимволы, что мы детально рассмотрим, это ^ и $, которые используются для сопоставления началу и концу строки, соответственно. Воспользовавшись ^ в начале вашего regex, вы «прикрепите» ваш шаблон к началу строки. В следующем примере, мы используем регулярное выражение ^#, которое удовлетворяет любой строке начинающийся с символа #: $ grep ^# /etc/fstab # /etc/fstab: static file system information. # ^ и $ можно комбинировать, для сопоставлений со всей строкой целиком. Например, нижеследующая регулярка будет соответствовать строкам начинающимся с символа #, а заканчивающимся символом ".", при произвольном количестве символов между ними: $ grep '^#.*\.$' /etc/fstab # /etc/fstab: static file system information. Часть 2 (2/5): Назначения папок, поиск файлов В данном отрывке рассказано о стандарте иерархии файловой системы (FHS), почему директории так называются и для чего они нужны. Упомянута переменная окружения PATH и разобраны основные команды для поиска файлов в системе, такие как whereis, find и locate (slocate). FHS и поиск файлов Стандарт иерархии файловой системы Стандарт иерархии файловой системы (Filesystem Hierarchy Standard или сокр. FHS) — это документ который определяет схему директорий в Linux-системах. FHS разработан чтобы представить общую схему для упрощения независимой от дистрибутива разработки программного обеспечения, поскольку так все необходимое располагается одинаково в большинстве дистрибутивов. FHS определяет следующее дерево директорий (взято непосредственно из спецификации):
Спецификация FHS основывается на идее существования двух независимых классификаций файлов: разделяемые и не разделяемые, а также изменяемые и статичные. Разделяемые данные могут распределятся на несколько хостов; не разделяемые специфичны для конкретного хоста (как, например, конфигурационные файлы). Изменяемые данные могут изменяться; статичные не изменяются (за исключением установки и обслуживания системы). Нижеследующая табличка резюмирует четыре возможные комбинации, с примерами директорий, которые попадают в данные категории. Опять же, эта таблица прямо из спецификации: PHP код:
Внутри /usr вы обнаружите вторичную иерархию, которая выглядит очень похоже на корневую файловую систему. Для /usr не критично существование во время включения машины, она может быть общим сетевым ресурсом (разделяемаz) или примонтирована с CD-ROM (статична). Большинство конфигурация Linux не используют «разделяемость» /usr, но ценно понимать полезность отличия между основной иерархией в корневой директории и вторичной иерархией в /usr. Это все, что мы расскажем о стандарте иерархии файловой системы. Сам по себе документ довольно читабелен и вам стоит на него взглянуть. После его прочтения вы будете гораздо лучше понимать файловую систему Linux. Найти спецификацию можно здесь: http://www.pathname.com/fhs/. Поиск файлов Linux-системы зачастую содержат сотни тысяч файлов. Возможно, что вы достаточно умны, что никогда не теряете из виду ни один из них, но гораздо вероятнее, что временами вам требуется помощь для нахождения какого-либо файла. Для этого в Linux есть несколько разнообразных средств. Это введение поможет вам выбрать подходящее для решения вашей задачи. PATH Когда вы запускаете программу из командной строки, bash начинает просматривать список директорий в поисках программы которую вы указали. Например, когда вы вводите ls, bash в действительности не знает, что программа ls находится в /usr/bin. Вместо этого, он ссылается на переменную окружения называемую PATH, которая содержит список директорий разделенных двоеточием. Мы можем проверить значение PATH: $ echo $PATH /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/X11R6/bin. Изменение PATH Вы можете расширять переменную PATH, присваивая ей новое значение в командой строке: $ PATH=$PATH:~/bin $ echo $PATH /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/X11R6/bin:/home/agriffis/bin $ PATH=/usr/local/bin:/usr/bin:/bin:/usr/X11R6/bin:~/bin $ echo $PATH /usr/local/bin:/usr/bin:/bin:/usr/X11R6/bin:/home/agriffis/bin $ export PATH Вы можете проверить, есть ли конкретная программа в вашем PATH используя which. В следующем примере мы видим, в каталогах PATH нашей системы, программы с названием sense нет: $ which sense which: no sense in (/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/X11R6/bin) $ which ls /usr/bin/ls Наконец, вы должны знать о флаге -a, который укажет which показать вам все экземпляры программы в PATH: $ which -a ls /usr/bin/ls /bin/ls Если вам необходимо больше информации о программе, чем просто ее расположение, вы можете воспользоваться командой whereis: $ whereis ls ls: /bin/ls /usr/bin/ls /usr/share/man/man1/ls.1.gz Программа whereis может использоваться для поиска расположения исходников и нестандартного поиска (имеется ввиду возможность искать файлы для которых отсутствуют маны, исходники или бинарники — прим. пер.). Также ей можно указать альтернативные пути для поиска. Обратитесь к man-странице для получения дополнительной информации. find Команда find это другой удобный инструмент в вашем арсенале. Используя find вы не ограничены лишь поиском программ; вы можете искать любые типы файлов, используя различные критерии поиска. Например, поищем в директории /usr/share/doc, файл который называется README: $ find /usr/share/doc -name README /usr/share/doc/ion-20010523/README /usr/share/doc/bind-9.1.3-r6/dhcp-dynamic-dns-examples/README /usr/share/doc/sane-1.0.5/README Вы можете использовать glob-шаблоны для аргументов -name, при условии что вы экранируете их кавычками или обратным слешем (таким образом они будут переданы команде в нетронутом виде, иначе они сначала будут развернуты bash'ем и уже после переданы команде). Давайте поищем все файлы README с расширением: $ find /usr/share/doc -name README\* /usr/share/doc/iproute2-2.4.7/README.gz /usr/share/doc/iproute2-2.4.7/README.iproute2+tc.gz /usr/share/doc/iproute2-2.4.7/README.decnet.gz /usr/share/doc/iproute2-2.4.7/examples/diffserv/README.gz /usr/share/doc/pilot-link-0.9.6-r2/README.gz /usr/share/doc/gnome-pilot-conduits-0.8/README.gz /usr/share/doc/gimp-1.2.2/README.i18n.gz /usr/share/doc/gimp-1.2.2/README.win32.gz /usr/share/doc/gimp-1.2.2/README.gz /usr/share/doc/gimp-1.2.2/README.perl.gz [еще 578 строк опущено] Конечно, вы можете игнорировать регистр при поиске: $ find /usr/share/doc -name '[Rr][Ee][Aa][Dd][Mm][Ee]*' $ find /usr/share/doc -iname readme\* find и регулярные выражения Если вы знакомы с регулярными выражениями, вы можете использовать опцию -regex для поиска файлов с именами соответствующими шаблону. А также опцию похожую на -iname, которая называется -iregex и заставляет find игнорировать регистр в шаблоне. Пример: $ find /etc -iregex '.*xt.*' /etc/X11/xkb/types/extra /etc/X11/xkb/semantics/xtest /etc/X11/xkb/compat/xtest /etc/X11/app-defaults/XTerm /etc/X11/app-defaults/XTerm-color find и типы файлов Опция -type позволяет искать в файловой системе файлы определенного типа. Возможные аргументы для -type это: b (блочное устройство), c (символьное устройство), d (директория), p (именованый канал), f (обычный файл), l (символическая ссылка), и s (сокет). Например, поиск символической ссылки в /usr/bin, которая содержит в своем имени строку vim: $ find /usr/bin -name '*vim*' -type l /usr/bin/rvim /usr/bin/vimdiff /usr/bin/gvimdiff Опция -mtime позволяет вам искать файлы основываясь на дате их последней модификации. Аргументом mtime является количество 24-часовых периодов, и наиболее полезным будет указывать перед аргументом плюс (означает «после») или минус (означает «перед»). Например, рассмотрим следующий сценарий: $ ls -l ? -rw------- 1 root root 0 Jan 7 18:00 a -rw------- 1 root root 0 Jan 6 18:00 b -rw------- 1 root root 0 Jan 5 18:00 c -rw------- 1 root root 0 Jan 4 18:00 d $ date Tue Jan 7 18:14:52 EST 2003 $ find . -name \? -mtime -1 ./a $ find . -name \? -mtime +0 ./b ./c ./d Если вы дополнительно укажете опцию -daystart, периоды времени будут отсчитываться от начала сегодняшнего дня, а не от текущего времени. Например, здесь файлы созданные вчера и позавчера: $ find . -name \? -daystart -mtime +0 -mtime -3 ./b ./c $ ls -l b c -rw------- 1 root root 0 May 6 18:00 b -rw------- 1 root root 0 May 5 18:00 c Опция -size позваляет искать файлы по их размеру. По-умолчанию, аргумент -size это количество 512-байтных блоков, но добавляя к опции суффикс, можно сделать вывод более понятным. Доступные суффиксы: b (512-байтные блоки), c (байт), k (килобайт), и w (2-байтные слова). Дополнительно, перед аргументом можно указать плюс («больше чем») или минус («меньше чем»). Например, для поиска обычного файла в /usr/bin размер которого меньше 50 байт: $ find /usr/bin -type f -size -50c /usr/bin/krdb /usr/bin/run-nautilus /usr/bin/sgmlwhich /usr/bin/muttbug Вы даже не представляете, что можно делать с найденными файлами! Итак, find может производить любые действия над файлами используя опцию -exec. Эта опция принимает строку команд для выполнения, которая оканчивается на ;, и заменяет все вхождения {} именем файла. Это проще всего понять на примере: $ find /usr/bin -type f -size -50c -exec ls -l '{}' ';' -rwxr-xr-x 1 root root 27 Oct 28 07:13 /usr/bin/krdb -rwxr-xr-x 1 root root 35 Nov 28 18:26 /usr/bin/run-nautilus -rwxr-xr-x 1 root root 25 Oct 21 17:51 /usr/bin/sgmlwhich -rwxr-xr-x 1 root root 26 Sep 26 08:00 /usr/bin/muttbug locate Мы уже рассмотрели which, whereis и find. Как вы уже наверно заметили, выполнение find может занять некоторое время, т.к. ей необходимо прочитать каждую директорию в которой выполняется поиск. Оказывается, что команда locate может ускорить процесс использую внешнюю базу данных, генерируемую updatedb (updatedb мы рассмотрим ниже). Команда locate ищет совпадения любой части пути, а не только самого файла. Пример: $ locate bin/ls /var/ftp/bin/ls /bin/ls /sbin/lsmod /sbin/lspci /usr/bin/lsattr /usr/bin/lspgpot /usr/sbin/lsof Во многих Linux системах есть «cron job» для периодического обновления базы. В случае если вызов locate вернул нижеописанную ошибку, вам необходимо запустить updatedb от root'а для генерации поисковой базы: $ locate bin/ls locate: /var/spool/locate/locatedb: No such file or directory $ su - Password: # updatedb slocate Во многих Linux дистрибутивах, утилита locate была заменена на slocate. Как правило существует также ссылка на locate, так что вам не нужно запоминать, что именно имеется в системе. slocate означает «безопасный locate» (от англ. secure locate — прим. пер.). Он сохраняет информацию о правах доступа в поисковой базе, так что, обычные пользователи не смогут увидеть директории, которые они и так не смогли бы видеть. Используется slocate точно также как locate, но вывод программы может быть различными в зависимости от пользователя ее запустившего. Добавлено через 11 минут Часть 2 (3/5): Управление процессами В этом отрывке рассмотрены команды управления процессами. Вы научитесь замораживать процессы, размораживать, отправлять в фоновый режим, изменять приоритет, просматривать запущенные процессы и жестоко их убивать. Введено понятие сигналов. Рассмотрены такие команды, как bg, fg, jobs, kill, nohup, nice, renice, ps и top. Управление процессами Запуск xeyes Для изучения управления процессами, какой-нибудь процесс необходимо сначала запустить. Убедитесь, что у вас запущен X (графический сервер — прим. пер.) и выполните следующую команду: $ xeyes -center red Остановка процесса Чтобы вернуть приглашение, вы должны нажать Control-C (часто пишется как Ctrl-C или ^C): Вы получили назад свое приглашение, но и окно xeyes исчезло. Фактически, процесс был «убит». Вместо завершения по Control-C, мы можем просто остановить процесс с помощью Control-Z: $ xeyes -center red Control-Z [1]+ Stopped xeyes -center red $ fg и bg Чтобы процесс «растормошить» и запустить обратно, мы можем вывести его на передний план используя команду fg (от англ. foreground — прим. пер.): $ fg (test it out, then stop the process again) Control-Z [1]+ Stopped xeyes -center red $ $ bg [1]+ xeyes -center red & $ Использование "&" Если нам нужно сразу запустить xeyes в фоновом режиме (вместо использования Control-Z и bg), мы можем просто добавить "&" (амперсанд) в конец команды xeyes: $ xeyes -center blue & [2] 16224 Теперь в фоне у нас одновременно работают красные и синие xeyes. Мы можем просмотреть список заданий с помощью jobs: $ jobs -l [1]- 16217 Running xeyes -center red & [2]+ 16224 Running xeyes -center blue & Введение в сигналы Чтобы убить, остановить, или продолжить процесс, Linux использует специальную форму взаимодействия, называемую сигналы. Отправляя сигнал некоторому процессу, вы можете его завершить, остановить, или сделать что-нибудь еще. Это то, что происходит на самом деле, когда вы нажимаете Control-C, Control-Z, или используете bg и fg — вы указываете bash отправить процессу определенный сигнал. Сигналы также можно отправить с помощью команды kill указав ей как параметр id процесса (pid): $ kill -s SIGSTOP 16224 $ jobs -l [1]- 16217 Running xeyes -center red & [2]+ 16224 Stopped (signal) xeyes -center blue SIGTERM и SIGINT Если вы хотите убить процесс, есть несколько вариантов. По-умолчанию, kill отправляет SIGTERM, который отличается от SIGINT отправляемого по Control-C, но обычно имеет тот же эффект: $ kill 16217 $ jobs -l [1]- 16217 Terminated xeyes -center red [2]+ 16224 Stopped (signal) xeyes -center blue Процесс может игнорировать оба сигнала, SIGTERM и SIGINT, либо по своему усмотрению, либо потому, что он остановлен, либо еще как-то «застрял». В этом случае, может быть необходимо использование большого молотка — сигнала SIGKILL. Процесс не может игнорировать SIGKILL: $ kill 16224 $ jobs -l [2]+ 16224 Stopped (signal) xeyes -center blue $ kill -s SIGKILL 16224 $ jobs -l [2]+ 16224 Interrupt xeyes -center blue Терминал в котором вы запускаете задания, называется терминалом управления заданиями. Некоторые шеллы (но не bash по-умолчанию), отправляют сигнал SIGHUP фоновым заданиям когда вы выходите, заставляя их завершаться. Для защиты процессов от такого поведения, используйте nohup когда запускаете процесс: $ nohup make & [1] 15632 $ exit Команда jobs, которую мы использовали ранее выводит только те процессы, которые были запущены в вашей сессии bash. Чтобы увидеть все процессы в вашей системе, используйте ps совместно с опциями a и x: $ ps ax PID TTY STAT TIME COMMAND 1 ? S 0:04 init [3] 2 ? SW 0:11 [keventd] 3 ? SWN 0:13 [ksoftirqd_CPU0] 4 ? SW 2:33 [kswapd] 5 ? SW 0:00 [bdflush] Просмотр «леса» и «деревьев» Вы также можете просмотреть и другую информацию о каждом процессе. Опция --forest позволяет легко просмотреть иерархию процессов и даст вам представление о том, как различные процессы в системе взаимосвязаны между собой. Если один процесс запускает другой процесс, то запущенный будет называться его потомком. В выводе --forest, родители находятся слева, а потомки появляются как ветки справа: $ ps x --forest PID TTY STAT TIME COMMAND 927 pts/1 S 0:00 bash 6690 pts/1 S 0:00 \_ bash 26909 pts/1 R 0:00 \_ ps x --forest 19930 pts/4 S 0:01 bash 25740 pts/4 S 0:04 \_ vi processes.txt Опции u и l могут быть использованы в любой комбинации с опциями a, x с целью получения более подробной информации о процессах: $ ps au USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND agriffis 403 0.0 0.0 2484 72 tty1 S 2001 0:00 -bash chouser 404 0.0 0.0 2508 92 tty2 S 2001 0:00 -bash root 408 0.0 0.0 1308 248 tty6 S 2001 0:00 /sbin/agetty 3 agriffis 434 0.0 0.0 1008 4 tty1 S 2001 0:00 /bin/sh /usr/X chouser 927 0.0 0.0 2540 96 pts/1 S 2001 0:00 bash $ ps al F UID PID PPID PRI NI VSZ RSS WCHAN STAT TTY TIME COMMAND 100 1001 403 1 9 0 2484 72 wait4 S tty1 0:00 -bash 100 1000 404 1 9 0 2508 92 wait4 S tty2 0:00 -bash 000 0 408 1 9 0 1308 248 read_c S tty6 0:00 /sbin/ag 000 1001 434 403 9 0 1008 4 wait4 S tty1 0:00 /bin/sh 000 1000 927 652 9 0 2540 96 wait4 S pts/1 0:00 bash Если вы обнаружили, что запускаете ps несколько раз подряд, пытаясь рассмотреть происходящие изменения, возможно вам стоит воспользоваться top. Программа top отображает постоянно обновляющийся список процессов, наряду с другой полезной информацией: $ top 10:02pm up 19 days, 6:24, 8 users, load average: 0.04, 0.05, 0.00 75 processes: 74 sleeping, 1 running, 0 zombie, 0 stopped CPU states: 1.3% user, 2.5% system, 0.0% nice, 96.0% idle Mem: 256020K av, 226580K used, 29440K free, 0K shrd, 3804K buff Swap: 136544K av, 80256K used, 56288K free 101760K cached PID USER PRI NI SIZE RSS SHARE STAT LIB %CPU %MEM TIME COMMAND 628 root 16 0 213M 31M 2304 S 0 1.9 12.5 91:43 X 26934 chouser 17 0 1272 1272 1076 R 0 1.1 0.4 0:00 top 652 chouser 11 0 12016 8840 1604 S 0 0.5 3.4 3:52 gnome-termin 641 chouser 9 0 2936 2808 1416 S 0 0.1 1.0 2:13 sawfish Каждый процесс имеет свое значение приоритета, которое Linux использует для разделения времени CPU. Вы можете указать приоритет процесса при его запуске, с помощью команды nice: $ nice -n 10 oggenc /tmp/song.wav renice Команда nice может изменять приоритет процессов только во время их запуска. Если вам необходимо изменить приоритет работающего процесса, воспользуйтесь командой renice: $ ps l 641 F UID PID PPID PRI NI VSZ RSS WCHAN STAT TTY TIME COMMAND 000 1000 641 1 9 0 5876 2808 do_sel S ? 2:14 sawfish $ renice 10 641 641: old priority 0, new priority 10 $ ps l 641 F UID PID PPID PRI NI VSZ RSS WCHAN STAT TTY TIME COMMAND 000 1000 641 1 9 10 5876 2808 do_sel S ? 2:14 sawfish Часть 2 (4/5): Обработка текста и перенаправления В этом отрывке вы узнаете про множество интересных и полезных команд по работе с текстовыми данными в Linux. Также даны основы работы с потоками ввода-вывода в bash. Обработка текста Возвращаемся к перенаправлению Ранее в этой серии руководств, мы видели пример использования >, оператора для перенаправления вывода команды в файл, как показано ниже: $ echo "firstfile" > copyme $ echo "hi there" | wc 1 2 9 Пример с каналами (пайпами) Вот другой простой пример: $ ls -s | sort -n Следующие примеры посложнее, они демонстрируют мощь и удобство, которые можно получить используя каналы. Далее мы используем команды, которые еще не были рассмотрены, однако не заостряйте на них свое внимание. Вместо это, сконцентрируйтесь на понимании того, как работают пайпы и как вы можете использовать их в своей повседневной работе с Linux. Распаковывающий канал Для разархивации и распаковки файла, вы могли бы сделать следующее: $ bzip2 -d linux-2.4.16.tar.bz2 $ tar xvf linux-2.4.16.tar $ bzip2 -dc linux-2.4.16.tar.bz2 | tar xvf - Канал подлиннее Вот еще один пример пайпа: $ cat myfile.txt | sort | uniq | wc -l Попробуйте создать пару файлов в вашем текстовом редакторе. Используйте на них данный пайп и посмотрите на результат который вы получите. Буря обработки текста начинается! Теперь мы приступим к беглому осмотру команд Linux для стандартной обработки текстов. Поскольку сейчас мы рассмотрим множество программ, у нас не будет места для примеров по каждой из них. Вместо этого, мы призываем вас прочитать man-станицы приведенных команд (набрав man echo, например) и изучить каждую команду с ее опциями, потратив некоторое время на игру с ними. Как правило, эти команды печатают результат обработки на терминал, а не производят модификацию непосредственно файла. После этого беглого обзора, мы поглубже рассмотрим перенаправление ввода-вывода. Так что да, уже виден свет в конце туннеля. echo печатает свои аргументы на терминал. Используйте опцию -e если хотите включить в вывод управляющие последовательности; например echo -e 'foo\nfoo' напечатает foo, затем перейдет на новую строку, затем снова напечатает foo. Используйте опцию -n чтобы запретить echo добавлять символ новой строки в конец вывода, как это сделано по-умолчанию. cat напечатает содержимое указанного файла на терминал. Удобна как первая команда пайпа, например, cat foo.txt | blah. sort выведет содержимое файла, указанного в командной строке, в алфавитном порядке. Естественно, sort также может принимать ввод из пайпа. Наберите man sort чтобы ознакомиться с опциями команды, которые управляют вариантами сортировки. uniq принимает уже отсортированный файл или поток данных (через пайп) и удаляет повторяющиеся строки. wc выводит количество строк, слов и символов в указанном файле или во входном потоке (из пайпа). Введите man wc чтобы узнать, как настроить вывод программы. head выводит первые десять строк файла или потока. Используйте опцию -n, чтобы указать, сколько строк должно отображаться. tail печатает последние десять строк файла или потока. Используйте опцию -n, чтобы указать, сколько строк должно отображаться. tac похожа на cat, но печатает все строки в обратном порядке, другими словами, последняя строка печатается в первую очередь. expand конвертирует входные символы табуляции в пробелы. Опция -t указывает размер табуляции. unexpand конвертирует входные пробелы в символы табуляции. Опция -t указывает размер табуляции. cut используется для извлечения из входного файла или потока, полей разделенных указанным символом. (попробуйте echo 'abc def ghi jkl' | cut -d ' ' -f2,2 прим. пер.) Команда nl добавляет к каждой входной строке ее номер. Удобно для распечатки. pr разбивает файл на страницы и нумерует их; обычно используется для печати. tr — инструмент трансляции (преобразования) символов; используется для отображения определенных символов во входном потоке на заданные символы в выходной поток. sed — мощный потоко-ориентированный текстовый редактор. Вы можете узнать больше о sed из следующих руководств на сайте Funtoo:
awk — искусный язык построчного разбора и обработки входного потока по заданным шаблонам. Чтобы узнать больше о awk прочитайте следующую серию руководств на сайте Funtoo:
split — эта команда используется для разделения больших файлов на несколько небольших, более управляемых частей. fmt используется, чтобы выполнить «перенос» длинных строк текста. Сегодня она не очень полезна, поскольку эта возможность встроена в большинство текстовых редакторов, хотя команда достаточно хороша, чтобы ее знать. paste принимает два или несколько файлов в качестве входных данных, объединяет построчно и выводит результат. Может быть удобно для создания таблиц или колонок текста. join похожа на paste, эта утилита позволяет объединять два файла по общему полю (по-умолчанию первое поле в каждой строке). tee печатает входные аргументы в файл и на экран одновременно. Это полезно, когда вы хотите создать лог для чего-либо, а также хотите видеть процесс на экране. Буря закончилась! Перенаправление Как и > в командной строке, вы можете использовать < для перенаправления файла, но уже на вход команде. Для многих команд, можно просто указать имя файла. К сожалению некоторые программы работают только со стандартным потоком ввода. Bash и другие шелы поддерживают концепцию «herefile». Это позволяет давать входные данные команде в виде набора строк с последующей командой, означающей окончание ввода последовательности значений. Проще всего это показать на примере: $ sort <<END apple cranberry banana END apple banana cranberry Использование ">>" Можно ожидать, >> будет в чем-то похожа на <<, но это не так. Она позволяет просто добавить вывод в файл, а не перезаписывать его каждый раз, как это делает >. Пример: $ echo Hi > myfile $ echo there. > myfile $ cat myfile there. $ echo Hi > myfile $ echo there. >> myfile $ cat myfile Hi there. <!-- Вопросы задаем на форуме, не в ЛС --> |
#5
|
|||||||||||||||||||||||||
Вес репутации:
0
Регистрация: 27.02.2009
Адрес: Москва
Сообщений: 7,302
Сказал(а) спасибо: 578
Спасибок 2,623
в 1,832 сообщениях |
14.12.2010, 02:48
Часть 2 (5/5): Модули ядра
В заключительном отрывке второй части описаны основы управление модулями ядра Linux. Этот минимум неплохо знать всякому пользователю, однако, не стоит надеяться обнаружить в этом руководстве для начинающих информацию по сборке и конфигурированию модулей ядра. Модули ядра Знакомьтесь, «uname» Команда uname дает множество интересной информации о вашей системе. Вот пример вывода на моей рабочей машине, после того, как я набрал uname -a, что говорит команде uname напечатать всю имеющуюся информацию: $ uname -a Linux inventor 2.4.20-gaming-r1 #1 Fri Apr 11 18:33:35 MDT 2003 i686 AMD Athlon(tm) XP 2100+ AuthenticAMD GNU/Linux Подробнее о uname Теперь, давайте посмотрим, какую же информацию о системе может дать uname тип информации аргумент пример имя ядра -s "Linux" имя хоста -n "inventor" релиз ядра -r "2.4.20-gaming-r1" версия ядра -v "#1 Fri Apr 11 18:33:35 MDT 2003" архитектура -m "i686" процессор -p "AMD Athlon(tm) XP 2100+" платформа -i "AuthenticAMD" операционная система -o "GNU/Linux" Релиз ядра А теперь небольшой трюк. Для начала выполните uname -r чтобы программа напечатала релиз ядра, которое работает в данный момент. Теперь посмотрите в директорию /lib/modules и — опа! — Я уверен, что вы обнаружили каталог с точно таким же именем! OK, никакой магии, теперь самое время поговорить о значении каталогов в /lib/modules, а также объяснить, что такое модули ядра. Ядро Ядро Linux это сердце того, что обычно называют «Linux» — это кусок кода, который напрямую взаимодействует с вашим железом и абстрагирует от него обычные программы. Благодаря ядру, вашему текстовому редактору не нужно беспокоиться на какой диск, SCSI или IDE, а может даже в RAM, он производит запись. Редактор просто записывает в файловую систему, а ядро заботится обо всем остальном. Введение в модули ядра Итак, что такое модули ядра? Они представляют собой часть ядра, которая сохраняется на диске в специальном формате. По вашей команде, они подгружаются в работающее ядро и добавляют в него новую функциональность. Поскольку модули ядра загружаются по требованию, вы можете иметь ядро поддерживающее дополнительную функциональность, которая в обычном состоянии будет выключена и недоступна. Но «раз в сто лет», эти модули окажутся очень полезными и смогут быть загружены — часто автоматически — для поддержки диковинной файловой системы или устройства, которое вы редко используете. Модули ядра вкратце В общем, модули ядра позволяют по требованию добавить возможностей в работающее ядро. Без модулей, вам бы пришлось компилировать новое ядро и перезагружаться для того, чтобы добавить поддержку чего-нибудь нового. lsmod Для просмотра загруженных модулей на вашей системе используйте команду lsmod: # lsmodModule Size Used by Tainted: PF vmnet 20520 5 vmmon 22484 11 nvidia 1547648 10 mousedev 3860 2 hid 16772 0 (unused) usbmouse 1848 0 (unused) input 3136 0 [mousedev hid usbmouse] usb-ohci 15976 0 (unused) ehci-hcd 13288 0 (unused) emu10k1 64264 2 ac97_codec 9000 0 [emu10k1] sound 51508 0 [emu10k1] usbcore 55168 1 [hid usbmouse usb-ohci ehci-hcd] Как видите, на моей системе загружено достаточно немного модулей. vmnet и vmmon модули, обеспечиваю необходимую функциональность для VMWare Workstation, которая позволяет мне запускать виртуальные машины в окне рабочего стола. Модуль nvidia выпущен NVIDIA corporation и позволяет использовать 3D-ускорение в Linux. Дальше у меня есть набор модулей, которые используются для поддержки USB устройств ввода — mousedev, hid, usbmouse, input, usb-ohci, ehci-hcd и usbcore. Имеет смысл сконфигурировать ваше ядро для поддержки USB модулей. Почему? Потому что USB девайсы это «plug and play» (подключай и работай) девайсы и если у вас есть поддержка USB в модулях, вы можете спокойно пойти и купить новое USB устройство, подключить его, и ваша система автоматически загрузит соответствующие модули для этого устройства. Это удобный способ сделать что-то. Сторонние модули Завершают этот список модули: emu10k1, ac97_codec и sound, которые вместе обеспечиваю поддержку моей звуковой карты Audigy. Следует отметить, некоторые из моих модулей доступны прямо в исходниках ядра. Например, все USB-модули были скомпилированы из стандартных исходных текстов ядра Linux. Однако, nvidia, emu10k1 и VMWare-модули были получены из других источников. Это подчеркивает другую важную особенность модулей ядра — возможность сторонних производителей добавлять необходимую функциональность в ядро и включать ее прямо в запущенное ядро. Без перезагрузки. depmod и компания В моей папке /lib/modules/2.4.20-gaming-r1/, есть несколько файлов которые начинаются со строки «modules.»: $ ls /lib/modules/2.4.20-gaming-r1/modules.* /lib/modules/2.4.20-gaming-r1/modules.dep /lib/modules/2.4.20-gaming-r1/modules.generic_string /lib/modules/2.4.20-gaming-r1/modules.ieee1394map /lib/modules/2.4.20-gaming-r1/modules.isapnpmap /lib/modules/2.4.20-gaming-r1/modules.parportmap /lib/modules/2.4.20-gaming-r1/modules.pcimap /lib/modules/2.4.20-gaming-r1/modules.pnpbiosmap /lib/modules/2.4.20-gaming-r1/modules.usbmap Как получить модули Некоторые модули ядра разработаны для работы со специальными устройствами, как например emu10k1 — модуль для поддержки моей звуковой карты. Для этого типа модулей, приведенные выше файлы включают также информацию о PCI IDs и прочие идентификационные метки оборудования, которое они поддерживают. Эта информация может быть использована различными скриптами, например «hotplug» (который мы рассмотрим в следующих руководствах) для автоматического определения оборудования и загрузки соответствующих модулей. Использование depmod Информация о зависимостях может становиться не актуальной, особенно в случае установки новых модулей. Чтобы ее обновить, просто введите depmod -a. Программа depmod просканирует модули из вашей папки /lib/modules и обновит информацию о зависимостях. Она делает это сканируя модули в /lib/modules и проверяя так называемые «symbols» внутри модулей. Расположение модулей ядра Итак, как выглядят модули ядра? Для ядра 2.4, все файлы модулей обычно находятся в /lib/modules и имеют имя оканчивающееся на ".o" (для 2.6 ".ko" — прим. ред.). Чтобы увидеть все модули из /lib/modules, введите следующее: # find /lib/modules -name '*.o' /lib/modules/2.4.20-gaming-r1/misc/vmmon.o /lib/modules/2.4.20-gaming-r1/misc/vmnet.o /lib/modules/2.4.20-gaming-r1/video/nvidia.o /lib/modules/2.4.20-gaming-r1/kernel/fs/fat/fat.o /lib/modules/2.4.20-gaming-r1/kernel/fs/vfat/vfat.o /lib/modules/2.4.20-gaming-r1/kernel/fs/minix/minix.o [список обрезан для краткости] Итак, как же подгрузить модуль в работающее ядро? Один из вариантов, использовать команду insmod и указать ей полный путь к модулю, который вы хотите загрузить: # insmod /lib/modules/2.4.20-gaming-r1/kernel/fs/fat/fat.o # lsmod | grep fatfat 29272 0 (unused) rmmod и modprobe в действии Давайте выгрузим наш модуль fat.o и загрузим его обратно используя modprobe: # rmmod fat # lsmod | grep fat # modprobe fat # lsmod | grep fat fat 29272 0 (unused) Ваши помощники modinfo и modules.conf Можете воспользоваться командой modinfo, чтобы узнать пару интересных вещей о своих любимых модулях: # modinfo fat filename: /lib/modules/2.4.20-gaming-r1/kernel/fs/fat/fat.o description: <none> author: <none> license: "GPL" Структура modules.conf Синтаксис и функциональность modules.conf достаточно сложны, и мы не будем в них сейчас углубляться (наберите man modules.conf чтобы узнать все подробности), но есть несколько вещей, которые вы должны знать об этом файле. Во-первых, многие дистрибутивы генерируют этот файл автоматически из набора файлов в других директориях, таких как /etc/modules.d/. Например, в Gentoo Linux есть такая папка, и запуск команды update-modules прочитает все файлы из /etc/modules.d/ и объединит их в новый /etc/modules.conf. Поэтому, сделав свои изменения в файлах из /etc/modules.d/ запустите update-modules, если вы используете Gentoo. В Debian, процедура очень похожа, за исключением того, что папка называется /etc/modutils/. Для ядер версии 2.6 аналогичные по функциональности файл и папка из каталога etc называются modprobe.conf и modprobe.d соответственно. Синтаксис там упрощен, смотрите man modprobe.confИтоги и ресурсы Итоги Мои поздравления; вы дошли до конца этого учебника по основам администрирования Linux! Надеюсь он помог вам немного систематизировать ваши знания о Linux. Пожалуйста присоединяйтесь к нам в следующем руководстве раскрывающем более продвинутые аспекты администрирования, такие как права доступа, управление пользователями, файловую систему, монтирование и многое другое. В следующем руководстве мы будем опираться на фундамент, заложенный здесь. И помните, продолжая изучать эту серию руководств, вы уже совсем скоро будете готовы сдаче экзаменов на получение сертификата LPIC Level 1 от Linux Professional Institute. Ресурсы Говоря о сертификации LPIC, если вы действительно в ней заинтересованы, то я настоятельно рекомендую вам изучить следующие источники, которые были тщательно выбраны для расширения знаний полученных в этом руководстве. В сети есть множество хороших руководств по регулярным выражениям. Вот парочка:
В серии Bash в примерах (будет перевод), я покажу вам как использовать инструкции bash для написания ваших собственных скриптов. Это серия (особенно первая и вторая части) будет хорошей подготовкой к экзамену LPIC Level 1: Вы можете узнать больше о sed в серии руководств Sed в примерах (будет переведено). Если вы планируете сдавать LPI экзамен, убедитесь что прочитали первые две части этой серии. Чтобы узнать больше об awk, обратитесь к серии Awk в примерах (перевод будет). Если вы не знакомы с редактором vi, Я настоятельно рекомендую вам посмотреть мое руководство Vi - the cheat sheet method. Этот учебник станет легким, но и стремительным введением в этот мощный текстовый редактор. Считайте, что это материал необходимый к прочтению, если вы не знаете как пользоваться vi. Добавлено через 6 минут Часть 3 (1/4): Документация Первый отрывок третьей части серии руководств для новичков. Практически всё, что нужно знать, чтобы найти справочную информацию по вашей системе. Короче, RTFM и не задавайте глупых вопросов. Предисловие Об этом руководстве Встречайте «Администрирование для продолжающих», третье из четырех пособий, созданных для подготовки к экзамену «Linux Professional Institute's 101» (2-ая редакция). Данная часть идеальна для тех, кто хочет улучшить свои знания фундаментальных основ администрирования Linux. Мы охватим ряд тем, включая системную и интернет документацию, модель прав доступа в Linux, управление аккаунтами пользователей и настройку окружения входа в систему. Если вы новичок в Linux, рекомендуем начать с Частей 1 и 2 (см выше). Для некоторых большая часть информации, изложенной в самоучителе, будет новой, но более опытные пользователи могут использовать его для того, чтобы отточить свои навыки администрирования Linux. В конце серии этих руководств (всего их восемь, подготавливающих к экзаменам LPI 101 и 102) у вас будут все знания, необходимые для того, чтобы стать системным администратором Linux систем, а так-же вы будете готовы к получению сертификата LPIC уровня 1 от института Linux Professional. Системная и сетевая документация Типы системной документации в Linux Существует три основных источника документации в Linux системах: страницы руководств (маны), info-страницы и поставляемая с приложениями документация в /usr/share/doc. В этом разделе мы рассмотрим каждый из этих источников, перед тем, как обращаться во внешний мир за дополнительной информацией. Страницы руководств Страницы руководств, или “man (от англ. manual — руководство) страницы”, ман-страницы, далее просто маны — это классическая форма справочной документации UNIX и Linux. В идеале, вы можете найти ман для любой команды, конфигурационного файла или библиотеки. Однако, на практике, Linux это бесплатное программное обеспечение и некоторые страницы руководств не были написаны или устарели. Тем не менее, маны остаются первым местом, куда следует обращаться за помощью. Для доступа к ману просто введите man, а затем ваш запрос. Запустится программа-пейджер (просмотрщик, обычно less или more) со справочной информацией. Для того, чтобы закрыть её, нажмите клавишу q. Например, чтобы посмотреть информацию о команде ls, введите: $ man ls
Файлы, содержащие информацию манов хранятся в /usr/share/man (или в /usr/man на некоторых старых системах). В этой директории вы найдёте страницы руководств, упорядоченные по следующим секциям:
Некоторые темы существуют более чем в одной секции. Для демонстрации этого воспользуюемся командой whatis, показывающей доступные маны по теме: $ whatis printf printf (1) - format and print data printf (3) - formatted output conversion $ man 3 printf Поиск нужного мана Иногда сложно найти правильную ман-страницу по заданной теме. В этом случае можно воспользоваться man -k для поиска по разделам «ИМЯ» ман-страниц. Но будьте осторожны, поскольку осуществляется поиск по подстроке и что-то, навроде man -k ls, выдаст очень много всего! Вот пример использования уточняющего запроса: $ man -k whatis apropos (1) - search the whatis database for strings makewhatis (8) - Create the whatis database whatis (1) - search the whatis database for complete words Предыдущий пример не случаен. Во-первых, команда apropos полностью соответствует команде man -k. (На самом деле, я даже вам раскрою небольшой секрет. Когда вы запускаете man -k, фактически «за кулисами» стартует apropos). Во-вторых, существует команда makewhatis, которая сканирует все страницы в вашей Linux системе и создает базу данных для whatis и apropos. Обычно она запускается периодически из-под рута, чтобы поддерживать базу в актуальном состоянии: # makewhatis $ man man MANPATH По умолчанию, программа man будет искать ман-страницы в /usr/share/man, /usr/local/man, /usr/X11R6/man, и быть может в /opt/man. Возможно, вы захотите добавить новый пункт в этом пути поиска. Для этого, просто откройте /etc/man.conf в текстовом редакторе и добавьте строчку вроде такой: MANPATH /opt/man GNU info Одно из ограничений страниц руководств это то, что они не поддерживают гипертекст, так что у вас не получится просто переходить от одного руководства к другому. Ребята из GNU увидели этот недостаток и ввели другой формат документации: инфо-страницы. Многие из программ GNU идут с расширенной документацией в формате инфо-страниц. Вы можете приступить к чтению инфо-страниц при помощи комманды «info»: $ info Вы также можете указать нужную инфо-страницы в командной строке: $ info diff $ info info Есть еще один источник помощи в вашей системе Linux. Большинство программ поставляются с дополнительной документацией в других форматах, таких как: простые текстовые файлы, PDF, PostScript, HTML. Посмотрите в каталоге usr/share/doc (или /usr/doc на более старых системах). Вы найдете длинный список директорий, каждая из которых идет с определенным приложением на вашей системе. Поиск по этой документации может навести вас на очень ценную информацию, которая не доступна в манах или инфо-страницах, такую как учебники или дополнительная технической документация. Беглый взгляд указывает на то, что здесь очень много материала для чтения: $ cd /usr/share/doc $ find . -type f | wc -l 7582 Linux Documentation Project В дополнение к системной документации, в интернете существует ряд отличных ресурсов посвященных Linux. "Linux Documentation Project" (LDP) — это группа добровольцев, которые занимаются составлением полного набора свободной документации по Linux. Данный проект существует чтобы собрать различные части документации по Linux в определенным месте, где её будет легко искать и использовать. Обзор LDP LDP состоит из следующих разделов:
LDP в добавок предоставляет доступ к списку ссылок и ресурсов, таких как Linux Gazette и Linux Weekly News, а также к спискам рассылки и архивам новостей. Списки рассылки Списки рассылки являются, вероятно, самым важным средством взаимодействия разработчиков Linux. Зачастую проекты разрабатываются участниками живущими на большом расстоянии друг от друга, возможно даже на противоположных сторонах земного шара. Списки рассылки представляют метод взаимодействия, в котором каждый разработчик проекта может связаться со всеми остальными и вместе дискутировать посредством электронной почты. Один из самых известных списков рассылки разработчиков, это Linux Kernel Mailing List (список рассылки ядра Linux). Еще о списках рассылки В дополнение к разработке, списки рассылки могут предоставлять возможность задавать вопросы и получать ответы от знающих разработчиков или даже других пользователей. К примеру, отдельные дистрибутивы часто предоставляют список рассылки для новичков. Вы можете проверить на сайте вашего дистрибутива информацию о том, какие списки рассылки он предлагает. Если вы уделили время чтобы прочитать LKML FAQ по ссылке выше, то возможно заметили, что подписчики на списки рассылок часто недружелюбно относятся к вопросам, которые часто повторяются. Всегда разумно поискать в архивах рассылки перед тем, как задавать свой вопрос. Есть шансы, что это сэкономит и ваше время тоже! Группы новостей Новостные группы (англ. newsgroups) в интернете похожи на списки рассылки, но основаны на другом протоколе, который называется NNTP (Network News Transfer Protocol, что в переводе «Сетевой протокол передачи новостей»), а не на обмене электронной почтой. Чтобы иметь возможность общаться, вам придется установить NTTP-клиент, например slrn или pan. Основным преимуществом является тот факт, что вы можете принять участие в дискуссии, когда вам это нужно, а не постоянно смотреть как она ломится в ваш почтовый ящик :-) Наибольший интерес представляют новостные группы начинающиеся с comp.os.linux. Посмотреть список групп вы можете на сайте LDP. Сайты поставщиков и прочие Сайты различных дистрибутивов Linux зачастую предоставляют обновленную документацию, инструкции по установке, информацию о совместимости или несовместимости с оборудованием и другие средства поддержки, такие как поиск по базе знаний. Например:
В последние годы, многие поставщики устройств и программного обеспечения добавили поддержку Linux для своих продуктов. На их сайтах вы можете найти информацию о том, какое оборудование поддерживает Linux, найти инструменты разработки программ, исходники, скачать драйвера для Linux под конкретное устройство, а также, узнать о других всевозможных Linux-проектах. Например:
Добавлено через 5 минут Часть 3 (2/4): Модель прав доступа Второй отрывок третьей части серии руководств Linux для новичков. В котором вы сможете узнать, об одном из основных средств обеспечения безопасности в Linux. А именно, правах доступа и модели владения файлами. Модель прав доступа в Linux Один пользователь, одна группа В этом разделе мы рассмотрим права доступа в Linux и модель владения (ownership). Мы уже видели, что каждый файл принадлежит одному пользователю и одной группе. Это сама суть модели прав доступа в Linux. Вы можете узнать, какому пользователю и группе принадлежит файл в выводе команды ls -l. $ ls -l /bin/bash -rwxr-xr-x 1 root wheel 430540 Dec 23 18:27 /bin/bash Понимание «ls -l» Давайте рассмотрим вывод команды ls -l. Взглянем на первую колонку листинга: $ ls -l /bin/bash -rwxr-xr-x 1 root wheel 430540 Dec 23 18:27 /bin/bash 'd' директория 'l' символическая ссылка 'c' устройство символьного ввода-вывода 'b' устройство блочного ввода-вывода 'p' FIFO 's' сокет $ ls -l /bin/bash -rwxr-xr-x 1 root wheel 430540 Dec 23 18:27 /bin/bash "rwx" "r-x" "r-x" Кто я? Перед тем, как мы узнаем как изменить владельца или группу которой принадлежит файл, давайте сперва рассмотрим, как узнать вашего текущего пользователя и группу к которой вы принадлежите. Если вы не использовали команду su недавно, ваш текущий пользователь это тот, которым вы вошли в систему. Если вы часто используете su, вы можете не помнить пользователя под которым вы работаете в данный момент. Чтобы узнать под каким пользователем вы работаете, наберите whoami: # whoami root # su drobbins $ whoami drobbins Чтобы увидеть к каким группам вы принадлежите используйте команду groups: $ groups drobbins wheel audio $ groups root daemon root : root bin daemon sys adm disk wheel floppy dialout tape video daemon : daemon bin adm Чтобы изменить владельца или группу файла (или другого объекта) используется команды chown или chgrp соответственно. Сначала нужно передать имя группы или владельца, а потом список файлов. # chown root /etc/passwd # chgrp wheel /etc/passwd # chown root:wheel /etc/passwd Рекурсивное изменение прав Команды chown и chgrp могут быть использованы с параметром -R, что позволяет рекурсивно изменить владельца или группу у всех объектов в данной директории и ниже. Пример: # chown -R drobbins /home/drobbins Знакомство с chmod chown и chgrp используются для изменения владельца и группы объекта файловой системы, но кроме них существует и другая программа, называемая chmod, которая используется для изменения прав доступа на чтение, запись и исполнение, которые мы видим в выводе команды ls -l. chmod использует два и более аргументов: метод, описывающий как именно необходимо изменить права доступа с последующим именем файла или списком файлов, к которым необходимо применить эти изменения: $ chmod +x scriptfile.sh $ chmod -x scriptfile.sh Разделение между пользователем, группой и всеми остальными До сих пор, наши примеры команды chmod влияли на права доступа всех трех наборов прав доступа — пользователя, группы и всех остальных пользователей. Часто бывает удобно изменить только один или два набора за раз. Чтобы сделать это, просто используйте специальный символ для обозначения набора прав доступа, который вам необходимо изменить, со знаком + или — перед ним. Используйте u для пользователя, g для группы и o для остальных пользователей. $ chmod go-w scriptfile.sh Сброс разрешений Помимо переключения бит, отвечающих за права доступа, в состояние вкл/выкл, мы можем задать конкретные значения для всех сразу. Используя оператор равенства мы можем указать chmod, что хотим задать только указанные права доступа: $ chmod =rx scriptfile.sh $ chmod u=rx scriptfile.sh До сих пор, мы использовали то что называется символическим способом указания прав доступа для команды chmod. Однако есть еще один достаточно распространенный способ указания прав: использование четырехзначных восьмеричных чисел. Этот синтаксис, называется числовым синтаксисом прав доступа, где каждая цифра представляет тройку разрешений. Например, в 1777, 777 устанавливают флаги о которых мы говорим в этом разделе, для владельца, группы, и остальных пользователей. 1 используется для указания специального бита прав доступа, который мы рассмотрим позже (смотрите «Неуловимая первая цифра» в конце раздела). Эта таблица показывает как транслируются права доступа на числовые значения. Режим Числоrwx 7 rw- 6 r-x 5 r-- 4 -wx 3 -w- 2 --x 1 --- 0 Числовой синтаксис прав доступа особенно полезен когда требуется указать все разрешения для файла, как показано в следующем примере: $ chmod 0755 scriptfile.sh $ ls -l scriptfile.sh -rwxr-xr-x 1 drobbins drobbins 0 Jan 9 17:44 scriptfile.sh umask Когда процесс создает новый файл, он указывает, какие права доступа нужно задать для данного файла. Зачастую запрашиваются права 0666 (чтение и запись всеми), что дает больше разрешений, чем необходимо в большинстве случаев. К счастью, каждый раз, когда в Linux создается новый файл, система обращается к параметру, называемому umask. Система использует значение umask чтобы понизить изначально задаваемые разрешения на что-то более разумное и безопасное. Вы можете просмотреть текущие настройки umask набрав umask в командной строке: $ umask 0022 $ umask 0077 Режим Числоrwx 7 rw- 6 r-x 5 r-- 4 -wx 3 -w- 2 --x 1 --- 0 Знакомство с suid и sgid В момент вашего входа в систему запускается новый процесс оболочки. Вы уже знаете об этом, но можете не знать о том, что этот новый процесс оболочки (обычно это bash) работает от имени вашего пользователя. И таким образом программа bash может обращаться ко всем файлам и директориям, владельцем которых вы являетесь. В действительности мы, как пользователи, полностью зависим от программ, выполняющих операции от нашего имени. И поскольку программы, которые вы запускаете, наследуют ваш пользовательский идентификатор, они не могут обращаться объектам файловой системы, к которым вам не предоставлен доступ. К примеру, обычные пользователи не могут напрямую изменять содержимое файла passwd потому что флаг записи отключен для всех пользователей кроме root: $ ls -l /etc/passwd -rw-r--r-- 1 root wheel 1355 Nov 1 21:16 /etc/passwd suid К счастью, в модели прав доступа Linux имеются два специальных бита, называемых suid и sgid. Когда для запускаемой программы установлен бит suid, она будет работать от имени владельца исполняемого файла, а не от имени того, кто запустил программу. Теперь можем вернуться к вопросу с /etc/passwd. Если посмотрим на исполняемый файл passwd, увидим, что его владельцем является пользователь root: $ ls -l /usr/bin/passwd -rwsr-xr-x 1 root wheel 17588 Sep 24 00:53 /usr/bin/passwd Предупреждения о suid/sgid Мы увидели как работает suid, sgid работает похожим образом. Она позволяет программе наследовать права доступа группы, а не текущего пользователя. Важно! Немного разрозненная, но в то же время очень важная информация о suid и sgid. Во-первых, биты suid и sgid занимают те же поля в выводе команды ls -l. Если бит x тоже задан, соответствующие биты будут показаны как s (в нижнем регистре). Однако, если бит x не задан то он будет отображаться как S (в верхнем регистре). Важно! Еще одно важное замечание: suid и sgid бывают удобны во многих ситуациях, но неправильное их использование может привести к появлению уязвимостей в защите системы. Лучше всего иметь как можно меньшее количество suid программ. Команда passwd — одна из немногих, которая должна быть suid. Способ установки и удаления битов suid и sgid чрезвычайно прост. Вот так мы задаем бит suid: # chmod u+s /usr/bin/myapp # chmod g-s /home/drobbins До текущего момента мы рассматривали права доступа с точки зрения обычных файлов. Когда речь заходит о директориях, появляются некоторые отличия. Директории используют те же флаги прав доступа, но их интерпретация имеет немного другой смысл. Если для директории задан флаг чтения, то вы можете просматривать список содержимого директории; флаг записи означает, что вы можете создавать файлы в директории; и флаг исполнения означает, что вы можете войти в директорию и обращаться ко всем поддиректориям внутри. Без флага исполнения у вас не будет доступа к объектам файловой системы внутри директории. Без флага чтения объекты файловой системы внутри директории нельзя просмотреть, но к объектам внутри директории все еще можно обратиться, если вы знаете полный путь к объекту на диске. Директории и флаг sgid В случае же, если для директории установлен бит sgid, все объекты файловой системы, создаваемые внутри, наследуют группу директории. Эта возможность бывает кстати, когда вам необходимо создать дерево директорий и все они должны принадлежать одной группе. Это можно сделать вот так: # mkdir /home/groupspace # chgrp mygroup /home/groupspace # chmod g+s /home/groupspace Директории и удаление По умолчанию директории в Linux ведут себя не самым удобным во многих ситуациях образом. Обычно кто угодно может переименовать или удалить файл внутри директории если у них есть права на запись в этой директории. Для директорий, которыми владеют отдельные пользователи, такое поведение обычно не вызывает проблем. Однако для директорий, которыми пользуется большое количество пользователей, в особенности /tmp и /var/tmp, это может вызвать целую кучу проблем. Все потому, что кто угодно может писать в эти директории, кто угодно может удалять и переименовывать чьи угодно файлы — даже если они им не принадлежат! Очевидно, довольно сложно использовать /tmp даже для временного хранения чего угодно, когда любой пользователь в любой момент может напечатать rm -rf /tmp/* и уничтожить файлы всех остальных. Хорошая новость в том, что в Linux существует так называемый sticky бит. Когда для /tmp установлен sticky бит (командой chmod +t), единственные, кто могут удалить или переименовать файлы в /tmp — это либо владельцы этих файлов либо суперпользователь. Неуловимый первый знак В завершение этого раздела мы наконец обратим внимание на первый знак, используемый в численном синтаксисе. Он используется для задания битов sticky, suid и sgid: suid sgid sticky режимon on on 7 on on off 6 on off on 5 on off off 4 off on on 3 off on off 2 off off on 1 off off off 0 # chmod 1775 /home/groupfiles В качестве домашней работы выясните что значит 1755 в настройках прав доступа. <!-- Вопросы задаем на форуме, не в ЛС --> |
||||||||||||||||||||||||
#6
|
|
Вес репутации:
0
Регистрация: 27.02.2009
Адрес: Москва
Сообщений: 7,302
Сказал(а) спасибо: 578
Спасибок 2,623
в 1,832 сообщениях |
25.12.2010, 18:44
Часть 3 (3/4): Управление аккаунтами в Linux
Управление аккаунтами в Linux Знакомьтесь, /etc/passwd В этом разделе мы познакомимся с механизмом управления аккаунтами в Linux и начнем с файла /etc/passwd, в котором определены все пользователи, которые существуют в системе. Вы можете посмотреть свой файл /etc/passwd, набрав команду less /etc/passwd. Каждой строкой в /etc/passwd определяется аккаунт пользователя. Вот пример из моего /etc/passwd: drobbins:x:1000:1000:Daniel Robbins:/home/drobbins:/bin/bash /etc/passwd, советы и хитрости Вы вероятно заметили, что в системе намного больше пользовательских аккаунтов, которые определены в /etc/passwd, чем тех, которые логинятся в систему на самом деле. Всё это потому, что различные компоненты Linux используют некоторые аккаунты для повышения безопасности. Обычно, такие системные аккаунты имеют идентификатор (uid) меньший 100, и у многих из них в качестве стартовой оболочки установлена /bin/false. Так как эта программа ничего не делает, кроме как выходит и возвращает код ошибки, это эффективно препятствует использованию этих аккаунтов в качестве обычных аккаунтов для логина — т.е. они предназначены только для внутрисистемного пользования. /etc/shadow Итак, сами пользовательские аккаунты определены в /etc/passwd. Системы Linux вдобавок к /etc/passwd содержат его файл-компаньон /etc/shadow. Он, в отличие от /etc/passwd, доступен для чтения только суперпользователю и содержит зашифрованную информацию о паролях. Взглянем на образец строки из /etc/shadow: drobbins:$1$1234567890123456789012345678901:11664:0:-1:-1:-1:-1:0 поле 3 — количество дней с 01.01.1970 до момента, когда пароль был изменен поле 4 — количество дней до того, как будет разрешено сменить пароль («0» — «менять в любое время») поле 5 — количество дней до того, как система заставит пользователя сменить пароль ("-1" — «никогда») поле 6 — количество дней до истечения срока действия пароля, когда пользователь получит предупреждение об этом ("-1" — «не предупреждать») поле 7 — количество дней после истечения срока действия пароля, по прошествии которых аккаунт будет автоматически отключен системой ("-1" — «не отключать») поле 8 — количество дней, прошедшее с момента отключения этого аккаунта ("-1" — «этот аккаунт включен») поле 9 — зарезервировано для будущего использования /etc/group Теперь взглянем на файл /etc/group, который определяет группы в системе Linux. Вот примерная строка из него: drobbins:x:1000: Вспомните, что в нашем образце строки из /etc/passwd есть «ссылка» на группу с идентификатором 1000. Мы сможем поместить пользователя drobbins в группу drobbins, даже несмотря на отсутствие имени drobbins в четвертом поле /etc/group. Примечания о группах Замечание насчет соответствия пользователей с группами: на некоторых системах каждый новый логин-аккаунт связан с группой, имеющей то же имя (и обычно идентификатор). На других системах все логин-аккаунты будут принадлежать к одной группе пользователей. Какой из этих методов выбрать зависит от вас. Создание соответствующей группы для каждого пользователя имеет преимущество в том, что позволяет им более легко контролировать их собственный доступ просто помещая доверенных друзей в свою личную группу. Ручное создание пользователей и групп Теперь, я покажу как создать аккаунты для пользователя и группы. Лучший путь узнать как это сделать это добавить нового пользователя в систему вручную. Для начала убедитесь что вашей переменной окружения EDITOR соответствует ваш любимый редактор: # echo $EDITOR vim # export EDITOR=/usr/bin/emacs # vipw Редактирование /etc/passwd Итак, у вас уже есть готовый файл /etc/passwd, добавьте теперь следующую строку: testuser:x:3000:3000:LPI tutorial test user:/home/testuser:/bin/false Редактирование /etc/shadow Сейчас нам нужно добавить запись в /etc/shadow для этого пользователя. Для этого наберите vipw -s. Вас как всегда встретит ваш любимый редактор в котором уже открыт файл /etc/shadow. Теперь скопируйте строку существующего пользовательского аккаунта (того, у которого есть пароль и запись которого длиннее стандартных записей системных аккаунтов) drobbins:$1$1234567890123456789012345678901:11664:0:-1:-1:-1:-1:0 testuser:$1$1234567890123456789012345678901:11664:0:-1:-1:-1:-1:0 Установка пароля Вы вернетесь к командной строке. Теперь, самое время задать пароль для вашего нового пользователя. # passwd testuser Enter new UNIX password: (enter a password for testuser) Retype new UNIX password: (enter testuser's new password again) Редактирование /etc/group Теперь /etc/passwd и /etc/shadow готовы и самое время как следует настроить /etc/group. Для этого, наберите: # vigr testuser:x:3000: Создание домашней директории Мы почти закончили. Выполните следующие команды для создания домашнего каталога testuser'а: # cd /home # mkdir testuser # chown testuser:testuser testuser # chmod o-rwx testuser Утилиты администрирования учетных записей Вы уже знаете как вручную добавить новые аккаунты и группы, давайте же теперь рассмотрим различные, экономящие время, утилиты для управления аккаунтами под Linux. Из-за некоторых ограничений мы не будем рассматривать множество деталей, описывающих эти команды. Запомните — вы всегда можете получить больше информации о какой-либо команде если посмотрите её man-страничку. Если вы планируете сдавать LPIC 101 экзамен, вам следует провести побольше времени на ознакомление с каждой из этих команд. newgrp — По умолчанию, любой файл, который создает пользователь, сразу же присваивается к группе, в которой он состоит, определенной в /etc/passwd. Если пользователь принадлежит к другим группам, он или она может набрать newgrp thisgroup чтобы стать членом группы thisgroup. Затем, любые новые созданные файлы унаследуют членство в thisgroup. chage — Команда chage используется для просмотра и изменения настроек срока действия паролей, сохраненных в /etc/shadow. gpasswd — Основная утилита управления группами groupadd/groupdel/groupmod — Используются для добавления/удаления/изменения групп в /etc/group useradd/userdel/usermod — Используются для добавления/удаления/изменения пользователей в /etc/passwd. Эти команды могут выполнять и другие полезные функции. Смотрите man для получения дополнительной информации. pwconv/grpconv — Используются для преобразования passwd и group файлов старого образца в новые shadow passwords. Фактически, все Linux системы уже используют shadow passwords, так что вам никогда не придется использовать эти команды. Часть 3 (4/4): Настройка окружения Настройка пользовательского окружения Знакомство с «fortune» У вашего окружения есть много полезных опций, которые вы можете изменить по своему усмотрению. Однако до сих пор мы не обсуждали как восстанавливать эти настройки каждый раз, когда вы входите в систему, исключая то, чтобы каждый раз набирать их заново. В этом разделе мы рассмотрим настройку вашего окружения посредством редактирования стартовых конфигурационных файлов. Для начала, давайте покажем дружелюбное сообщение когда вы будете входить в систему. Чтобы увидеть пример такого сообщения, запустите fortune: $ fortune No amount of careful planning will ever replace dumb luck. .bash_profile Теперь давайте сделаем так чтобы fortune запускалось при каждой авторизации. Используя любимый текстовый редактор отредактируйте файл .bash_profile в вашей домашней директории. Если такого файла не существует, создайте его. Вставьте в его начало: fortune mycroft.flatmonk.org login: chouser Password: Freedom from incrustations of grime is contiguous to rectitude. $ Оболочка входа. При запуске bash проходит файл .bash_profile в вашей домашней директории, запуская каждую строчку как будто набирая ее в командной строке. Это называется интерпретацией файла (file sourcing). Bash может работать различным образом в зависимости от того, как он запущен. Если он запущен как оболочка входа, то будет работать, как описано выше — сначала обработая общесистемный /etc/profile, а затем ваш личный ~/.bash_profile. Существуют два способа запуска bash в качестве оболочки входа. Первый используется когда вы впервые входите в систему: bash запускается с именем процесса -bash. Можно увидеть это в выводе списка процессов: $ ps u USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND chouser 404 0.0 0.0 2508 156 tty2 S 2001 0:00 -bash Понимание --login Второй способ запустить bash как оболочку входа — при помощи опции —login. Время от времени эта возможность используется эмуляторами терминала (вроде xterm) чтобы их сессия bash выглядела как при изначальном входе в системе. После авторизации можно запустить много копий вашей оболочки. У тех из них которые запущены без опции --login или не имеют черточки перед именем процесса, поведение будет иным нежели при запуске с авторизацией. Они предоставляют вам командную строку, однако, называются они интерактивными оболочками. Если bash запущена интерактивно, без авторизации, она проигнорирует /etc/profile и ~/.bash_profile вместо этого обработает ~/.bashrc. interactive login profile rcyes yes source ignore yes no ignore source no yes source ignore no no ignore ignore Проверка на интерактивность Иногда bash обрабатывает ваш ~/.bashrc не будучи запущенным интерактивно, например при использовании команд типа rsh или scp. Это важно помнить потому как вывод текста, как в примере с командой fortune выше, может испортить эти неинтерактивные сессии bash. Хорошей идеей является использование переменной PS1 для проверки факта интерактивности текущей сессии перед выводом текста: if [ -n "$PS1" ]; then fortune fi /etc/profile и /etc/skel Как системный администратор, вы отвечаете за файл /etc/profile. Так как им руководствуются все кто впервые входят в систему, важно держать его в рабочем состоянии. Это также очень мощный инструмент, используемый для того чтобы заставить вещи работать правильно для новых пользователей сразу после того как они войдут используя свою новую учетную запись. Однако, существует вариант, при котором, настройки с одной стороны, могут быть выставлены в значения по-умолчанию для новых пользователей, а с другой, могут быть легко ими изменены при необходимости. Как раз для этого и существует директория /etc/skel. При использовании команды useradd для создания новой учетной записи, все файлы из /etc/skel копируются в домашний каталог нового пользователя. Это означает, что вы можете положить, например, .bash_profile и .bashrc в /etc/skel для более комфортного начала работы нового пользователя. export Переменные в bash могут быть помечены таким образом, что они будут устанавливаться во всех вновь запускаемых командных оболочках. Это означает, что они обозначены как внешние (export). Вы можете заставить bash отобразить список всех таким образом обозначенных внешних переменных в вашей сессии bash: $ export declare -x EDITOR="vim" declare -x HOME="/home/chouser" declare -x MAIL="/var/spool/mail/chouser" declare -x PAGER="/usr/bin/less" declare -x PATH="/bin:/usr/bin:/usr/local/bin:/home/chouser/bin" declare -x PWD="/home/chouser" declare -x TERM="xterm" declare -x USER="chouser" Экспортирование переменных Если переменная не отмечена на экспорт, её значение не будет задано для новых запускаемых оболочек. Но вы можете отметить переменную на экспорт, передав её встроенной команде export: $ FOO=foo $ BAR=bar $ export BAR $ echo $FOO $BAR foo bar $ bash $ echo $FOO $BAR bar $ exit $ echo $FOO $BAR foo bar Export и set -x В связи с вышеописанным поведением, переменные могут быть указаны в ~/.bash_profile или /etc/profile и помечены для экспорта, для того, чтобы в дальнейшем не было необходимости указывать их снова. Но есть несколько опций которые не могут быть экспортированы, и поэтому они должны быть заданы в ~/.bashrc и в вашем профиле последовательно. Эти опции настраиваются при помощи встроенной команды set: $ set -x $ echo $FOO $ echo foo foo Установка переменных с «set» Команда set может также использоваться для задания значений переменных, но при этом указание самой этой команды не является обязательным. Команда в bash «set FOO=foo» делает то же самое, что и «FOO=foo». Сброс значения переменной осуществляется встроенной unset: $ FOO=bar $ echo $FOO bar $ unset FOO $ echo $FOO Unset vs. FOO= Это не то же самое, что установка переменной пустым значением, хотя порой это сложно объяснить. Один из способов эту разницу заметить — вызвать команду set без параметров, чтобы вывести список всех текущих переменных: $ FOO=bar $ set | grep ^FOO FOO=bar $ FOO= $ set | grep ^FOO FOO= $ unset FOO $ set | grep ^FOO Экспортирование переменных для изменения поведения программ. Часто поведение команд можно изменить установкой переменных окружения. Так же, как в случае новых сессий bash, запускаемые программы из вашей командной строки будут видеть только переменные окружения, помеченные на экспорт. Например, команда man проверяет переменную PAGER, чтобы выяснить какую программу использовать для постраничного просмотра текста. $ PAGER=less $ export PAGER $ man man $ PAGER=cat $ man man Использование «env» К сожалению, если вы позабудете установить PAGER обратно в less, программа man (как и некоторые другие программы) будет продолжать вывод весь запрошенный текст без остановок. Если вы хотели задать PAGER значение cat только на один раз, то могли бы воспользоваться командой env: $ PAGER=less $ env PAGER=cat man man $ echo $PAGER less Итоги и ссылки Итоги Ну вот самое время поздравить вас с завершением 3-ей части руководства. Вы уже должны знать как находить информацию в системе и интернет документации, а так же иметь хорошее представление о модели прав доступа в Linux, управлении учетными записями пользователей и окружением. Ссылки Не забудьте посмотреть ресурсы c Linux документацией, использованные в этом руководстве, в особенности Linux Documentation Project, где сможете найти различные гайды, FAQ, а так же бесценные страницы мана. Не забудьте также о Linux Weekly News. The Linux System Administrators guide является хорошим дополнением к этому руководству. Также вы можете найти в интернете весьма полезную статью Эрика Рэймонда "Unix and Internet Fundamentals HOWTO". Дэниел Роббинс, на примере серии статей, «Bash в примерах», показывает как использовать конструкции программирования для написания собственных скриптов. Эта серия (особенно части 1 и 2) является замечательной подготовкой для экзамена LPIC 1-го уровня, к тому же поможет закрепить усвоенные понятия охватываемые руководством «Настройка пользовательского окружения» разделы:
Для знакомства с редактором Emacs, смотрите руководство «the developerWorks», "Living in Emacs". <!-- Вопросы задаем на форуме, не в ЛС --> |
Ответить |
Опции темы | |
Опции просмотра | |
|
|