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

Если вы когда-нибудь сталкивались с ОС Linux, вы наверняка слышали слово «терминал». Новички обычно воспринимают терминал как что-то страшное и зловещее. Но не все так страшно.
Введение в терминал Linux
Моя бабушка называет любой терминал «терминатором», что добавляет антуража. На самом деле терминал (bash) — это всего лишь командная строка с гораздо более широким набором функций, если сравнивать с Windows. Почти любое действие можно выполнить командой из терминала, но далеко не любое действие можно выполнить через окружения пользователя.
В этом и заключается преимущество терминала Linux — по сути из него можно полностью управлять системой, без необходимости окружения пользователя (графического интерфейса). На самом деле нередко серверы так и работают — черный экран, командная строка и все функции под рукой. В статье команды будут сгруппированы по функциям, а не по частоте использования, это связано с удобством восприятия и понимания.
Статья рассчитана на новичков и написана таким же новичком, в этом нет ничего зазорного — все когда-то начинали с нуля. Любое сообщество существует только до тех пор, пока есть приток новых участников.
Список команд в данной статье не является полным списком команд Linux. Во-первых, команд слишком много, чтобы перечислять их все, во-вторых, новичкам они не нужны, а профессионалы уже помнят их наизусть. Однако, не стоит расстраиваться, если у вас не получается запомнить команды — запоминание приходит с практикой. Чем чаще вы пользуетесь теми или иными командами, тем скорее вы их запомните.
Облачные базы данных в Selectel
Доверьте нашим специалистам развертывание и поддержку баз данных в облаке.
Основные команды Linux
Если вы проигнорировали введение, напомним, что команды в статье сгруппированы по исполняемой ими функции. Что может быть более необходимым для новичка, чем функция справки?
Команды для получения справки
man — manual, получение справки
Самая первая команда Linux для начинающих — manual — для получения полной справочной информации по другой команде. Некоторые пользователи настаивают, что искать в интернете информацию по команде проще и эффективнее. Однако, информация в интернете не всегда является верной, статья в интернете может быть устаревшей, не релевантной для вашей версии ОС и т.д. Использовать man всегда хорошая идея.
Чтобы получить справку по команде, введите перед ней man. Например, man man выдаст руководство по команде man. Также можно вывести мануал терминала Linux (man bash):
BASH(1) General Commands Manual BASH(1) NAME bash - GNU Bourne-Again SHell SYNOPSIS bash [options] [command_string | file] COPYRIGHT Bash is Copyright (C) 1989-2018 by the Free Software Foundation, Inc. DESCRIPTION Bash is an sh-compatible command language interpreter that executes commands read from the standard input or from a file. Bash also incorporates useful features from the Korn and C shells (ksh and csh). Bash is intended to be a conformant implementation of the Shell and Utilities portion of the IEEE POSIX specification (IEEE Standard 1003.1). Bash can be configured to be POSIX-confor‐ mant by default. OPTIONS All of the single-character shell options documented in the description of the set builtin command, including -o, can be used as options when the shell is invoked. In addition, bash interprets the following options when it is invoked: -c If the -c option is present, then commands are read from the first non-option argu‐ ment command_string. If there are arguments after the command_string, the first ar‐ gument is assigned to $0 and any remaining arguments are assigned to the positional
help — когда не работает man
Не у каждой команды имеется свое полноценное руководство и не всегда оно требуется. В таких случаях помогает help, которая выводит краткую справку.
history: history [-c] [-d смещение] [n] или history -anrw [файл] или history -ps аргумент [аргумент. ] Display or manipulate the history list. Display the history list with line numbers, prefixing each modified entry with a `*'. An argument of N lists only the last N entries. Options: -c clear the history list by deleting all of the entries -d offset delete the history entry at position OFFSET. Negative offsets count back from the end of the history list -a append history lines from this session to the history file -n read all history lines not already read from the history file and append them to the history list -r read the history file and append the contents to the history list -w write the current history to the history file -p perform history expansion on each ARG and display the result without storing it in the history list -s append the ARGs to the history list as a single entry If FILENAME is given, it is used as the history file. Otherwise, if HISTFILE has a value, that is used, else ~/.bash_history. If the HISTTIMEFORMAT variable is set and not null, its value is used as a format string for strftime(3) to print the time stamp associated
Похожий вариант — вывод справки через специальные ключи — -h или —help.
Tab — автозавершение команды
Командная строка Linux может предложить вам доступные варианты завершения команды. Например, если вы хотите узнать, куда можно перейти из текущей папки, наберите cd, затем дважды нажмите Tab. Если хотите узнать, какие папки начинаются с символа точки, введите cd . и завершите двойным нажатием Tab. Работает с любой командой, но только в современных оболочках — bash и zsh.
debtop@DebTop:~$ cd .aptitude/ .gnupg/ .mozilla/ Видео/ Изображения/ Рабочий стол/ .cache/ .kde/ .pki/ Документы/ Музыка/ Шаблоны/ .config/ .local/ snap/ Загрузки/ Общедоступные/ debtop@DebTop:~$ cd . ./ .aptitude/ .config/ .kde/ .mozilla/ ../ .cache/ .gnupg/ .local/ .pki/
cat /etc/*-release — какой дистрибутив установлен на моей машине
Если вы задумывались об установке Linux или уже использовали эту ОС, вы должны были знать, что существует несколько дистрибутивов. В зависимости от дистрибутива команды могут отличаться, поэтому полезно иметь возможность узнать, какой именно дистрибутив на этой машине. Это можно сделать и через информацию о системе, из графического интерфейса окружения пользователя, но наша статья о терминале. Команда cat /etc/*-release (без пробелов) покажет вам основную информацию о дистрибутиве — имя, версия, и т.д. Аналогами в данном случае будут являться lsb_release -a, которая выведет почти ту же информацию, а lsb_release -i напишет ID дистрибутива.
debtop@DebTop:~$ cat /etc/*-release PRETTY_NAME="Debian GNU/Linux 10 (buster)" NAME="Debian GNU/Linux" VERSION_ID="10" VERSION="10 (buster)" VERSION_CODENAME=buster ID=debian HOME_URL="https://www.debian.org/" SUPPORT_URL="https://www.debian.org/support" BUG_REPORT_URL="https://bugs.debian.org/" debtop@DebTop:~$ lsb_release -a No LSB modules are available. Distributor ID: Debian Description: Debian GNU/Linux 10 (buster) Release: 10 Codename: buster debtop@DebTop:~$ lsb_release -i Distributor ID: Debian
whoami — какой пользователь сейчас используется
Терминал Linux позволяет работать от имени любого пользователя, но не всегда удается удержать в памяти текущего пользователя. Чтобы вспомнить текущего пользователя, существует простая команда whoami.
debtop@DebTop:~$ whoami desktop
whatis — что за программа?
Команда Linux терминала whatis дает краткое описание любой установленной программы.
debtop@DebTop:~$ whatis nano nano (1) - Nano's ANOther editor, an enhanced free Pico clone debtop@DebTop:~$ whatis apt apt (8) - command-line interface debtop@DebTop:~$ whatis krita krita: ничего подходящего не найдено.
Очевидно, что, если программа не установлена, то получить ее описание не получится.
whereis — полный путь к программе
Допустим, вы нашли нужную программу, но хотите попасть в ее директорию. Узнать директорию программы поможет whereis, показывающая полный путь к исполняемому файлу программы.
debtop@DebTop:~$ whereis bash bash: /usr/bin/bash /etc/bash.bashrc /usr/share/man/man1/bash.1.gz
Команды управления сетью
hostname, ifconfig — управление сетью
Эти команды покажут DNS-домен и IP-адрес вашего компьютера.
debtop@DebTop:~$ hostname DebTop debtop@DebTop:~$ hostname -i 127.0.1.1 debtop@DebTop:~$ ifconfig bash: ifconfig: команда не найдена
В некоторых версиях дистрибутивов Linux поддерживается команда ifconfig, которая также выводит текущий IP, но она работает не всегда. Взамен устаревшей ifconfig современные дистрибутивы отзываются на ip a[ddress], которая выведет на экран настройки сети и позволяет их редактировать. Команда является частью пакета утилит для настройки параметров сетевых устройств — iproute2. Команды из набора iproute2 пригодятся системным администраторам или тем, кто хочет создать доменную сеть дома.
debtop@DebTop:~$ ip a 1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: enp4s0: mtu 1500 qdisc pfifo_fast state DOWN group default qlen 1 000 link/ether b4:b5:2f:7f:fe:eb brd ff:ff:ff:ff:ff:ff 3: wlo1: mtu 1500 qdisc mq state UP group default qlen 1000 link/ether a4:17:31:2a:bc:59 brd ff:ff:ff:ff:ff:ff inet 192.168.1.195/24 brd 192.168.1.255 scope global dynamic noprefixroute wlo1 valid_lft 85273sec preferred_lft 85273sec inet6 fe80::3f0f:a837:e4c0:e52d/64 scope link noprefixroute valid_lft forever preferred_lft forever debtop@DebTop:~$ ip Usage: ip [ OPTIONS ] OBJECT < COMMAND | help >ip [ -force ] -batch filename where OBJECT := < link | address | addrlabel | route | rule | neigh | ntable | tunnel | tuntap | maddress | mroute | mrule | monitor | xfrm | netns | l2tp | fou | macsec | tcp_metrics | token | netconf | ila | vrf | sr >OPTIONS := < -V[ersion] | -s[tatistics] | -d[etails] | -r[esolve] | -h[uman-readable] | -iec | -j[son] | -p[retty] | -f[amily] < inet | inet6 | ipx | dnet | mpls | bridge | link >| -4 | -6 | -I | -D | -M | -B | -0 | -l[oops] < maximum-addr-flush-attempts >| -br[ief] | -o[neline] | -t[imestamp] | -ts[hort] | -b[atch] [filename] | -rc[vbuf] [size] | -n[etns] name | -a[ll] | -c[olor]>
ping — диагностика неисправностей сети
Ping используют для поиска неисправностей, тестирования и диагностики сетевых соединений. Команда отправляет сообщение на указанный IP адрес и ждет ответ. Когда пакет адресат получает пакет, он отправляет ответ. Таким образом можно определить задержку сообщений или потерю пакетов.
Достаточно ввести, например, ping google.com, компьютер сам определит IP адрес домена и продолжит выполняться, пока ее не отменить сочетанием Ctrl+C.
Команды для управления файлами и директориями
Теперь, когда мы выяснили, где находится терминал, мы можем перейти в его директорию. Однако, этого делать не стоит, иначе можно что-нибудь сломать. Давайте попробуем поработать с директорией песочницы.
mkdir — создание директории
Для начала песочницу необходимо создать. Сделать это очень просто, находясь в домашней директории пользователя введем в bash:
mkdir playpen
Отлично, и что дальше? Точно ли директория создалась?
ls — list, отобразить директории и файлы
Чтобы убедиться в наличии директории нужно набрать ls, после выполнения команда покажет все каталоги и файлы.
debtop@DebTop:~$ mkdir playpen debtop@DebTop:~$ ls playpen Видео Загрузки Музыка 'Рабочий стол' snap Документы Изображения Общедоступные Шаблоны
cd — change directory, сменить директорию
Теперь перейдем в созданную директорию. Для навигации в терминале Linux нужно ввести cd имя_директории. В нашем случае cd playpen.
debtop@DebTop:~$ cd playpen debtop@DebTop:~/playpen$
Если работа в данной директории закончена и необходимо подняться на уровень вверх из текущей директории, используйте «cd пробел .. (две точки)»:
cd ..
А если вы работаете одновременно в двух директориях и периодически перемещаетесь из одной в другую, не нужно постоянно держать в голове, какой же была предыдущая. Достаточно использовать быстрый переход к предыдущей директории «cd пробел — (дефис)»:
cd —
debtop@DebTop:~/playpen/dir00$ cd /usr/lib/x86_64-linux-gnu/audacious debtop@DebTop:/usr/lib/x86_64-linux-gnu/audacious$ cd - /home/debtop/playpen/dir00 debtop@DebTop:~/playpen/dir00$ cd - /usr/lib/x86_64-linux-gnu/audacious debtop@DebTop:/usr/lib/x86_64-linux-gnu/audacious$ cd - /home/debtop/playpen/dir00 debtop@DebTop:~/playpen/dir00$ cd ..
pwd — где я сейчас?
Обратите внимание, как только мы сменили директорию, поменялся и префикс до символа $, так терминал показывает нам, где мы находимся в данный момент. Конечно, терминал не станет отображать полный путь, если он слишком длинный, поэтому не стоит всегда полагаться на префикс. Быстро понять текущую рабочую директорию поможет команда pwd. Расшифровка этой команды простая — три английских слова — Print Working Directory. На самом деле расшифровка команд Linux всегда простая, они все произошли от английских слов, но были сокращены для лучшего запоминания.
Обратно к песочнице. Пока что директория (также каталог, папка) пуста и не содержит ни одного файла. Давайте создадим в ней 43 директории, в каждой по 43 файла. Можно создавать вручную, каждый раз прописывая имя, а можно поступить проще:
mkdir dir
Синтаксис команды простой: mkdir создает директорию, dir задает начальное имя для каждой новой директории, числа в фигурных скобках указывают переменную часть имени создаваемых папок. То есть, команда mkdir test_folder_ создала бы нам 5 папок с начальным именем test_folder_0.
Давайте проверим, создались ли наши тестовые папки — ls.
debtop@DebTop:~/playpen$ ls dir00 dir03 dir06 dir09 dir12 dir15 dir18 dir21 dir24 dir27 dir30 dir33 dir36 dir39 dir42 dir01 dir04 dir07 dir10 dir13 dir16 dir19 dir22 dir25 dir28 dir31 dir34 dir37 dir40 dir02 dir05 dir08 dir11 dir14 dir17 dir20 dir23 dir26 dir29 dir32 dir35 dir38 dir41
Как создать файл?
Замечательно, теперь создадим по 43 файла в каждой. Для создания файла существует более 10 разных способов, самый простой:
> имя_файла
На самом деле >, как и обратный знак < не совсем являются командами, это символы перенаправления или связи. Однако, если перед именем несуществующего файла поставить знак >вместе с указанием расширения файла, в текущей директории появится пустой файл.
Но нам требуется поместить по 42 файла в 42 директории, а терминал Linux откажется воспринимать команду со знаком перенаправления, поэтому используем команду touch. Эта команда позволяет задать время последнего изменения файла или создать новые файлы:
touch dir/text.txt
debtop@DebTop:~/playpen$ touch dir/text.txt debtop@DebTop:~/playpen$ ls dir00 text00.txt text06.txt text12.txt text18.txt text24.txt text30.txt text36.txt text42.txt text01.txt text07.txt text13.txt text19.txt text25.txt text31.txt text37.txt text02.txt text08.txt text14.txt text20.txt text26.txt text32.txt text38.txt text03.txt text09.txt text15.txt text21.txt text27.txt text33.txt text39.txt text04.txt text10.txt text16.txt text22.txt text28.txt text34.txt text40.txt text05.txt text11.txt text17.txt text23.txt text29.txt text35.txt text41.txt
rm — remove, удаление
Чтобы удалить какой-либо файл, достаточно ввести команду rm с именем файла:
rm text00.txt
Можно удалить несколько:
Если попытаться удалить целый каталог по аналогии, то ничего не получится. Все потому, что для удаления каталога нужна другая команда: rmdir:
rmdir delete_me
Команда rmdir тоже не всесильна, она не позволит удалить каталог, в котором есть что-то еще — файл или другой каталог (даже пустой).
Для удаления каталога с содержимым можно использовать команду rm с опцией рекурсивного удаления -r. Обратите внимание на картинку ниже, все описанные переходы по директориям, упомянутые в описании команды cd действуют и для rm. Поэтому, при нахождении в подкаталоге dir01, команда будет выглядеть вот так:
rm -r ../dir03
debtop@DebTop:~/playpen/dir01$ rm text00.txt debtop@DebTop:~/playpen/dir01$ rm text.txt debtop@DebTop:~/playpen/dir01$ mkdir delete_me debtop@DebTop:~/playpen/dir01$ ls delete_me text16.txt text20.txt text24.txt text28.txt text32.txt text36.txt text40.txt text13.txt text17.txt text21.txt text25.txt text29.txt text33.txt text37.txt text41.txt text14.txt text18.txt text22.txt text26.txt text30.txt text34.txt text38.txt text42.txt text15.txt text19.txt text23.txt text27.txt text31.txt text35.txt text39.txt debtop@DebTop:~/playpen/dir01$ rm delete_me rm: невозможно удалить 'delete_me': Это каталог debtop@DebTop:~/playpen/dir01$ rmdir delete_me debtop@DebTop:~/playpen/dir01$ ls text13.txt text17.txt text21.txt text25.txt text29.txt text33.txt text37.txt text41.txt text14.txt text18.txt text22.txt text26.txt text30.txt text34.txt text38.txt text42.txt text15.txt text19.txt text23.txt text27.txt text31.txt text35.txt text39.txt text16.txt text20.txt text24.txt text28.txt text32.txt text36.txt text40.txt debtop@DebTop:~/playpen/dir01$ rmdir ../dir03 rmdir: не удалось удалить '../dir03': Каталог не пуст debtop@DebTop:~/playpen/dir01$ rm -r ../dir03 debtop@DebTop:~/playpen/dir01$ ls .. dir00 dir04 dir07 dir10 dir13 dir16 dir19 dir22 dir25 dir28 dir31 dir34 dir37 dir40 dir01 dir05 dir08 dir11 dir14 dir17 dir20 dir23 dir26 dir29 dir32 dir35 dir38 dir41 dir02 dir06 dir09 dir12 dir15 dir18 dir21 dir24 dir27 dir30 dir33 dir36 dir39 dir42
cp — copy, копирование
Кроме создания и удаления файлов и директорий терминал позволяет их копирование.
Снова перейдем в директорию dir02 и скопируем файл text00.txt в директорию dir01:
cp text00.txt /home/debtop/playpen/dir01
Поскольку text00.txt находится в текущей директории, до него можно не писать полный путь. Такое указание пути называется относительным. Путь до dir01 мы указали полностью, от домашней директории, такой путь называется абсолютный. Можно было указать просто ../dir01, тогда это был бы снова относительный путь.
Если попробовать повторить копирование теперь, когда в dir01 опять появился файл text00.txt, внешне не произойдет ничего, но на самом деле файл будет заменен на файл с тем же именем без каких-либо вопросов.
debtop@DebTop:~/playpen/dir01$ cd ../dir02 debtop@DebTop:~/playpen/dir02$ cp text00.txt home/debtop/playpen/dir01 cp: невозможно создать обычный файл 'home/debtop/playpen/dir01': Нет такого файла или каталога debtop@DebTop:~/playpen/dir02$ cp text00.txt /home/debtop/playpen/dir01 debtop@DebTop:~/playpen/dir02$ ls ../dir01 text00.txt text16.txt text20.txt text24.txt text28.txt text32.txt text36.txt text40.txt text13.txt text17.txt text21.txt text25.txt text29.txt text33.txt text37.txt text41.txt text14.txt text18.txt text22.txt text26.txt text30.txt text34.txt text38.txt text42.txt text15.txt text19.txt text23.txt text27.txt text31.txt text35.txt text39.txt
Каталоги копируются по тому же принципу, только нужно не забывать про добавление опции рекурсивного копирования:
cp -r dir00 dir03
debtop@DebTop:~/playpen$ ls dir00 dir04 dir07 dir10 dir13 dir16 dir19 dir22 dir25 dir28 dir31 dir34 dir37 dir40 dir01 dir05 dir08 dir11 dir14 dir17 dir20 dir23 dir26 dir29 dir32 dir35 dir38 dir41 dir02 dir06 dir09 dir12 dir15 dir18 dir21 dir24 dir27 dir30 dir33 dir36 dir39 dir42 debtop@DebTop:~/playpen$ cp dir00 dir03 cp: не указан -r; пропускается каталог 'dir00' debtop@DebTop:~/playpen$ cp -r dir00 dir03 debtop@DebTop:~/playpen$ cp -r dir00 dir03/ debtop@DebTop:~/playpen$ cd dir03 debtop@DebTop:~/playpen/dir03$ ls dir00 text05.txt text11.txt text17.txt text23.txt text29.txt text35.txt text41.txt text00.txt text06.txt text12.txt text18.txt text24.txt text30.txt text36.txt text42.txt text01.txt text07.txt text13.txt text19.txt text25.txt text31.txt text37.txt text02.txt text08.txt text14.txt text20.txt text26.txt text32.txt text38.txt text03.txt text09.txt text15.txt text21.txt text27.txt text33.txt text39.txt text04.txt text10.txt text16.txt text22.txt text28.txt text34.txt text40.txt
Если при копировании каталога или файла в качестве адреса копирования указать имя несуществующей директории (или файла), то система автоматически воспримет это как команду создать файл или каталог с таким именем.
Когда вы хотите скопировать не всю директорию целиком, а только ее содержимое, укажите слэш после места назначения, а после него поставьте звездочку (*):
cp -r dir00/* dir03/dir
Принцип действия команд rm и cp очень простой и очевидный, но не стоит забывать, что новичку многое кажется сложнее, чем есть на самом деле.
mv, move — перемещение
Третья команда для управления файлами — mv — перемещает файлы и директории.
Принцип действия полностью аналогичен предыдущим двум командам:
mv что_перемещаем куда_перемещаем
debtop@DebTop:~/playpen$ mv dir16 dir19/dir debtop@DebTop:~/playpen$ ls dir19 dir text05.txt text11.txt text17.txt text23.txt text29.txt text35.txt text41.txt text00.txt text06.txt text12.txt text18.txt text24.txt text30.txt text36.txt text42.txt text01.txt text07.txt text13.txt text19.txt text25.txt text31.txt text37.txt text02.txt text08.txt text14.txt text20.txt text26.txt text32.txt text38.txt text03.txt text09.txt text15.txt text21.txt text27.txt text33.txt text39.txt text04.txt text10.txt text16.txt text22.txt text28.txt text34.txt text40.txt
При перемещении каталогов мы перемещаем их целиком так, что они перестают существовать в исходном местоположении. То есть, каталог dir16 из предыдущего примера больше не существует в каталоге ~/playpen. Но это не всегда удобно, бывает необходимо переместить не сам каталог, а только содержимое — все файлы, каталоги и файлы, вложенные в них. Для этого используется опция —v[erbose], покажем на примере. Переместим все содержимое папки dir19 в папку dir17 командой mv, оставив папку dir19 пустой:
mv -v dir19/* dir17/
debtop@DebTop:~/playpen$ ls dir00 dir04 dir08 dir12 dir17 dir21 dir25 dir29 dir33 dir37 dir41 dir01 dir05 dir09 dir13 dir18 dir22 dir26 dir30 dir34 dir38 dir42 dir02 dir06 dir10 dir14 dir19 dir23 dir27 dir31 dir35 dir39 dir03 dir07 dir11 dir15 dir20 dir24 dir28 dir32 dir36 dir40 debtop@DebTop:~/playpen$ man mv debtop@DebTop:~/playpen$ ls dir19 dir text05.txt text11.txt text17.txt text23.txt text29.txt text35.txt text41.txt text00.txt text06.txt text12.txt text18.txt text24.txt text30.txt text36.txt text42.txt text01.txt text07.txt text13.txt text19.txt text25.txt text31.txt text37.txt text02.txt text08.txt text14.txt text20.txt text26.txt text32.txt text38.txt text03.txt text09.txt text15.txt text21.txt text27.txt text33.txt text39.txt text04.txt text10.txt text16.txt text22.txt text28.txt text34.txt text40.txt debtop@DebTop:~/playpen$ mv -v dir19/* dir17/ переименован 'dir19/dir' -> 'dir17/dir' переименован 'dir19/text00.txt' -> 'dir17/text00.txt' переименован 'dir19/text01.txt' -> 'dir17/text01.txt' переименован 'dir19/text02.txt' -> 'dir17/text02.txt' переименован 'dir19/text03.txt' -> 'dir17/text03.txt' переименован 'dir19/text40.txt' -> 'dir17/text40.txt' переименован 'dir19/text41.txt' -> 'dir17/text41.txt' переименован 'dir19/text42.txt' -> 'dir17/text42.txt' debtop@DebTop:~/playpen$ ls dir00 dir04 dir08 dir12 dir17 dir21 dir25 dir29 dir33 dir37 dir41 dir01 dir05 dir09 dir13 dir18 dir22 dir26 dir30 dir34 dir38 dir42 dir02 dir06 dir10 dir14 dir19 dir23 dir27 dir31 dir35 dir39 dir03 dir07 dir11 dir15 dir20 dir24 dir28 dir32 dir36 dir40 debtop@DebTop:~/playpen$ ls dir19 debtop@DebTop:~/playpen$ ls dir17 dir text05.txt text11.txt text17.txt text23.txt text29.txt text35.txt text41.txt text00.txt text06.txt text12.txt text18.txt text24.txt text30.txt text36.txt text42.txt text01.txt text07.txt text13.txt text19.txt text25.txt text31.txt text37.txt text02.txt text08.txt text14.txt text20.txt text26.txt text32.txt text38.txt text03.txt text09.txt text15.txt text21.txt text27.txt text33.txt text39.txt text04.txt text10.txt text16.txt text22.txt text28.txt text34.txt text40.txt
Глубина вложенности
Можно пойти дальше — создать папку с большой вложенностью dir18 и переместить только файлы первого уровня в папку dir19:
find dir18/ -maxdepth 1 -type f -print0 | xargs -0 mv -t dir19
Эта сложная команда найдет (find) все файлы (-type f) с глубиной вложенности 1 (-maxdepth 1) внутри dir18 и переместит их в dir19 как обычные файлы (mv -t). Часть «xargs -0» служит в роли команды, связующей две других и позволяет им работать вместе. С глубиной вложенности -maxdepth можно экспериментировать, задавать ей разные значения (1, 2, 3 и т.д.) получая новый результат каждый раз.
Команды для архивирования
Важный аспект работы с файлами — возможность создавать архивы. В Linuxе это реализовано с помощью утилит терминала. Рассмотрим несколько базовых команд архивирования:
- gzip — создать архив. Работает следующим образом: gzip файл.расширение. Можно сразу несколько, например, gzip text12.txt text13.txt.
debtop@DebTop:~/playpen$ cd dir00 debtop@DebTop:~/playpen/dir00$ gzip text14.txt debtop@DebTop:~/playpen/dir00$ ls text00.txt text07.txt text14.txt.gz text21.txt text28.txt text35.txt text42.txt text01.txt text08.txt text15.txt text22.txt text29.txt text36.txt text02.txt text09.txt text16.txt text23.txt text30.txt text37.txt text03.txt text10.txt text17.txt text24.txt text31.txt text38.txt text04.txt text11.txt text18.txt text25.txt text32.txt text39.txt text05.txt text12.txt text19.txt text26.txt text33.txt text40.txt text06.txt text13.txt text20.txt text27.txt text34.txt text41.txt
- gunzip — распаковать архив — gunzip файл.расширение.gz.
debtop@DebTop:~/playpen/dir00$ ls text00.txt text07.txt text14.txt.gz text21.txt text28.txt text35.txt text42.txt text01.txt text08.txt text15.txt text22.txt text29.txt text36.txt text02.txt text09.txt text16.txt text23.txt text30.txt text37.txt text03.txt text10.txt text17.txt text24.txt text31.txt text38.txt text04.txt text11.txt text18.txt text25.txt text32.txt text39.txt text05.txt text12.txt text19.txt text26.txt text33.txt text40.txt text06.txt text13.txt text20.txt text27.txt text34.txt text41.txt debtop@DebTop:~/playpen/dir00$ gunzip text14.txt.gz debtop@DebTop:~/playpen/dir00$ ls text00.txt text06.txt text12.txt text18.txt text24.txt text30.txt text36.txt text42.txt text01.txt text07.txt text13.txt text19.txt text25.txt text31.txt text37.txt text02.txt text08.txt text14.txt text20.txt text26.txt text32.txt text38.txt text03.txt text09.txt text15.txt text21.txt text27.txt text33.txt text39.txt text04.txt text10.txt text16.txt text22.txt text28.txt text34.txt text40.txt text05.txt text11.txt text17.txt text23.txt text29.txt text35.txt text41.txt
- zip — более привычный формат архива. Чтобы передать файл на другую операционную систему, и чтобы адресат мог его распаковать лучше использовать утилиту zip.
Утилита zip терминала Linux позволяет упаковать сразу несколько файлов в один архив (gzip также позволяет поместить несколько файлов в архив, но с ней сложнее разобраться) с помощью рекурсивной опции -r. Текст команды Linux:
zip -r texts.zip text12.txt text13.txt
В данном случае texts.zip будет названием архива, а text12.txt и text13.txt — файлы, которые нужно поместить в архив.
debtop@DebTop:~/playpen/dir00$ zip -r texts.zip text12.txt text13.txt adding: text12.txt (stored 0%) adding: text13.txt (stored 0%) debtop@DebTop:~/playpen/dir00$ ls text00.txt text06.txt text12.txt text18.txt text24.txt text30.txt text36.txt text42.txt text01.txt text07.txt text13.txt text19.txt text25.txt text31.txt text37.txt texts.zip text02.txt text08.txt text14.txt text20.txt text26.txt text32.txt text38.txt text03.txt text09.txt text15.txt text21.txt text27.txt text33.txt text39.txt text04.txt text10.txt text16.txt text22.txt text28.txt text34.txt text40.txt text05.txt text11.txt text17.txt text23.txt text29.txt text35.txt text41.txt
- tar — создание резервных копий. Утилита tar создает архивы с расширением .tar, утилиту обычно используют для резервного копирования так как она не сжимает файлы, а только собирает в архив. Чтобы создать архив .tar, выполните команду с опциями —cvf. Например:
tar -cvf newark.tar text07.txt ../dir22
Создаст архив с именем newark.tar, в который будут помещены файл text.07.txt и все файлы из каталога dir22, располагающегося внутри родительского каталога.
Для просмотра содержимого .tar архива используются опции -tvf:
tar -tvf newark.tar
debtop@DebTop:~/playpen/dir00$ tar -cvf newark.tar text07.txt ../dir22 text07.txt tar: Удаляется начальный `../' из имен объектов ../dir22/ ../dir22/text04.txt tar: Удаляются начальные `../' из целей жестких ссылок ../dir22/text07.txt ../dir22/text40.txt ../dir22/text08.txt ../dir22/text32.txt ../dir22/text28.txt ../dir22/text26.txt ../dir22/text11.txt ../dir22/text25.txt debtop@DebTop:~/playpen/dir00$ tar -tvf newark.tar -rw-r--r-- debtop/debtop 0 2020-11-25 13:44 text07.txt drwxr-xr-x debtop/debtop 0 2020-11-25 13:44 dir22/ -rw-r--r-- debtop/debtop 0 2020-11-25 13:44 dir22/text04.txt -rw-r--r-- debtop/debtop 0 2020-11-25 13:44 dir22/text07.txt -rw-r--r-- debtop/debtop 0 2020-11-25 13:44 dir22/text40.txt -rw-r--r-- debtop/debtop 0 2020-11-25 13:44 dir22/text08.txt -rw-r--r-- debtop/debtop 0 2020-11-25 13:44 dir22/text32.txt -rw-r--r-- debtop/debtop 0 2020-11-25 13:44 dir22/text28.txt -rw-r--r-- debtop/debtop 0 2020-11-25 13:44 dir22/text26.txt -rw-r--r-- debtop/debtop 0 2020-11-25 13:44 dir22/text11.txt -rw-r--r-- debtop/debtop 0 2020-11-25 13:44 dir22/text25.txt
Опции для распаковки .tar архива -xvf:
tar -xvf newark.tar
-rw-r--r-- debtop/debtop 0 2020-11-25 13:44 dir22/text27.txt -rw-r--r-- debtop/debtop 0 2020-11-25 13:44 dir22/text39.txt hrw-r--r-- debtop/debtop 0 2020-11-25 13:44 text07.txt ссылка на text07.txt debtop@DebTop:~/playpen/dir00$ ls arch.tar text05.txt text11.txt text17.txt text23.txt newark.tar text35.txt text41.txt dir00 text06.txt text12.txt text18.txt text24.txt scrolls.tar text36.txt text42.txt text01.txt text07.txt text13.txt text19.txt text25.txt text31.txt text37.txt text02.txt text08.txt text14.txt text20.txt text26.txt text32.txt text38.txt text03.txt text09.txt text15.txt text21.txt text27.txt text33.txt text39.txt text04.txt text10.txt text16.txt text22.txt text28.txt text34.txt text40.txt texts.zip
После выполнения в текущий каталог будут скопированы все файлы из архива, но архив не будет удален. Удалить его можно, выполнив rm.
Команды для работы с текстом
Nano, Vim — редактирование текстовых файлов
Как посмотреть содержимое файла в Linux терминале? Через утилиты терминала Linux часто требуется открыть или отредактировать текстовые файлы. Для этого перейдем в директорию dir42 и откроем text42.txt с помощью Nano — простого текстового редактора.
nano text42.txt
Запишем текст в файле, затем сохраним его сочетанием Ctrl+O (^ в терминале Linux всегда значит Ctrl) и выйдем сочетанием Ctrl+X. Nano позволяет редактировать файлы прямо из окна терминала, обладает базовым, но не очень богатым набором функций. Кроме Nano есть еще более продвинутый Vim, который открывает гораздо большие возможности редактирования файлов. Только Vim не всегда установлен в систему и из него сложнее выйти, потому что он не отображает подсказки. Для выхода из Vim используйте :q, для выхода без сохранения изменений — :q! и :w для сохранения всех изменений. Обязательно сначала использовать двоеточие, так как оно активирует командный режим.
grep — поиск
Чтобы найти текст в файле используйте grep, эта команда выведет соответствующие запросу строки текста. Можно искать словом, строкой или регулярным выражением, а вывод может быть файлом или папкой, совпадающим или наоборот — несовпадающим. Полезно использовать grep при поиске по большим логам.
Кроме непосредственно grep есть варианты pgrep, fgrep, egrep, которые выполняют ту же функцию, но для других целей. Часто grep используют в сочетании с другими командами, чтобы упростить работу с большими объемами данных, ниже мы еще увидим примеры такого использования.
head, tail — начало и конец текста
Команды head и tail используются для вывода первых и последних строк текста в одном или нескольких документах.
head/tail опции файл
По умолчанию команды выводят 10 строк текста, но количество можно изменить с помощью опции -n. Специально для эксперимента мы создали большой текстовый файл, из которого хотим получить ровно 1 первую или последнюю большую строку:
head -n 1 text00.txt
tail -n 1 text00.txt
debtop@DebTop:~/playpen/dir00$ head -n 1 text00.txt Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla ut lacus ut justo blandit mattis . Sed magna elit, pharetra ac nulla eu, vulputate elementum ex. Donec porta sapien at dui males uada, quis pretium neque volutpat. Aliquam a tincidunt mi. Nunc posuere vehicula velit, sed int erdum lorem ullamcorper at. Aliquam finibus ultrices metus pharetra elementum. Aliquam erat vol utpat. In sit amet sapien commodo dolor feugiat sodales at vitae turpis. Donec ullamcorper dolo r quis lacus tempor, ac aliquet sem consectetur. Duis nec dignissim ligula. Sed gravida sed arc u quis commodo. Aliquam vestibulum nunc sed viverra imperdiet. Suspendisse accumsan sollicitudi n ex, interdum facilisis eros efficitur non. debtop@DebTop:~/playpen/dir00$ tail -n 1 text00.txt Aenean non ullamcorper diam. Ut iaculis vehicula libero sit amet elementum. Nullam ipsum metus, molestie vehicula dui in, tempus finibus nisl. In hac habitasse platea dictumst. In vehicula v elit nec massa porttitor finibus. Nulla libero justo, egestas vitae fringilla ut, gravida eu ri sus. Ut eget risus erat. Aenean interdum pretium semper. Aliquam vehicula dolor non augue lacin ia sodales. Morbi molestie massa sed enim placerat, id euismod odio condimentum. Nunc aliquet l acinia lacus, quis mattis tortor viverra sed. Vestibulum ullamcorper aliquet nibh, nec lacinia nunc tincidunt fringilla. Mauris sollicitudin nec lectus eget mollis. Aliquam eu accumsan nulla.
С помощью опции -c можно запросить уже не строки, а байты.
Например, команды для получения 100 байт текста:
head -с 100 text00.txt
debtop@DebTop:~/playpen/dir00$ tail -c 100 text00.txt ia nunc tincidunt fringilla. Mauris sollicitudin nec lectus eget mollis. Aliquam eu accumsan nulla. debtop@DebTop:~/playpen/dir00$ head -c 100 text00.txt Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla ut lacus ut justo blandit mattis. Sed
tail -с 100 text00.txt
Другие опции можно посмотреть через man head.
HEAD(1) User Commands HEAD(1) NAME head - output the first part of files SYNOPSIS head [OPTION]. [FILE]. DESCRIPTION Print the first 10 lines of each FILE to standard output. With more than one FILE, precede each with a header giving the file name. With no FILE, or when FILE is -, read standard input. Mandatory arguments to long options are mandatory for short options too. -c, --bytes=[-]NUM print the first NUM bytes of each file; with the leading '-', print all but the last NUM bytes of each file -n, --lines=[-]NUM print the first NUM lines instead of the first 10; with the leading '-', print all but the last NUM lines of each file -q, --quiet, --silent never print headers giving file names -v, --verbose
Команды для управления процессами
Операционная система Linux не имеет встроенного графического диспетчера задач в отличие от Windows, вместо этого всеми процессами можно управлять из терминала. Говорят, что Linux стабильнее винды, но иногда все равно приходится гуглить «Как завершить процесс Linux», потому что что-то зависло.
kill / pkill / killall — завершить процесс
Первый вопрос — почему так много, какую команду использовать? Давайте по порядку:
- kill — убить процесс по его идентификатору (Process ID);
- pkill — убить процесс по его имени;
- killall — убить все процессы с указанным именем.
ps / pgrep — узнать ID процесса
Если вы не компьютер, то вряд ли вам известен ID нужного процесса. PS (Process Status) выведет на экран информацию о запущенных процессах. Чтобы показать список всех активных процессов, используется ps axu.
debtop@DebTop:~/playpen$ top top - 14:21:22 up 8 days, 21:57, 3 users, load average: 0,49, 0,66, 0,65 Tasks: 181 total, 1 running, 180 sleeping, 0 stopped, 0 zombie %Cpu(s): 0,8 us, 0,4 sy, 0,0 ni, 98,7 id, 0,0 wa, 0,0 hi, 0,0 si, 0,0 st MiB Mem : 7856,4 total, 4009,2 free, 1944,6 used, 1902,6 buff/cache MiB Swap: 8068,0 total, 7913,4 free, 154,6 used. 5390,8 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 690 root 20 0 309888 34416 16856 S 2,0 0,4 5:46.67 Xorg 11426 debtop 20 0 1195064 78272 62036 S 1,7 1,0 0:15.55 konsole 936 debtop 20 0 2994244 59840 36732 S 1,3 0,7 6:10.33 kwin_x11 11586 debtop 20 0 9188248 513296 127392 S 1,0 6,4 14:44.20 chrome 11068 debtop 20 0 973096 310508 142424 S 0,3 3,9 2:27.42 chrome 11107 debtop 20 0 390416 110176 62368 S 0,3 1,4 0:44.15 chrome 11516 debtop 20 0 9177080 384808 114828 S 0,3 4,8 0:58.68 chrome 1 root 20 0 169620 6872 5272 S 0,0 0,1 0:02.15 systemd 2 root 20 0 0 0 0 S 0,0 0,0 0:00.02 kthreadd 3 root 0 -20 0 0 0 I 0,0 0,0 0:00.00 rcu_gp 4 root 0 -20 0 0 0 I 0,0 0,0 0:00.00 rcu_par_gp 6 root 0 -20 0 0 0 I 0,0 0,0 0:00.00 kworker/0:0H-kblockd 8 root 0 -20 0 0 0 I 0,0 0,0 0:00.00 mm_percpu_wq 9 root 20 0 0 0 0 S 0,0 0,0 0:00.07 ksoftirqd/0 10 root 20 0 0 0 0 I 0,0 0,0 0:09.29 rcu_sched 11 root 20 0 0 0 0 I 0,0 0,0 0:00.00 rcu_bh 12 root rt 0 0 0 0 S 0,0 0,0 0:00.17 migration/0 14 root 20 0 0 0 0 S 0,0 0,0 0:00.00 cpuhp/0 15 root 20 0 0 0 0 S 0,0 0,0 0:00.00 cpuhp/1 16 root rt 0 0 0 0 S 0,0 0,0 0:00.37 migration/1 17 root 20 0 0 0 0 S 0,0 0,0 0:00.15 ksoftirqd/1 19 root 0 -20 0 0 0 I 0,0 0,0 0:00.00 kworker/1:0H-kblockd
Проблема в том, что найти нужный процесс среди этого полотна очень сложно. Решений этой проблемы несколько.
1. top (Table Of Processes) — каждые 2 секунды обновляет активные процессы. Колонка PID указывает на ID процесса, USER на пользователя и т.д. Удобно. Если процесс активен постоянно, но уследить за постоянно обновляющимся списком не всегда получается.
2. Более продвинутые утилиты командной строки Linux — atop, htop. Отображают не только активные процессы с обновлением в две секунды, но и контроль над загрузкой и т.д. Утилиты полезны для системных администраторов, но для обычного пользователя все-таки перебор.
3. ps axu | grep имя_процесса. С помощью утилиты grep можно вычленить нужный процесс, если известно его имя.
debtop@DebTop:~/playpen$ ps axu | grep bash debtop 11468 0.0 0.0 8316 5192 pts/1 Ss 13:20 0:00 /bin/bash debtop 14232 0.0 0.0 6224 888 pts/1 S+ 14:22 0:00 grep bash
4. pidof — самый короткий способ выяснить ID процесса, если известно его имя.
debtop@DebTop:~/playpen$ pidof bash 11468
Пакетные менеджеры или как установить файл
По сравнению с Windows, в Linux установка программы требует чуть больше усилий. Даже для установки браузера Chrome придется залезть в терминал.
dpkg — установить файл с расширением .deb (только для систем на Debian).
Многие программы, скачанные из интернета, которые поддерживаются ОС Linux, имеют расширение .deb. Это файлы, оптимизированные под дистрибутивы на основе Debian (Debian, Ubuntu и Ubuntu-based, Mint и т.д.). Когда вы скачаете и попытаетесь открыть файл (точнее пакет) .deb кликом указателя скорей всего ничего не произойдет, потому что это необходимо делать через dpkg:
dpkg -i package.deb — установит пакет .deb;
dpkg —remove package — удалит пакет. Да, при удалении не требуется указывать расширение, так как пакет уже установлен в системе и идентифицируется по имени.
Примечание: Если вы работали в Windows, вы помните, что приложения удаляются не полностью, остаются пустые папки и записи в реестре. У Linux тоже есть такая особенность, остаточные файлы и папки называются dependencies (зависимости). Избавиться от них в Linux гораздо проще, чем в ОС от Майкрософт. Достаточно ввести:
dpkg —purge package.
apt — менеджер установки пакетов Debian-based
Интересная функция Linux — пакетные менеджеры. В каждом дистрибутиве есть свой пакетный менеджер, который может запрашивать и устанавливать пакеты из удаленных репозиториев. Это очень удобно — требуется знать только название пакета, который желаете установить и команду. Пакетный менеджер по умолчанию в Debian и дистрибутивах на основе Debian — apt (Advanced Packaging Tool).
Для установки пакета с помощью apt необходимо ввести команду:
apt install имя_пакета
Часто для этой операции потребуются права суперпользователя, но об этом см. раздел ниже.
Нередко можно встретить apt-get вместо apt — это тот же самый пакетный менеджер, только более старая его версия. Тем не менее оба варианта существуют и работают. Пакетный менеджер apt объединяет сразу несколько прежних команд (apt-get и apt-cache в apt install и apt search), а также оптимизирует процесс установки пакетов.
Команда для удаления установленного пакета с помощью apt:
apt remove имя_пакета
Для удаления зависимостей вместо remove используется purge:
apt purge имя_пакета
Для автоматического удаления всего лишнего из системы используется apt autoremove.
Автоматическое удаление лишнего — это как встроенный в систему менеджер очистки, команда удаляет все файлы и зависимости, которые больше не требуются в системе, например, потому что соответствующего им приложения больше нет в системе.
yum — менеджер установки пакетов Red Hat
Red Hat — один из наиболее популярных дистрибутивов Linux. Утилита yum написана на python. Это пакетный менеджер Red Hat и дистрибутивов на основе Red Hat, например CentOS. Менеджер yum (Yellowdog Updater, Modified) использует формат пакетов rpm вместо deb, но команды остались прежними:
При удалении пакета менеджер yum по умолчанию всегда сохраняет файлы конфигурации, которые отличаются от изначальных по умолчанию и не имеет команды аналогичной apt purge. Впрочем, способы достижения аналогичного результата существуют всегда.
pacman — менеджер пакетов ArchLinux
Еще один дистрибутив, имеющий свой пакетный менеджер — ArchLinux. Утилита pacman написана на языке C (Си). ArchLinux имеет только одну версию — текущую, которая постоянно обновляется, и для этой системы pacman подходит идеально. Пакеты здесь представляют собой архивы формата .tar.xz.
Пакетный менеджер pacman работает иначе чем yum, apt или dpkg. Чтобы установить или удалить пакет с помощью pacman используются опции:
- -S устанавливает пакет ArchLinux;
- -Sw скачивает, но не устанавливает пакет;
- -U для установки пакетов с локального компьютера;
- -s для поиска пакетов;
- -u для обновления установленных пакетов;
- -R для удаления;
- -Rn для удаления резервных копий файлов конфигурации;
- -Rs для удаления зависимостей.
После опции всегда идет имя пакета, т.е.:
pacman -S имя_пакета
Команды управления пользователями
sudo — запуск команд и приложений через терминал в Linux от имени администратора (суперпользователя)
Все важные действия в Linuxе требуют подтверждения от имени администратора, в Linux администратор называется суперпользователем или root. Чтобы выполнить команду от имени суперпользователя, нужно ввести перед ней sudo. Это позволит выполнять команды от имени суперпользователя до окончания текущей сессии в терминале.
Если вы не хотите вводить sudo каждый раз, когда терминал просит это сделать, вы можете переключиться в режим суперпользователя. Для этого выполните su, введите пароль, тогда вы сможете выполнять любые команды по умолчанию от имени суперпользователя. Однако, лучше поступать так только, если вы точно знаете, что делаете. Сломать что-то важное в системе получится вряд ли, но вероятность возрастает лучше использовать sudo.
useradd (adduser) / userdel (deluser) / usermod — добавить, удалить, изменить пользователя
С помощью этих команд вы сможете управлять учетными записями пользователей. Полезно иметь под рукой такую возможность в сетевом домене или домашней сети, выдавать и ограничивать права.
Для добавления пользователя используйте useradd имя_пользователя.
Пароль для нового пользователя задается командой passwd имя_пользователя.
Аналогичным образом, командой userdel имя_пользователя, можно удалить созданную учетную запись.
Третья команда — usermod позволяет изменять учетные записи пользователей: изменять домашнюю директорию, имя учетной записи, оболочку входа в систему, «срок годности» пароля и т.д.
У каждой из трех команд есть свои опции, знать которые новичкам нет необходимости, но знать об их существовании не возбраняется.
Команды выключения и перезагрузки
Linux можно выключить или перезагрузить из командной строки. Зачем это делать? Во-первых, команды очень полезны, если отсутствует графическая оболочка системы — окружение пользователя, и вся работа происходит из терминала. Во-вторых, различные команды или опции помогут произвести перезагрузку или выключение с разными параметрами.
shutdown — выключение
shutdown опции время сообщение
Время — отсрочка выключения. Можно указывать:
- в 24-часовом формате когда нужно указать точное время выключения с точностью до минуты shutdown 10:10;
- в формате +мин, например, shutdown +10 выключит компьютер через 10 минут после выполнения. Команды shutdown +0 и shutdown now выключат компьютер немедленно.
Сообщение (wall) — текстовое сообщение, отправляемое пользователям компьютеров в сети. Если требуется добавить комментарий с причиной выключения. При добавлении сообщения обязательно указывать время.
Некоторые опции:
- -H (Halt) — останавливает все функции процессора, но не выключает компьютер. Halt можно использовать как самостоятельную команду, отдельно от shutdown;
- -P — полное выключение компьютера. Можно использовать как команду poweroff;
- -r (reboot) — перезагрузка. В качестве команды — reboot;
- -k — не производить никаких действий, отправить сообщение;
- -c — отменить запланированное выключение. Можно отменить выключение, только если не было задано время +0 или now.
Заключение, несколько советов
Мы рассмотрели основные команды Linux с примерами, надеемся, что они окажутся вам полезными. Напоследок приведем несколько советов по использованию терминала одной строкой.
Двойной символ & (амперсанд)
Предназначен для выполнения нескольких команд последовательно:
команда1 && команда2 && команда3
команда3 выполнится только после успешного исполнения команды2, а команда2 — после команды1.
Вертикальная черта | (pipe)
Вводит результат первой команды в последующую. Например, следующая команда добавит таблицу процессов к команде поиска:
ps axu | grep имя_процесса
&& и || можно комбинировать. Например вот так: команда1 && команда2 || команда3
Стрелки вверх и вниз на клавиатуре
Помогают осуществлять навигацию по последним командам. Стрелка вверх (Ctrl+P) — предыдущая выполненная команда, стрелка вниз (Ctrl+N) — следующая.
history — история
Если вы забыли, как вы выполнили действие пять дней назад, а вот оно снова потребовалось, выполните history, и терминал выведет на экран последнюю тысячу команд.
Новая вкладка bash
Не всегда удобно иметь несколько окон. Некоторые терминалы, как и браузеры, дают возможность открыть несколько вкладок сочетанием клавиш Ctrl+Shift+T.
Копирование и вставка, прерывание команды
Пробовали ли вы копировать текст и вставлять в терминал? Пробовали Ctrl+C? Ctrl+C прервет выполнение текущей команды, например таблицы процессов, сбросит текст, введенный в строку. Скопировать текст из bash — Ctrl+Shift+C, вставить — Ctrl+Shift+V (для MacOS — Command+C и Command+V соответственно).
Linux-шпаргалка: команды терминала для новичков
Терминал и текстовые команды — главный способ управления операционной системой Linux, особенно, если речь идёт о сервере. И хоть слово «терминал» пугает новичков, поверьте, что всё гораздо проще. Сегодня мы подготовили для вас шпаргалку с базовыми командами — сохраняйте её в закладки и повышайте свою продуктивность в сотни раз.
Начнём с теории
Linux (Линукс) — это целое семейство операционных систем Unix с открытым исходным кодом, основанных на ядре Linux. Сюда входят все самые популярные системы на основе ОС, например: Ubuntu, Fedora, Mint, Debian и другие. Их ещё называют дистрибутивами. Подробнее о каждом читайте в этом посте.
Терминал (или «Bash», сокращение от «Bourne-Again shell») — это программа, которая используется для взаимодействия с командной оболочкой. Терминал применяется для выполнения административных задач, например: установку пакетов, действия с файлами и управление пользователями.
Команда — это название программы, которое пользователь вводит в терминале для выполнения определённой задачи. Команды могут иметь дополнительные данные и параметры.
В ОС есть несколько сотен команд и их модификаций. Они группируются по нескольким категориям:
- По расположению — могут быть утилитами командной строки или встроенной функцией командной оболочки.
- По частоте применения — те команды, что используются постоянно, по ситуации (эпизодически) или редко.
- По типам действий — большая группа команд, с помощью которых можно управлять процессами или достать нужную информацию. О них сегодня и поговорим.
Типичная команда выглядит вот так:
Команды, которые позволят узнать больше о вашей системе
id — если вы хотите получить информацию о вашей учётной записи.
w — полезная команда, если вам нужно узнать, какой пользователь сейчас находится в системе (или команда -f — для того, чтобы узнать, откуда был совершён вход).
lsblk — если вы хотите открыть список блочных устройств хранения данных.
lscpu — отображает информацию о процессорах.
free — показывает объём свободной и уже используемой памяти (альтернативная команда — free -g).
lsb_release -a — если вы хотите получить информацию о версии вашей ОС.
Команды для работы с файлами
Содержит в себе практически все мелкие утилиты и инструменты для взаимодействия с файлами и папками.
ls — покажет содержимое директории, в которой вы находитесь. Если после команды ввести адрес конкретной папки, то она покажет то, что хранится в ней. При добавлении аргумента -R в выводе команды появятся файлы из поддиректорий.
cd — change directory, что в переводе означает «сменить директорию». Из названия понятно, что с помощью этой команды можно перемещаться между папками. Вписываем её, а потом адрес: cd /user/test/dir/111. Есть сокращенные варианты: cd- для перемещения в предыдущую директорию или cd (без аргументов) для прыжка в домашнюю папку.
pwd — укажет полный путь до директории, в которой вы находитесь. Если вы перепрыгнули на рабочий стол с помощью cd ~/Desktop/, то pwd покажет что-то в духе /home/Polzovatel/Desktop.
dd — мощная утилита для взаимодействия с разделами. С её помощью можно делать копии разделов, перемещать их, удалять без возможности восстановления.
rm — опасная команда для удаления директорий и их содержимого. Стирает все данные, которые обнаружит в указанной папке без возможности к восстановлению.
grep — это полнотекстовый поиск в файле. Очень полезная команда, когда вам нужно что-то найти. Например, grep значение /путь/до/файла покажет строки в которых есть «значение». А команда grep -ril значение /путь/до/каталога/* покажет все файлы, в которых есть искомое значение.
-r — рекурсивный поиск
-i — игнорировать регистр (Case insensetive)
-l — вывести результат списком.
chown пользователь:группа — команда позволяет изменить владельца файла.
chmod — изменяет права на файл или каталог
find — суперполезная команда. С её помощью можно искать файлы по определённым параметрам.
Следующие команды потребуются вам при работе с файлами разного типа и объёма:
cat — показывает содержимое файлов. Также может использоваться в двух вариантах: 1) одним текстовым файлом (cat путь_к_файлу), она отображает содержимое файла в окне терминала, 2) если же указать больше элементов, то команда склеит их (cat путь_к_файлу_1 путь_к_файлу_2).
head — «голова», как и cat, показывает содержимое документов, но не всё, а только первые 10 строк. При желании количество строк можно увеличить или сократить, добавив параметр -n.
tail -f — используется для просмотра растущего файла в окне интерактивного запуска кода.
touch — эта команда создавалась для изменения времени последнего открытия файла или директории, но используют её, в основном, для создания новых файлов.
wget — загружает из интернета документы, картинки, целые страницы и прочий контент.
wc — считает количество строк, слов, знаков и байтов.
zip — упаковывает файлы в архив в формате .zip.
diff — сокращение от «difference». Команда показывает разницу между двумя текстовыми файлами.
Что вы можете сделать с двоичными файлами? На самом деле, вариантов не очень много:
strings — команда выведет готовые к печати строки файла;
od — позволит вам напечатать файл в восьмеричном формате;
cmp — даёт возможность побайтно сравнивать файлы.
Если вам требуется сравнить текстовые файлы друг с другом, введите эти команды:
comm — отсортированные файлы будут строка за строкой.
diff — позволяет построчно выявить различия. Эта команда используется наиболее часто в силу богатого набора опций.
Команды для управления пользователями
Linux — многопользовательская система, поэтому здесь достаточно сложная система добавления и редактирования учётных записей. Но можно упростить себе жизнь и воспользоваться этими командами:
useradd — создаёт новую учётную запись. Например, если мы захотим бы добавить нового пользователя с именем REG.RU, то нужно воспользоваться этой командой — вводим useradd REG.RU.
passwd — задаёт пароль для учётной записи. Короче говоря, работает вкупе с предыдущей командой. То есть сразу после создания аккаунта, пишем passwd REG.RU.
userdel — удаляет выбранную учётную запись. Синтаксис простейший: userdel , которую нужно стереть
Для установки, удаления и обновления пакетов
Для установки программ в Linux используются менеджеры пакетов, но для каждого дистрибутива они разные. Вот команды для наиболее популярных дистрибутивов:
Debian/Ubuntu
sudo apt-get install название_пакета — устанавливает программу на выбор.
sudo apt remove название_пакета — команда, используя которую можно удалить не только ПО, но и все неиспользуемые пакеты.
sudo apt-get update — обновляет информацию о пакетах, имеющихся в системе, и тех, что хранятся в подключённых репозиториях.
sudo apt-upgrade — обновляет установленные пакеты до самых свежих версий, доступных в подключенных репозиториях.
sudo apt purge — удаляет все файлы конфигурации вместе с пакетами ПО.
sudo apt autoremove -purge — удаляет абсолютно всё: и пакеты, и зависимости, и конфиги.
Red Hat Linux/CentOS
sudo dnf install название_пакета — устанавливает программу на выбор.
sudo dnf upgrade — обновляет установленные пакеты до самых свежих версий.
sudo dnf remove название_пакета — стирает с жёсткого диска имеющийся в системе пакет.
Бонус! Хитрости, которые сэкономят время
Этот список полезных знаков в разы ускорит вашу работу с командами:
!! — повторяет последнюю команду.
!$ — позволяет изменить команду, сохраняя последний аргумент. Например, команда less !$ — используется для повторного открытия файла в меньшем объёме.
!* —позволяет изменить команду, сохраняя при этом все аргументы. Например, head states.txt | grep ‘^Al’ — при использовании должен быть хвост.
tail !* — избавляет от необходимости вводить остальную часть команды.
>x.txt — используется для создания пустого файла или очистки существующего.
lsof -P -i -n — определяет, к каким скриптам идёт обращение со стороны веб-сервера.
И самая крутая команда в Linux: для вывода полного руководства о той или иной команде есть man (сокращенно от manual). Чтобы вывести мануал достаточно просто выполнить man . В качестве примера давайте рассмотрим команду cat:
NAME
cat — concatenate files and print on the standard output
SYNOPSIS
cat [OPTION]. [FILE].
DESCRIPTION
Concatenate FILE(s) to standard output.
With no FILE, or when FILE is -, read standard input.
-A, —show-all
equivalent to -vET
-b, —number-nonblank
number nonempty output lines, overrides -n
-e equivalent to -vE
-E, —show-ends
display $ at end of each line
-n, —number
number all output lines
-s, —squeeze-blank
suppress repeated empty output lines
-t equivalent to -vT
-T, —show-tabs
display TAB characters as ^I
-v, —show-nonprinting
use ^ and M- notation, except for LFD and TAB
—help display this help and exit
—version
output version information and exit
EXAMPLES
cat f — g
Output f’s contents, then standard input, then g’s contents.
А для выход из режима просмотра, достаточно набрать команду quit или q.
На первый взгляд может показаться, что список очень трудно запомнить, но запоминание приходит с практикой! Чем чаще вы пользуетесь теми или иными командами, тем скорее вы их запомните.
И, если вы хотите попробовать какие-то команды на настоящем сервере — попробуйте наши Облачные VPS с готовым шаблоном популярных дистрибутивов Linux: Ubuntu, CentOS и Django и почасовой оплатой от 44 копеек.
С помощью какой команды можно определить встроена ли некоторая другая команда в оболочку
Действие, когда какая либо команда или сама командная оболочка инициирует ( порождает ) новый подпроцесс, что бы выполнить какую либо работу, называется ветвлением ( forking ) процесса. Новый процесс называется «дочерним» (или «потомком»), а породивший его процесс — «родительским» (или «предком»). В результате и потомок и предок продолжают исполняться одновременно — параллельно друг другу. В общем случае, встроенные команды Bash, при исполнении внутри сценария, не порождают новый подпроцесс, в то время как вызов внешних команд, как правило, приводит к созданию нового подпроцесса.
#!/bin/bash echo "Эта строка выводится внутренней командой \"echo\"." /bin/echo "А эта строка выводится внешней командой the /bin/echo."
Ввод/вывод echo выводит (на stdout) выражение или содержимое переменной (см. Пример 4-1).
echo Hello echo $a
Для вывода экранированных символов, echo требует наличие ключа -e. См. Пример 5-2. Обычно, командв echo выводит в конце символ перевода строки. Подавить вывод это символа можно ключом -n.
if echo "$VAR" | grep -q txt # if [[ $VAR = *txt* ]] then echo "$VAR содержит подстроку \"txt\"" fi
| Кроме того, команда echo, в комбинации с подстановкой команд может учавствовать в операции присвоения значения переменной. a=`echo «HELLO» | tr A-Z a-z` См. так же Пример 12-15, Пример 12-2, Пример 12-32 и Пример 12-33. |
Следует запомнить, что команда echo `command` удалит все символы перевода строки, которые будут выведены командой command. Переменная $IFS обычно содержит символ перевода строки \n , как один из вариантов пробельного символа. Bash разобьет вывод команды command, по пробельным символам, на аргументы и передаст их команде echo, которая выведет эти аргументы, разделенные пробелами.
bash$ ls -l /usr/share/apps/kjezz/sounds -rw-r--r-- 1 root root 1407 Nov 7 2000 reflect.au -rw-r--r-- 1 root root 362 Nov 7 2000 seconds.au bash$ echo `ls -l /usr/share/apps/kjezz/sounds` total 40 -rw-r--r-- 1 root root 716 Nov 7 2000 reflect.au -rw-r--r-- 1 root root 362 Nov 7 2000 seconds.au
bash$ type -a echo echo is a shell builtin echo is /bin/echo
printf printf — команда форматированного вывода, расширенный вариант команды echo и ограниченный вариант библиотечной функции printf() в языке C, к тому же синтаксис их несколько отдичается друг от друга. printf format-string. parameter. Это встроенная команда Bash. Имеет внешний аналог /bin/printf или /usr/bin/printf. За более подробной информацией обращайтесь к страницам справочного руководства man 1 printf по системным командам.
| Старые версии Bash могут не поддерживать команду printf. |
Пример 11-1. printf в действии
#!/bin/bash # printf demo # От переводчика: # Считаю своим долгом напомнить, что в качестве разделителя дробной и целой # частей в вещественных числах, может использоваться символ "запятая" # (в русских локалях), поэтому данный сценарий может выдавать сообщение # об ошибке (у меня так и произошло) при выводе числа PI. # Тогда попробуйте заменить в определении числа PI десятичную точку # на запятую -- это должно помочь. ;-) PI=3,14159265358979 DecimalConstant=31373 Message1="Поздравляю," Message2="Землянин." echo printf "Число пи с точностью до 2 знака после запятой = %1.2f" $PI echo printf "Число пи с точностью до 9 знака после запятой = %1.9f" $PI # Даже округляет правильно. printf "\n" # Перевод строки, printf "Константа = \t%d\n" $DecimalConstant # Вставлен символ табуляции (\t) printf "%s %s \n" $Message1 $Message2 echo # ==========================================# # Эмуляция функции 'sprintf' в языке C. # Запись форматированной строки в переменную. echo Pi12=$(printf "%1.12f" $PI) echo "Число пи с точностью до 12 знака после запятой = $Pi12" Msg=`printf "%s %s \n" $Message1 $Message2` echo $Msg; echo $Msg exit 0
Одно из полезных применений команды printf — форматированный вывод сообщений об ошибках
E_BADDIR=65 var=nonexistent_directory error() < printf "$@" >&2 # Форматированный вывод аргументов на stderr. echo exit $E_BADDIR > cd $var || error $"Невозможно перейти в каталог %s." "$var" # Спасибо S.C.
Пример 11-2. Ввод значений переменных с помощью read
#!/bin/bash echo -n "дите значение переменной 'var1': " # Ключ -n подавляет вывод символа перевода строки. read var1 # Обратите внимание -- перед именем переменной отсутствует символ '$'. echo "var1 = $var1" echo # Одной командой 'read' можно вводить несколько переменных. echo -n "дите значения для переменных 'var2' и 'var3' (через пробел или табуляцию): " read var2 var3 echo "var2 = $var2 var3 = $var3" # Если было введено значение только одной переменной, то вторая останется "пустой". exit 0
Пример 11-3. Пример использования команды read без указания переменной для ввода
#!/bin/bash echo # -------------------------- # # Первый блок кода. echo -n "Введите значение: " read var echo "\"var\" = "$var"" # Здесь нет ничего неожиданного. # -------------------------- # echo echo -n "Введите другое значение: " read # Команда 'read' употребляется без указания переменной для ввода, #+ тем не менее. #+ По-умолчанию ввод осуществляется в переменную $REPLY. var="$REPLY" echo "\"var\" = "$var"" # Эта часть сценария эквивалентна первому блоку, выделенному выше. echo exit 0
Обычно, при вводе в окне терминала с помощью команды «read», символ \ служит для экранирования символа перевода строки. Ключ -r заставляет интерпретировать символ \ как обычный символ.
Пример 11-4. Ввод многострочного текста с помощью read
#!/bin/bash echo echo "Введите строку, завершающуюся символом \\, и нажмите ENTER." echo "Затем введите вторую строку, и снова нажмите ENTER." read var1 # При чтении, символ "\" экранирует перевод строки. # первая строка \ # вторая строка echo "var1 = $var1" # var1 = первая строка вторая строка # После ввода каждой строки, завершающейся символом "\", # вы можете продолжать ввод на другой строке. echo; echo echo "Введите другую строку, завершающуюся символом \\, и нажмите ENTER." read -r var2 # Ключ -r заставляет команду "read" воспринимать "\" # как обычный символ. # первая строка \ echo "var2 = $var2" # var2 = первая строка \ # Ввод данных прекращается сразу же после первого нажатия на клавишу ENTER. echo exit 0
Команда read имеет ряд очень любопытных опций, которые позволяют выводить подсказку — приглашение ко вводу (prompt), и даже читать данные не дожидаясь нажатия на клавишу ENTER.
# Чтение данных, не дожидаясь нажатия на клавишу ENTER. read -s -n1 -p "Нажмите клавишу " keypress echo; echo "Была нажата клавиша "\"$keypress\""." # -s -- подавляет эхо-вывод, т.е. ввод с клавиатуры не отображается на экране. # -n N -- ввод завершается автоматически, сразу же после ввода N-го символа. # -p -- задает вид строки подсказки - приглашения к вводу (prompt). # Использование этих ключей немного осложняется тем, что они должны следовать в определенном порядке.
Ключ -n, кроме всего прочего, позволяет команде read обнаруживать нажатие курсорных и некоторых других служебных клавиш.
Пример 11-5. Обнаружение нажатия на курсорные клавиши
#!/bin/bash # arrow-detect.sh: Обнаружение нажатия на курсорные клавиши, и не только. # Спасибо Sandro Magi за то что показал мне -- как. # -------------------------------------------- # Коды клавиш. arrowup='\[A' arrowdown='\[B' arrowrt='\[C' arrowleft='\[D' insert='\[2' delete='\[3' # -------------------------------------------- SUCCESS=0 OTHER=65 echo -n "Нажмите на клавишу. " # Может потребоваться нажать на ENTER, если была нажата клавиша # не входящая в список выше. read -n3 key # Прочитать 3 символа. echo -n "$key" | grep "$arrowup" #Определение нажатой клавиши. if [ "$?" -eq $SUCCESS ] then echo "Нажата клавиша \"." exit $SUCCESS fi echo -n "$key" | grep "$arrowdown" if [ "$?" -eq $SUCCESS ] then echo "Нажата клавиша \" exit $SUCCESS fi echo -n "$key" | grep "$arrowrt" if [ "$?" -eq $SUCCESS ] then echo "Нажата клавиша \"О\"." exit $SUCCESS fi echo -n "$key" | grep "$arrowleft" if [ "$?" -eq $SUCCESS ] then echo "Нажата клавиша \"." exit $SUCCESS fi echo -n "$key" | grep "$insert" if [ "$?" -eq $SUCCESS ] then echo "Нажата клавиша \"Insert\"." exit $SUCCESS fi echo -n "$key" | grep "$delete" if [ "$?" -eq $SUCCESS ] then echo "Нажата клавиша \"Delete\"." exit $SUCCESS fi echo " Нажата какая-то другая клавиша." exit $OTHER # Упражнения: # --------- # 1) Упростите сценарий, заменив множество if-ов #+ одной конструкцией 'case'. # 2) Добавьте определение нажатий на клавиши "Home", "End", "PgUp" и "PgDn".
Ключ -t позволяет ограничивать время ожидания ввода командой read (см. Пример 9-4). Команда read может считывать значения для переменных из файла, перенаправленного на stdin. Если файл содержит не одну строку, то переменной будет присвоена только первая строка. Если команде read будет передано несколько переменных, то первая строка файла будет разбита, по пробелам, на несколько подстрок, каждая из которых будет записана в свою переменную. Будьте осторожны!
Пример 11-6. Чтение командой read из файла через перенаправление
#!/bin/bash read var1cat file1 file2 | while read line do echo $line doneФайловая система cd Уже знакомая нам команда cd, изменяющая текущий каталог, может быть использована в случаях, когда некоторую команду необходимо запустить только находясь в определенном каталоге.
(cd /source/directory && tar cf - . ) | (cd /dest/directory && tar xpvf -)bash$ cd // bash$ pwd //Само собой разумеется, это должен был бы быть каталог /. Эта проблема наблюдается как в командной строке, так и в сценариях.
pwd Выводит название текущего рабочего каталога (Print Working Directory) (см. Пример 11-7). Кроме того, имя текущего каталога хранится во внутренней переменной $PWD. pushd, popd, dirs Этот набор команд является составной частью механизма "закладок" на каталоги и позволяет перемещаться по каталогам вперед и назад в заданном порядке. Для хранения имен каталогов используется стек (LIFO -- "последний вошел, первый вышел"). pushd dir-name -- помещает имя текущего каталога в стек и осуществляет переход в каталог dir-name. popd -- выталкивает, находящееся на вершине стека, имя каталога и одновременно осуществляет переход в каталог, оказавшийся на врешине стека. dirs -- выводит содержимое стека каталогов (сравните с переменной $DIRSTACK). В случае успеха, обе команды -- pushd и popd автоматически вызывают dirs. Эти команды могут оказаться весьма полезными, когда в сценарии нужно производить частую смену каталогов, но при этом не хочется жестко "зашивать" имена каталогов. Обратите внимание: содержимое стека каталогов постоянно хранится в переменной-массиве -- $DIRSTACK.
Пример 11-7. Смена текущего каталога
#!/bin/bash dir1=/usr/local dir2=/var/spool pushd $dir1 # Команда 'dirs' будет вызвана автоматически (на stdout будет выведено содержимое стека). echo "Выполнен переход в каталог `pwd`." # Обратные одиночные кавычки. # Теперь можно выполнить какие либо действия в каталоге 'dir1'. pushd $dir2 echo "Выполнен переход в каталог `pwd`." # Теперь можно выполнить какие либо действия в каталоге 'dir2'. echo "На вершине стека находится: $DIRSTACK." popd echo "Возврат в каталог `pwd`." # Теперь можно выполнить какие либо действия в каталоге 'dir1'. popd echo "Возврат в первоначальный рабочий каталог `pwd`." exit 0Переменные let Команда let производит арифметические операции над переменными. В большинстве случаев, ее можно считать упрощенным вариантом команды expr.
Пример 11-8. Команда let, арифметические операции.
#!/bin/bash echo let a=11 # То же, что и 'a=11' let a=a+5 # Эквивалентно "a = a + 5" # (Двойные кавычки и дополнительные пробелы делают код более удобочитаемым) echo "11 + 5 = $a" let "a eval eval arg1 [arg2] . [argN] Транслирует список аргументов, из списка, в команды. Пример 11-9. Демонстрация команды eval#!/bin/bash y=`eval ls -l` # Подобно y=`ls -l` echo $y # но символы перевода строки не выводятся, поскольку имя переменной не в кавычках. echo echo "$y" # Если имя переменной записать в кавычках -- символы перевода строки сохраняются. echo; echo y=`eval df` # Аналогично y=`df` echo $y # но без символов перевода строки. # Когда производится подавление вывода символов LF (перевод строки), то анализ #+ результатов различными утилитами, такими как awk, можно сделать проще. exit 0Пример 11-10. Принудительное завершение сеанса
#!/bin/bash y=`eval ps ax | sed -n '/ppp/p' | awk '< print $1 >'` # Выяснить PID процесса 'ppp'. kill -9 $y # "Прихлопнуть" его # Предыдущие строки можно заменить одной строкой # kill -9 `ps ax | awk '/ppp/ < print $1 >' chmod 666 /dev/ttyS3 # Завершенный, по сигналу SIGKILL, ppp изменяет права доступа # к последовательному порту. Вернуть их в первоначальное состояние. rm /var/lock/LCK..ttyS3 # Удалить lock-файл последовательного порта. exit 0Пример 11-11. Шифрование по алгоритму "rot13"
#!/bin/bash # Реализация алгоритма шифрования "rot13" с помощью 'eval'. # Сравните со сценарием "rot13.sh". setvar_rot_13() # Криптование по алгоритму "rot13" < local varname=$1 varvalue=$2 eval $varname='$(echo "$varvalue" | tr a-z n-za-m)' >setvar_rot_13 var "foobar" # Пропустить слово "foobar" через rot13. echo $var # sbbone echo $var | tr a-z n-za-m # foobar # Расшифровывание. # Пример предоставил Stephane Chazelas. exit 0Rory Winston представил следующий пример, как образец практического использования команды eval.
Пример 11-12. Замена имени переменной на ее значение, в исходном тексте программы на языке Perl, с помощью eval
В программе "test.pl", на языке Perl: . my $WEBROOT = ; . Эта попытка подстановки значения переменной вместо ее имени: $export WEBROOT_PATH=/usr/local/webroot $sed 's//$WEBROOT_PATH/' < test.pl >out даст такой результат: my $WEBROOT = $WEBROOT_PATH; Тем не менее: $export WEBROOT_PATH=/usr/local/webroot $eval sed 's//$WEBROOT_PATH/' < test.pl >out # ==== Этот вариант дал желаемый результат -- имя переменной, в тексте программы, благополучно было заменено на ее значение: my $WEBROOT = /usr/local/webroot
| Команда eval может быть небезопасна. Если существует приемлемая альтернатива, то желательно воздерживаться от использования eval. Так, eval $COMMANDS исполняет код, который записан в переменную COMMANDS, которая, в свою очередь, может содержать весьма неприятные сюрпризы, например rm -rf *. Использование команды eval, для исполнения кода неизвестного происхождения, крайне опасно. |
set Команда set изменяет значения внутренних переменных сценария. Она может использоваться для переключения опций (ключей, флагов), определяющих поведение скрипта. Еще одно применение -- сброс/установка позиционных параметров (аргументов), значения которых будут восприняты как результат работы команды ( set `command`).
Пример 11-13. Установка значений аргументов с помощью команды set
#!/bin/bash # script "set-test" # Вызовите сценарий с тремя аргументами командной строки, # например: "./set-test one two three". echo echo "Аргументы перед вызовом set \`uname -a\` :" echo "Аргумент #1 = $1" echo "Аргумент #2 = $2" echo "Аргумент #3 = $3" set `uname -a` # Изменение аргументов # значения которых берутся из результата работы `uname -a` echo $_ echo "Аргументы после вызова set \`uname -a\` :" # $1, $2, $3 и т.д. будут переустановлены в соответствии с выводом #+ команды `uname -a` echo "Поле #1 'uname -a' = $1" echo "Поле #2 'uname -a' = $2" echo "Поле #3 'uname -a' = $3" echo --- echo $_ # --- echo exit 0
bash$ set AUTHORCOPY=/home/bozo/posts BASH=/bin/bash BASH_VERSION=$'2.05.8(1)-release' . XAUTHORITY=/home/bozo/.Xauthority _=/etc/bashrc variable22=abc variable23=xzy
Если команда set используется с ключом " --" , после которого следует переменная, то значение переменной переносится в позиционные параметры (аргументы). Если имя переменной отсутствует, то эта команда приводит к сбросу позиционных параметров.
Пример 11-14. Изменение значений позиционных параметров (аргументов)
#!/bin/bash variable="one two three four five" set -- $variable # Значения позиционных параметров берутся из "$variable". first_param=$1 second_param=$2 shift; shift # сдвиг двух первых параметров. remaining_params="$*" echo echo "первый параметр = $first_param" # one echo "второй параметр = $second_param" # two echo "остальные параметры = $remaining_params" # three four five echo; echo # Снова. set -- $variable first_param=$1 second_param=$2 echo "первый параметр = $first_param" # one echo "второй параметр = $second_param" # two # ====================================================== set -- # Позиционные параметры сбрасываются, если не задано имя переменной. first_param=$1 second_param=$2 echo "первый параметр = $first_param" # (пустое значение) echo "второй параметр = $second_param" # (пустое значение) exit 0
См. так же Пример 10-2 и Пример 12-40. unset Команда unset удаляет переменную, фактически -- устанавливает ее значение в null . Обратите внимание: эта команда не может сбрасывать позиционные параметры (аргументы).
bash$ unset PATH bash$ echo $PATH bash$
Пример 11-15. "Сброс" переменной
#!/bin/bash # unset.sh: Сброс переменной. variable=hello # Инициализация. echo "variable = $variable" unset variable # Сброс. # Тот же эффект дает variable= echo "(unset) variable = $variable" # $variable = null. exit 0
export Команда export экспортирует переменную, делая ее доступной дочерним процессам. К сожалению, невозможно экспортировать переменную родительскому процессу. В качестве примера использования команды export можно привести сценарии инициализации системы, вызываемые в процессе загрузки, которые инициализируют и экспортируют переменные окружения, делая их доступными для пользовательских процессов.
Пример 11-16. Передача переменных во вложенный сценарий awk, с помощью export
#!/bin/bash # Еще одна версия сценария "column totaler" (col-totaler.sh) # который суммирует заданную колонку (чисел) в заданном файле. # Здесь используются переменные окружения, которые передаются сценарию 'awk'. ARGS=2 E_WRONGARGS=65 if [ $# -ne "$ARGS" ] # Проверка количества входных аргументов. then echo "Порядок использования: `basename $0` filename column-number" exit $E_WRONGARGS fi filename=$1 column_number=$2 #===== До этой строки идентично первоначальному варианту сценария =====# export column_number # Экспорт номера столбца. # Начало awk-сценария. # ------------------------------------------------ awk ' < total += $ENVIRON["column_number"] >END < print total >' $filename # ------------------------------------------------ # Конец awk-сценария. # Спасибо Stephane Chazelas. exit 0
bash$ export var=(a b); echo $ (a b) bash$ var=(a b); export var; echo $ a
declare, typeset Команды declare и typeset задают и/или накладывают ограничения на переменные. readonly То же самое, что и declare -r, делает переменную доступной только для чтения, т.е. переменная становится подобна константе. При попытке изменить значение такой переменной выводится сообщение об ошибке. Эта команда может расцениваться как квалификатор типа const в языке C. getopts Мощный инструмент, используемый для разбора аргументов, передаваемых сценарию из командной строки. Это встроенная команда Bash, но имеется и ее "внешний" аналог /usr/bin/getopt, а так же программистам, пишущим на C, хорошо знакома похожая библиотечная функция getopt. Она позволяет обрабатывать серии опций, объединенных в один аргумент [2] и дополнительные аргументы, передаваемые сценарию (например, scriptname -abc -e /usr/local). С командой getopts очень тесно взаимосвязаны скрытые переменные. $OPTIND -- указатель на аргумент ( OPTion INDex) и $OPTARG ( OPTion ARGument) -- дополнительный аргумент опции. Символ двоеточия, следующий за именем опции, указывает на то, что она имеет дополнительный аргумент. Обычно getopts упаковывается в цикл while, в каждом проходе цикла извлекается очередная опция и ее аргумент (если он имеется), обрабатывается, затем уменьшается на 1 скрытая переменная $OPTIND и выполняется переход к началу новой итерации.
while getopts ":abcde:fg" Option # Начальное объявление цикла анализа опций. # a, b, c, d, e, f, g -- это возможные опции (ключи). # Символ : после опции 'e' указывает на то, что с данной опцией может идти # дополнительный аргумент. do case $Option in a ) # Действия, предусмотренные опцией 'a'. b ) # Действия, предусмотренные опцией 'b'. . e) # Действия, предусмотренные опцией 'e', а так же необходимо обработать $OPTARG, # в которой находится дополнительный аргумент этой опции. . g ) # Действия, предусмотренные опцией 'g'. esac done shift $(($OPTIND - 1)) # Перейти к следующей опции. # Все не так сложно, как может показаться ;-)
Пример 11-17. Прием опций/аргументов, передаваемых сценарию, с помощью getopts
#!/bin/bash # ex33.sh # Обработка опций командной строки с помощью 'getopts'. # Попробуйте вызвать этот сценарий как: # 'scriptname -mn' # 'scriptname -oq qOption' (qOption может быть любой произвольной строкой.) # 'scriptname -qXXX -r' # # 'scriptname -qr' - Неожиданный результат: "r" будет воспринят как дополнительный аргумент опции "q" # 'scriptname -q -r' - То же самое, что и выше # Если опция ожидает дополнительный аргумент ("flag:"), то следующий параметр # в командной строке, будет воспринят как дополнительный аргумент этой опции. NO_ARGS=0 E_OPTERROR=65 if [ $# -eq "$NO_ARGS" ] # Сценарий вызван без аргументов? then echo "Порядок использования: `basename $0` options (-mnopqrs)" exit $E_OPTERROR # Если аргументы отсутствуют -- выход с сообщением # о порядке использования скрипта fi # Порядок использования: scriptname -options # Обратите внимание: дефис (-) обязателен while getopts ":mnopq:rs" Option do echo $OPTIND case $Option in m ) echo "Сценарий #1: ключ -m-";; n | o ) echo "Сценарий #2: ключ -$Option-";; p ) echo "Сценарий #3: ключ -p-";; q ) echo "Сценарий #4: ключ -q-, с аргументом \"$OPTARG\"";; # Обратите внимание: с ключом 'q' должен передаваться дополнительный аргумент, # в противном случае отработает выбор "по-умолчанию". r | s ) echo "Сценарий #5: ключ -$Option-"'';; * ) echo "Выбран недопустимый ключ.";; # ПО-УМОЛЧАНИЮ esac done shift $(($OPTIND - 1)) # Переход к очередному параметру командной строки. exit 0
Когда эта команда вызывается из командной строки, то это приводит к запуску указанного сценария. Внутри сценария, команда source file-name загружает файл file-name. Таким образом она очень напоминает директиву препроцессора языка C/C++ -- "#include". Может найти применение в ситуациях, когда несколько сценариев пользуются одним файлом с данными или библиотекой функций.
Пример 11-18. "Подключение" внешнего файла
#!/bin/bash . data-file # Загрузка файла с данными. # Тот же эффект дает "source data-file", но этот вариант более переносим. # Файл "data-file" должен находиться в текущем каталоге, #+ т.к. путь к нему не указан. # Теперь, выведем некоторые переменные из этого файла. echo "variable1 (из data-file) = $variable1" echo "variable3 (из data-file) = $variable3" let "sum = $variable2 + $variable4" echo "Сумма variable2 + variable4 (из data-file) = $sum" echo "message1 (из data-file): \"$message1\"" # Обратите внимание: кавычки экранированы print_message Вызвана функция вывода сообщений, находящаяся в data-file. exit 0
Файл data-file для Пример 11-18, представленного выше, должен находиться в том же каталоге.
# Этот файл подключается к сценарию. # Подключаемые файлы могут содержать об"явления переменных, функций и т.п. # Загружаться может командой 'source' или '.' . # Инициализация некоторых переменных. variable1=22 variable2=474 variable3=5 variable4=97 message1="Привет! Как поживаете?" message2="Досвидания!" print_message ()
Сценарий может подключить даже самого себя, только этому едва ли можно найти какое либо практическое применение.
Пример 11-19. Пример (бесполезный) сценария, который подключает себя самого.
#!/bin/bash # self-source.sh: сценарий, который рекурсивно подключает себя самого." # Из "Бестолковые трюки", том II. MAXPASSCNT=100 # Максимальное количество проходов. echo -n "$pass_count " # На первом проходе выведет два пробела, #+ т.к. $pass_count еще не инициализирована. let "pass_count += 1" # Операция инкремента неинициализированной переменной $pass_count #+ на первом проходе вполне допустима. # Этот прием срабатывает в Bash и pdksh, но, #+ при переносе сценария в другие командные оболочки, #+ он может оказаться неработоспособным или даже опасным. # Лучшим выходом из положения, будет присвоить переменной $pass_count #+ значение 0, если она неинициализирована. while [ "$pass_count" -le $MAXPASSCNT ] do . $0 # "Подключение" самого себя. # ./$0 (истинная рекурсия) в данной ситуации не сработает. done # Происходящее здесь фактически не является рекурсией как таковой, #+ т.к. сценарий как бы "расширяет" себя самого #+ (добавляя новый блок кода) #+ на каждом проходе цикла 'while', #+ командой 'source' в строке 22. # # Само собой разумеется, что первая строка (#!), вновь подключенного сценария, #+ интерпретируется как комментарий, а не как начало нового сценария (sha-bang) echo exit 0 # The net effect is counting from 1 to 100. # Very impressive. # Упражнение: # ---------- # Напишите сценарий, который использовал бы этот трюк для чего либо полезного.
Безусловное завершение работы сценария. Команде exit можно передать целое число, которое будет возвращено вызывающему процессу как код завершения. Вообще, считается хорошей практикой завершать работу сценария, за исключением простейших случаев, командой exit 0, чтобы проинформировать родительский процесс об успешном завершении.
Если сценарий завершается командой exit без аргументов, то в качестве кода завершения сценария принимается код завершения последней выполненной команды, не считая самой команды exit.
Это встроенная команда интерпретатора shell, заменяет текущий процесс новым процессом, запускаемым командой exec. Обычно, когда командный интерпретатор встречает эту команду, то он порождает дочерний процесс, чтобы исполнить команду. При использовании встроенной команды exec, оболочка не порождает еще один процесс, а заменяет текущий процесс другим. Для сценария это означает его завершение сразу после исполнения команды exec. По этой причине, если вам встретится exec в сценарии, то, скорее всего это будет последняя команда в сценарии.
Пример 11-20. Команда exec
#!/bin/bash exec echo "Завершение \"$0\"." # Это завершение работы сценария. # ---------------------------------- # Следующие ниже строки никогда не будут исполнены echo "Эта строка никогда не будет выведена на экран." exit 99 # Сценарий завершит работу не здесь. # Проверьте код завершения сценария #+ командой 'echo $?'. # Он точно не будет равен 99.
Пример 11-21. Сценарий, который запускает себя самого
#!/bin/bash # self-exec.sh echo echo "Эта строка в сценарии единственная, но она продолжает выводиться раз за разом." echo "PID остался равным $$." # Демонстрация того, что команда exec не порождает дочерний процесс. echo "==================== Для завершения - нажмите Ctl-C ====================" sleep 1 exec $0 # Запуск очередного экземпляра этого же сценария #+ который замещает предыдущий. echo "Эта строка никогда не будет выведена!" # Почему? exit 0
Ключ -exec команды find -- это не то же самое, что встроенная команда exec.
Эта команда позволяет изменять ключи (опции) оболочки на лету (см. Пример 23-1 и Пример 23-2). Ее часто можно встретить в стартовых файлах, но может использоваться и в обычных сценариях. Требует Bash версии 2 или выше.
shopt -s cdspell # Исправляет незначительные орфографические ошибки в именах каталогов в команде 'cd' cd /hpme # Oops! Имелось ввиду '/home'. pwd # /home # Shell исправил опечатку.
Команда возвращает код завершения -- ноль , или успешное завершение, и ничего больше.
# Бесконечный цикл while true # вместо ":" do operation-1 operation-2 . operation-n # Следует предусмотреть способ завершения цикла. done
Возвращает код завершения, свидетельствующий о неудаче, и ничего более.
# Цикл, который никогда не будет исполнен while false do # Следующий код не будет исполнен никогда. operation-1 operation-2 . operation-n done
Очень похожа на внешнюю команду which, type cmd выводит полный путь к "cmd" . В отличие от which, type является внутренней командой Bash. С опцией -a не только различает ключевые слова и внутренние команды, но и определяет местоположение внешних команд с именами, идентичными внутренним.
bash$ type '[' [ is a shell builtin bash$ type -a '[' [ is a shell builtin [ is /usr/bin/[
Запоминает путь к заданной команде (в хэш-таблице командной оболочки), благодаря чему, при повторном обращении к ней, оболочка или сценарий уже не будет искать путь к команде в $PATH. При вызове команды hash без аргументов, просто выводит содержимое хэш-таблицы. С ключом -r -- очищает хэш-таблицу.
bash$ help exit exit: exit [n] Exit the shell with a status of N. If N is omitted, the exit status is that of the last command executed.
11.1. Команды управления заданиями
Выводит список заданий, исполняющихся в фоне. Команда ps более информативна.
Задания и процессы легко спутать. Некоторые внутренние команды, такие как kill, disown и wait принимают в качестве параметра либо номер задания, либо номер процесса. Команды fg, bg и jobs принимают только номер задания.
bash$ sleep 100 & [1] 1384 bash $ jobs
"1" -- это номер задания (управление заданиями осуществляет текущий командный интерпретатор), а "1384" -- номер процесса (управление процессами осуществляется системой). Завершить задание/процесс ("прихлопнуть") можно либо командой kill %1, либо kill 1384.
Удаляет задание из таблицы активных заданий командной оболочки.
Команда fg переводит задание из фона на передний план. Команда bg перезапускает приостановленное задание в фоновом режиме. Если эти команды были вызваны без указания номера задания, то они воздействуют на текущее исполняющееся задание.
Вы можете использовать команду wait для предотвращения преждевременного завершения сценария до того, как завершит работу фоновое задание.
Пример 11-22. Ожидание завершения процесса перед тем как продолжить работу
#!/bin/bash ROOT_UID=0 # Только пользователь с $UID = 0 имеет привилегии root. E_NOTROOT=65 E_NOPARAMS=66 if [ "$UID" -ne "$ROOT_UID" ] then echo "Для запуска этого сценария вы должны обладать привилегиями root." exit $E_NOTROOT fi if [ -z "$1" ] then echo "Порядок использования: `basename $0` имя-файла" exit $E_NOPARAMS fi echo "Обновляется база данных 'locate'. " echo "Это может занять продолжительное время." updatedb /usr & # Должна запускаться с правами root. wait # В этом месте сценарий приостанавливает свою работу до тех пор, пока не отработает 'updatedb'. # Желательно обновить базу данных перед тем как выполнить поиск файла. locate $1 # В худшем случае, без команды wait, сценарий завершил бы свою работу до того, # как завершила бы работу утилита 'updatedb', # сделав из нее "осиротевший" процесс. exit 0
При запуске команды в фоне из сценария может возникнуть ситуация, когда сценарий приостанавливает свою работу до тех пор, пока не будет нажата клавиша ENTER. Это, кажется, происходит с командами, делающими вывод на stdout. Такое поведение может вызывать раздражение у пользователя.
#!/bin/bash # test.sh ls -l & echo "Done."
bash$ ./test.sh Done. [bozo@localhost test-scripts]$ total 1 -rwxr-xr-x 1 bozo bozo 34 Oct 11 15:09 test.sh _
Разместив команду wait, после запуска фонового задания, можно предотвратить такое поведение сценария.
#!/bin/bash # test.sh ls -l & echo "Done." wait
bash$ ./test.sh Done. [bozo@localhost test-scripts]$ total 1 -rwxr-xr-x 1 bozo bozo 34 Oct 11 15:09 test.sh
Перенаправление вывода в файл или даже на устройство /dev/null также снимает эту проблему.
Действует аналогично нажатию на комбинацию клавиш Control+- Z, за исключением того, что она приостанавливает работу командной оболочки.
Выдает статистику исполнения команд в единицах системного времени, в следующем виде:
0m0.020s 0m0.020s
Имеет весьма ограниченную сферу применения, так как сценарии крайне редко подвергаются профилированию.
Пример 11-23. Сценарий, завершающий себя сам с помощью команды kill
#!/bin/bash # self-destruct.sh kill $$ # Сценарий завершает себя сам. # Надеюсь вы еще не забыли, что "$$" -- это PID сценария. echo "Эта строка никогда не будет выведена." # Вместо него на stdout будет выведено сообщение "Terminated". exit 0 # Какой код завершения вернет сценарий? # # sh self-destruct.sh # echo $? # 143 # # 143 = 128 + 15 # сигнал TERM
Команда kill -l выведет список всех сигналов. Команда kill -9 -- это "жесткий kill" , она используется, как правило, для завершения зависших процессов, которые упорно отказываются "умирать", отвергая простой kill. Иногда достаточно подать команду kill -15. "Процессы-зомби" , т.е. процессы, "родители" которых уже завершили работу, не могут быть "убиты" таким способом (невозможно "убить" "мертвого"), рано или поздно с ними "расправится" процесс init.
Директива command COMMAND запрещает использование псевдонимов и функций с именем "COMMAND" .
Конструкция builtin BUILTIN_COMMAND запускает внутреннюю команду "BUILTIN_COMMAND" , на время запрещая использование функций и внешних системных команд с тем же именем.
Обратите внимание: autoload не является частью ядра Bash. Ее необходимо загрузить с помощью команды enable -f (см. выше).
Таблица 11-1. Идентификация заданий
| Нотация | Описание |
|---|---|
| %N | Номер задания [N] |
| %S | Вызов (командная строка) задания, которая начинается со строки S |
| %?S | Вызов (командная строка) задания, которая содержит строку S |
| %% | "текущее" задание (последнее задание приостановленное на переднем плане или запущенное в фоне) |
| %+ | "текущее" задание (последнее задание приостановленное на переднем плане или запущенное в фоне) |
| %- | Последнее задание |
| $! | Последний фоновый процесс |
Примечания
Исключение из правил -- команда time, которая в официальной документации к Bash называется ключевым словом.
Опция -- это аргумент, который управляет поведением сценария и может быть либо включен, либо выключен. Аргумент, который объединяет в себе несколько опций (ключей), определяет поведение сценария в соответствии с отдельными опциями, объединенными в данном аргументе..
Как правило, исходные тексты подобных библиотек, на языке C, располагаются в каталоге /usr/share/doc/bash-. /functions.
Обратите внимание: ключ -f команды enable может отсутствовать в некоторых системах.
| Назад | К началу | Вперед |
| Операторы выбора | Наверх | Внешние команды, программы и утилиты |
Глава 4. Основы UNIX
Этот перевод может быть устаревшим. Для того, чтобы помочь с переводом, пожалуйста, обратитесь к Сервер переводов FreeBSD.
4.1. Краткий обзор
В этой главе мы попытаемcя раскрыть основные принципы и команды операционной системы FreeBSD. Большая часть нижеизложенного материала в более или менее равной степени применима к любой UNIX®-подобной операционной системе. Если вы уверены, что не найдете здесь ничего нового для себя, можете смело пропустить эту главу. Если же вы новичок, мы настоятельно рекомендуем внимательно прочесть это главу.
Прочитав эту главу, вы узнаете:
- Как использовать "виртуальные консоли" FreeBSD.
- Как работают права доступа на файлы в UNIX® и как следует интерпретировать флаги файлов в ОС FreeBSD.
- Иерархия каталогов FreeBSD.
- Организация дисков FreeBSD.
- Как монтировать и размонтировать файловые системы.
- Что такое процессы, даемоны и сигналы.
- Что такое командная оболочка (или интерпретатор команд) и как настроить личное рабочее окружение.
- Как пользоваться стандартными текстовыми редакторами.
- Что такое устройства и файлы устройств.
- Какие бинарные форматы используются в FreeBSD.
- Как пользоваться справочным руководством для получения дополнительной информации.
4.2. Виртуальные консоли и терминалы
FreeBSD можно использовать разными способами. Один из них - набор команд в текстовом терминале. Используйте этот способ, и вся гибкость и мощь систем UNIX® будет в ваших руках. Этот раздел рассказывает о "терминалах", "консолях" и их использовании в FreeBSD.
4.2.1. Консоль
Если во время установки вы не настроили FreeBSD для автоматического запуска графической среды при загрузке, система запросит ввод логина сразу после завершения стартовых скриптов. Вы увидите примерно следующее:
Additional ABI support:. Local package initialization:. Additional TCP options:. Fri Sep 20 13:01:06 EEST 2002 FreeBSD/i386 В вашей системе сообщение может быть другим, но очень похожим на это. В данный момент нас интересуют последние две строки. Вторая с конца строка:
FreeBSD/i386 (pc3.example.org) (ttyv0)
В этой строке содержится немного информации о только что загруженной системе. Это консоль "FreeBSD", работающей на Intel или совместимом процессоре x86 архитектуры. Имя этого компьютера (у каждого компьютера UNIX® есть имя) pc3.example.org , и в данный момент вы видите системную консоль - терминал ttyv0 .
Наконец, последняя строка всегда:
login:
Здесь вам предлагается ввести "имя пользователя", чтобы войти в FreeBSD. Следующий раздел описывает способ, которым вы можете сделать это.
4.2.2. Вход в FreeBSD
FreeBSD это многопользовательская, многопроцессорная система. Это формальное описание системы, которая может быть использована множеством разных людей, одновременно запускающих большое количество программ на одном компьютере.
Любой многопользовательской системе нужен способ отличать каждого "пользователя" от остальных. В FreeBSD (и всех UNIX®-подобных операционных системах), эта задача решается путем "входа" пользователя в систему перед запуском каких-либо программ. У каждого пользователя есть уникальное имя ("имя пользователя") и персональный, секретный ключ ("пароль"). Перед тем, как разрешить пользователю выполнять какие-либо программы, FreeBSD запрашивает их оба.
Сразу после загрузки FreeBSD и завершения работы стартовых скриптов, система предложит вам ввести имя пользователя:
login:
В этом примере, предположим что ваше имя пользователя john . Введите john в этом приглашении и нажмите Enter . Далее должно появиться приглашение ввести "пароль":
login: john Password:
Введите соответствующий имени john пароль и нажмите Enter . Пароль не виден! Не беспокойтесь об этом. Это сделано по соображениям безопасности.
Если вы ввели пароль правильно, то сразу же войдете в FreeBSD и можете начать выполнять команды.
Вы увидите сообщение дня (MOTD, или message of the day) за которым последует командная строка (с символом # , $ , или % ). Это означает, что вы успешно вошли в FreeBSD.
4.2.3. Множественные консоли
Запуск команд UNIX® из консоли - это конечно хорошо, но FreeBSD может выполнять множество программ одновременно, поэтому наличие одной консоли может быть недостатком. В таком случае очень полезны "виртуальные консоли".
FreeBSD может быть настроена для работы с несколькими виртуальными консолями. Вы можете переключаться с одной виртуальной консоли на другую, нажимая соответствующие сочетания клавиш на клавиатуре. У каждой консоли есть свой канал вывода и FreeBSD заботится о том, чтобы правильно перенаправить ввод с клавиатуры и вывод на монитор, как только вы переключитесь с одной консоли на другую.
Для переключения между консолями зарезервированы специальные комбинации клавиш. Вы можете использовать сочетания Alt + F1 , Alt + F2 , до Alt + F8 чтобы переключаться между различными виртуальными консолями в FreeBSD.
При переключении от одной консоли к другой, FreeBSD заботится о сохранении и восстановлении вывода на экран. Результатом является "иллюзия" наличия множества "виртуальных" экранов и клавиатур, которые могут быть использованы для ввода и запуска команд FreeBSD. Программы, которые вы запускаете на одной виртуальной консоли, не прекращают выполнение, когда консоль становится невидимой. Они продолжают выполняться, когда вы переключаетесь на другую виртуальную консоль.
4.2.4. Файл /etc/ttys
В конфигурации по умолчанию FreeBSD запускает восемь виртуальных консолей. Тем не менее, это не ограничение оборудования, и вы можете легко настроить систему для загрузки большего или меньшего числа виртуальных консолей. Число и параметры виртуальных консолей задаются в файле /etc/ttys .
Вы можете использовать это файл для настройки виртуальных консолей FreeBSD. Любая не закомментированная строка в этом файле (строка, не начинающаяся с символа # ), содержит настройки для одного терминала или виртуальной консоли. Версия этого файла по умолчанию, поставляемая с FreeBSD, содержит настройки для девяти виртуальных консолей и включает восемь терминалов. Это строки, начинающиеся с ttyv :
# name getty type status comments # ttyv0 "/usr/libexec/getty Pc" cons25 on secure # Virtual terminals ttyv1 "/usr/libexec/getty Pc" cons25 on secure ttyv2 "/usr/libexec/getty Pc" cons25 on secure ttyv3 "/usr/libexec/getty Pc" cons25 on secure ttyv4 "/usr/libexec/getty Pc" cons25 on secure ttyv5 "/usr/libexec/getty Pc" cons25 on secure ttyv6 "/usr/libexec/getty Pc" cons25 on secure ttyv7 "/usr/libexec/getty Pc" cons25 on secure ttyv8 "/usr/X11R6/bin/xdm -nodaemon" xterm off secure
За детальным описанием каждой колонки этого файла и всех опций, которые можно указать для настройки виртуальных консолей, обращайтесь к ttys(5).
4.2.5. Консоль в однопользовательском режиме
Детальное описание "однопользовательского режима" можно найти в Однопользовательский режим. Стоит отметить, что при работе FreeBSD в однопользовательском режиме есть только одна консоль. Виртуальных консолей нет. Установки консоли в однопользовательском режиме можно найти в файле /etc/ttys . Обратите внимание на строку, начинающуюся с console :
# name getty type status comments # # If console is marked "insecure", then init will ask for the root password # when going to single-user mode. console none unknown off secure
Как сказано в комментариях выше строки console , можно отредактировать эту строку и изменить secure на insecure . Если вы сделаете это, FreeBSD даже при загрузке в однопользовательском режиме будет запрашивать пароль root .
Будьте осторожны при изменении этого значения на insecure . Если вы забудете пароль root , загрузка в однопользовательский режим сильно усложнится. Это все еще возможно, но несколько более сложно для тех, кто еще не очень освоился с процессом загрузки FreeBSD и вызова программ.
4.2.6. Изменение видеорежимов консоли
Установленный по умолчанию размер изображения для консоли FreeBSD может быть изменен до значения 1024x768, 1280x1024, или любого другого, который поддерживается вашим монитором и видеокартой. Для того, чтобы задействовать иной видеорежим, вам прежде всего необходимо будет пересобрать ядро вашей системы, добавив в файл конфигурации две дополнительные опции:
options VESA options SC_PIXEL_MODE
После пересборки и установки ядра воспользуйтесь утилитой vidcontrol(1) для определения видеорежимов, поддерживаемых вашим оборудованием. Чтобы получить перечень видеорежимов, выполните следующую команду:
Команда отобразит список поддерживаемых видеорежимов. Теперь вы можете выбрать один из них и установить его на консоли при помощи vidcontrol(1):
Если новый видеорежим вас устраивает, то его можно определить устанавливаемым автоматически во время старта системы, для чего добавьте в /etc/rc.conf следующую строку:
allscreens_flags="MODE_279"
4.3. Пользователи и основы управления учетными записями
FreeBSD допускает одновременную работу множества пользователей на одном компьютере. В то время, как только один пользователь может сидеть за клавиатурой и перед экраном в один момент времени, любое количество пользователей может войти в систему через сеть. Для использования системы у каждого пользователя должна быть учетная запись.
В этом разделе описаны:
- Разные типы учетных записей в системе FreeBSD.
- Как добавлять, удалять и изменять учетные записи пользователей.
- Как устанавливать ограничения на использование ресурсов для учетных записей или групп учетных записей.
- Как использовать группы для упрощения управлением учетными записями.
4.3.1. Разновидности учетных записей
Так как доступ к системе FreeBSD осуществляется через учетные записи, и все процессы запускаются пользователями, то управление пользователями и учетными записями является важным аспектом администрирования.
Существует три разновидности учетных записей: системные учетные записи, учетные записи пользователей и суперпользователь.
4.3.1.1. Системные учетные записи
Системные учетные записи предназначены для запуска сервисов, таких как DNS, почта, веб серверы. Это необходимо по соображениям безопасности; если бы все сервисы работали от суперпользователя, они могли бы действовать без ограничений.
Примеры системных учетных записей: daemon , operator , bind , news и www .
nobody это общепринятая непривилегированная системная учетная запись. Однако, чем больше сервисов используют nobody , тем больше файлов и процессов связано с этим пользователем, и следовательно тем больше привилегий появляется у этого пользователя.
4.3.1.2. Учетные записи пользователей
Учетные записи пользователей служат для предоставления доступа к системе обычным людям. Каждый человек, имеющий доступ к системе, должен иметь уникальную учетную запись пользователя. Это позволяет администратору выяснять кто что делает и предотвращает сбивание одним пользователем настроек других пользователей.
Каждый пользователь посредством выбора оболочки, редактора, привязок клавиш и настроек языка может настраивать свою собственную рабочую среду для приспособления системы под свои нужды.
С каждой учетной записью в системе FreeBSD связана определенная идентификационная информация:
Имя пользователя
Имя пользователя вводится в приглашение login: . Имена пользователей должны быть уникальны. Существует множество правил для создания допустимых имен пользователей, документированных в passwd(5). Рекомендуется составлять имена пользователей из восьми или меньшего количества символов в нижнем регистре, чтобы поддерживать обратную совместимость с приложениями.
С каждой учетной записью связан пароль.
ID пользователя (User ID, UID)
Идентификатор пользователя (UID) - это номер, используемый для однозначной идентификации пользователя в системе FreeBSD. Любая команда, принимающая в качестве аргумента имя пользователя, первым делом преобразует его к UID. Рекомендуется выбирать значения UID, не превышающие 65535, так как большие значения могут вызывать проблемы совместимости для некоторых пользовательских программ.
Идентификатор группы (Group ID, GID)
Идентификатор группы (GID) - это номер, используемый для однозначной идентификации главной группы, к которой принадлежит пользователь. Группы это механизм для контроля доступа к ресурсам на основе GID пользователя вместо его UID. Это может значительно уменьшить размер некоторых файлов настройки. Кроме того, пользователь может быть включен более чем в одну группу. Рекомендуется использовать значения GID, не превышающие 65535, так как большие значения могут стать проблемой для некоторых программ.
Класс доступа (login class)
Классы доступа это расширение к механизму групп, позволяющее более гибко приспосабливать систему для различных пользователей. Классы доступа описаны в Ограничение пользователей.
Срок действия пароля
По умолчанию пароли не устаревают. Однако, есть возможность ограничить срок действия текущего пароля пользователя, и тем самым обязать его обновить пароль.
Срок действия учетной записи
По умолчанию во FreeBSD время действия учетных записей не ограничено. При создании учетных записей ограниченного срока действия, например для студентов в учебном заведении, при помощи pw(8) укажите дату истечения действия учетной записи. После наступления указанной даты учетная запись становится непригодной для входа в систему, хотя каталоги и файлы этой учетной записи останутся нетронутыми.
Полное имя пользователя
Имя пользователя является уникальным идентификатором учетной записи в FreeBSD, однако оно не обязано соответствовать реальному имени пользователя. Это поле может содержать реальное имя пользователя. Здесь допустимы пробелы, символы подчеркивания, строка не ограничена до 8 символов.
Домашний каталог определяется полным путем в системе. С него пользователь начнет работу после входа в систему. По общепринятому соглашению все домашние каталоги пользователей помещаются в /home/username или /usr/home/username . Пользователи хранят личные файлы и подкаталоги в своих домашних каталогах.
Оболочка необходима пользователям как средство взаимодействия с системой. Существует множество различных видов оболочек, опытные пользователи работают с собственными настройками, которые могут быть отражены в установках их учетных записей.
4.3.1.3. Учетная запись суперпользователя
Учетная запись суперпользователя, обычно называемая root , используется для управления системой без ограничения привилегий. Поэтому она не должна использоваться для повседневных задач, таких как получение и отправка почты, общее исследование системы или программирование.
Суперпользователь, в отличие от обычных пользователей, может работать без ограничений и поэтому неправильное использование учетной записи суперпользователя может привести к полному уничтожению системы. Учетные записи пользователей не способны уничтожить систему вследствие ошибки, поэтому если нет необходимости в привилегиях суперпользователя, то лучше использовать учетные записи обычных пользователей везде, где это возможно.
Всегда перепроверяйте и переперепроверяйте команды, выполняемые под учетной записью суперпользователя, поскольку даже один лишний пробел или отсутствующий символ может привести к безвозвратной потере данных.
Есть несколько способов получения привилегий суперпользователя. Наименее удобный способ - войти в систему под учетной записью root .
Вместо этого можно воспользоваться su(1). Если при запуске этой команды указывается ключ - , пользователь получит настройки окружения учетной записи root . Пользователь, запускающий эту команду, обязан входить в группу wheel , в противном случае команда не выполнится. Пользователь также должен знать пароль учетной записи root .
В следующем примере пользователь повышает привилегии для запуска команды make install , так как этот шаг требует прав суперпользователя. По завершении работы команды пользователь набирает exit , тем самым выходя из учетной записи суперпользователя и возвращая привилегии собственной учетной записи.
Пример 1. Установка программы с привилегиями суперпользователя
% configure % make % su - Password: %
Утилита su(1) прекрасно подходит для одиночных систем или небольших сетей с единственным системным администратором. В качестве альтернативы ей следует упомянуть порт или пакет security/sudo. Эта утилита предоставляет журналирование активности, а также позволяет администратору указывать перечень утилит, доступных пользователю для запуска с правами суперпользователя.
4.3.2. Изменение учетных записей
FreeBSD располагает набором различных команд для работы с учетными записями пользователей. Утилиты для управления учетными записями перечисляет наиболее часто используемые команды, ниже находятся примеры их использования. За исчерпывающей информацией по каждой утилите следует обратиться к соответствующим страницам справочников.
Рекомендуемое приложение командной строки для добавления новых пользователей.
Рекомендуемое приложение командной строки для удаления пользователей.
Гибкий инструмент для изменения информации в базе данных пользователей.
Инструмент командной строки для изменения паролей пользователей.
Мощный и гибкий инструмент для изменения любой информации, связанной с учетными записями пользователей.
4.3.2.1. adduser
Для добавления новых пользователей рекомендуется использовать adduser(8). При добавлении нового пользователя программа автоматически обновляет /etc/passwd и /etc/group . Она также создает домашний каталог для нового пользователя, копируя файлы настройки по умолчанию из /usr/shared/skel , и может отправлять новому пользователю приветственное сообщение электронной почтой. Эту утилиту необходимо запускать с правами суперпользователя.
Утилита adduser(8) является интерактивной. Для создания новой учетной записи потребуется ответить на несколько вопросов. Как показано в Добавление пользователя в FreeBSD, ответом считается либо ввод необходимой информации, либо нажатие клавиши Return для принятия значения по умолчанию, которое показано в квадратных скобках. В этом примере пользователь включен в группу wheel , что дает возможность ему повышать привилегии до суперпользователя при помощи su(1). На последнем шаге утилита предложит создать еще одну учетную запись или завершить работу.
Пример 2. Добавление пользователя в FreeBSD
Username: jru Full name: J. Random User Uid default default
При наборе пароля текст не отображается, поэтому постарайтесь не допускать опечаток в пароле при создании учетной записи.
4.3.2.2. rmuser
Для полного удаления пользователя из системы запустите rmuser(8) с правами суперпользователя. Эта программа выполняет следующие действия:
- Если в crontab(1) существуют записи пользователя, то они удаляются.
- Удаляются принадлежащие пользователю задачи at(1).
- Уничтожаются все процессы, принадлежащие пользователю.
- Удаляется запись пользователя из локального файла паролей.
- Если домашний каталог принадлежит пользователю, то каталог удаляется.
- Удаляется принадлежащая пользователю входящая почта из /var/mail .
- Удаляются все файлы, принадлежащие пользователю, из каталогов с временными файлами, например из /tmp .
- Наконец, в /etc/group из всех групп удаляется имя пользователя. Если после этого удаления группа остается пустой и имя группы совпадает с именем пользователя, она удаляется. Это необходимо для удаления пользовательских уникальных групп, создаваемых adduser(8).
rmuser(8) не может использоваться для удаления учетной записи суперпользователя, поскольку это почти всегда означает разрушение системы.
По умолчанию используется интерактивный режим, это показано в следующем примере.
Пример 3. Интерактивное удаление учетной записи с помощью rmuser
Matching password entry: jru:
4.3.2.3. chpass
При помощи chpass(1) любой пользователь может изменять информацию, связанную с его учетной записью. И только суперпользователю разрешено менять информацию других пользователей.
При запуске без параметров (кроме необязательного имени пользователя), chpass(1) вызывает редактор, содержащий информацию о пользователе. Когда пользователь выходит из редактора, база данных пользователей обновляется новой информацией.
Если утилита не была запущена с правами суперпользователя, то после выхода из редактора будет запрошен пароль пользователя.
В Работа с chpass с правами суперпользователя суперпользователь, выполнив команду chpass jru , просматривает доступные для изменения поля. Если jru запустит эту команду, то лишь последние шесть строк будут доступны ему для редактирования. Это показано в Работа с chpass с правами обычного пользователя.
Пример 4. Работа с chpass с правами суперпользователя
Login: jru Password: Gid Change
Пример 5. Работа с chpass с правами обычного пользователя
Shell: /usr/local/bin/zsh Full Name: J. Random User Office Location: Office Phone: Home Phone: Other information:
chfn(1) и chsh(1) это ссылки на chpass(1), как и ypchpass(1), ypchfn(1) и ypchsh(1). Так как NIS поддерживается автоматически, указание yp перед командой не обязательно. Настройка NIS будет рассмотрена в Сетевые серверы.
4.3.2.4. passwd
Любой пользователь может изменить собственный пароль при помощи passwd(1). Для предотвращения случайного или несанкционированного изменения, команда запрашивает текущий пароль пользователя перед установкой нового:
Пример 6. Изменение пароля
% passwd Changing password jru. Old password: New password: Retype new password: passwd: updating the database. passwd: Суперпользователь может изменить пароль любого пользователя, указав его имя при запуске passwd(1). Утилита, запущенная с правами суперпользователя, не запрашивает текущий пароль пользователя. Благодаря этому возможно устанавливать новые пароли забывчивым пользователям.
Пример 7. Изменение пароля другого пользователя суперпользователем
Changing password jru. New password: Retype new password: passwd: updating the database. passwd:
Как и в случае с chpass(1), yppasswd(1) это всего лишь ссылка на passwd(1), так что NIS работает с обеими командами.
4.3.2.5. pw
pw(8) это утилита командной строки для создания, удаления, модифицирования и отображения пользователей и групп. Она функционирует как внешний интерфейс к системным файлам пользователей и групп. У pw(8) очень мощный набор параметров командной строки, что делает это программу подходящей для использования в shell скриптах, но новым пользователям она может показаться более сложной, чем другие представленные здесь команды.
4.3.3. Ограничение пользователей
FreeBSD предоставляет администратору несколько способов ограничения количества занимаемых пользователями системных ресурсов. Дисковые квоты, как один из видов ограничения ресурсов, обсуждаются в отдельном разделе, остальные ограничения перечислены далее в тексте.
Дисковые квоты ограничивают объем дискового пространства, занимаемого пользователями, а также предоставляют способ быстрой проверки занимаемого объема без пересчета его каждый раз. Квоты обсуждаются в Квотирование файловых систем.
Другие ограничения ресурсов включают способы ограничения использования CPU, памяти и других ресурсов, которые могут потребляться пользователем. Ограничения накладываются с помощью классов учетных записей и обсуждаются в этом разделе.
Классы учетных записей определяются в /etc/login.conf , они детально описаны на странице справочника login.conf(5). Каждой учетной записи присвоен класс ( default по умолчанию), и каждому классу присвоен набор характеристик. Характеристика определяется в виде пары имя=значение , где имя это определенный идентификатор, а значение это произвольная строка, обрабатываемая в зависимости от имени. Настройка классов и характеристик довольно проста, и также описана в login.conf(5).
FreeBSD, как правило, не читает настройки в /etc/login.conf непосредственно, вместо этого она обращается к файлу базы данных /etc/login.conf.db для ускорения доступа к данным. Всякий раз после редактирования /etc/login.conf необходимо обновить /etc/login.conf.db при помощи следующей команды:
Ограничения на ресурсы отличаются от обычных характеристик: во-первых, для каждого ограничения существует "мягкое" (текущее) и "жесткое" ограничение. Мягкое ограничение может настраиваться пользователем или приложением, но не может превышать жесткое ограничение. Последнее может быть уменьшено пользователем, а увеличено - лишь суперпользователем. Во-вторых, большинство ограничений ресурсов накладываются на каждый процесс определенного пользователя, а не к пользователю вообще. Эти различия диктуются особенностями обработки ограничений, а не реализацией структуры характеристик учетных записей.
Ниже приведен список наиболее часто используемых ограничений на ресурсы. Остальные, вместе с другими характеристиками, можно найти в login.conf(5).
coredumpsize
Ограничение на размер файла дампа памяти , генерируемого программой, подчиняющееся другим ограничениям на используемое дисковое пространство, таким как filesize , или дисковым квотам. Это ограничение часто используется как менее строгий метод контролирования потребления дискового пространства. Поскольку пользователь не создает файлы дампов памяти самостоятельно, и зачастую не удаляет их, установка этого параметра может предохранить пользователя от выхода за пределы ограничений на дисковое пространство, в случае если большая программа создаст файл аварийного дампа памяти.
Это максимальное количество времени ЦПУ, потребляемого пользователем. Превысившие это время процессы будут уничтожены ядром.
Это ограничение потребляемого времени ЦПУ, а не процентов использования ЦПУ, которые отображаются в некоторых полях top(1) и ps(1).
Это максимальный размер файла , которым может владеть пользователь. В отличие от дисковых квот, это ограничение применяется к отдельным файлам, а не ко всему набору принадлежащих пользователю файлов.
Это максимальное число процессов , которые могут быть запущены пользователем. В это число включаются и консольные, и фоновые процессы. Это ограничение не может превышать системный лимит, указываемый через переменную sysctl(8) kern.maxproc . Установка слишком жестких ограничений может стать помехой работе пользователя: зачастую ему удобно входить в систему с нескольких консолей или использовать каналы. Некоторые задачи, такие как компиляция большой программы, порождают множество процессов.
Это максимальный объем памяти , блокировка которого может быть запрошена процессом при помощи mlock(2). Некоторые критически важные для системы программы, такие как amd(8), блокируют отведенную процессу память так, что в случае "пробуксовывания" системы (system thrashing) они не усугубляют проблему.
Это максимальный объем памяти , которая может быть занята процессом в любой момент времени. Сюда входит основная память и использование подкачки. Это ограничение не снимает все вопросы, связанные с использованием памяти, но для начала это подходящее ограничение.
Это максимальное количество файлов, которые могут быть открыты процессом. В FreeBSD файлы также используются для представления сокетов и каналов IPC, поэтому не устанавливайте слишком маленькое значение. Ограничение этого параметра, устанавливаемое для всей системы, определяется переменной sysctl(8) kern.maxfiles .
Это ограничение на объем сетевой памяти, т.е. mbufs , которую может занять пользователь. В общем, это ограничение может быть использовано для ограничения сетевых взаимодействий.
Это максимальный размер сегмента стека процесса. Сам по себе этот параметр не может ограничить размер используемой программой памяти, следовательно, его необходимо использовать вместе с другими ограничениями.
Существуют несколько других аспектов, которые необходимо учитывать при установке ограничений ресурсов. Ниже приведены некоторые общие подсказки, советы и различные комментарии.
- Процессам, загружаемым при старте системы скриптами /etc/rc присваивается класс daemon .
- Хотя поставляемый с системой /etc/login.conf - это хороший источник корректных значений для большинства ограничений, сами ограничения могут не подходить для конкретной системы. Установка слишком слабых ограничений может повлечь злоупотребления системой, а установка слишком сильных ограничений может стать помехой производительности.
- Пользователи Xorg возможно должны получить больше ресурсов, чем другие пользователи. Xorg сама по себе потребляет много ресурсов, а также провоцирует пользователей на одновременный запуск большего количества программ.
- Многие ограничения применяются к отдельным процессам, а не к пользователю вообще. Например, установка openfiles в 50 означает, что каждый процесс, запущенный пользователем, может открывать до 50 файлов. Общее количество файлов, которые могут быть открыты пользователем, вычисляется как openfiles , умноженное на maxproc . Это также применимо к потребляемой памяти.
За дальнейшей информацией по ограничениям на ресурсы, классам учетных записей и характеристикам, обращайтесь к cap.mkdb(1), getrlimit(2), и login.conf(5).
4.3.4. Группы
Группа это список пользователей. Группа идентифицируется по имени и GID (Group ID). В FreeBSD для определения прав процесса ядро использует UID процесса, а также список групп, которым он принадлежит. В большинстве случаев, GID пользователя означает первую группу из списка.
Имена групп связываются с GID в файле /etc/group . Это текстовый файл с четырьмя разделенными двоеточием полями. Первое поле это имя группы, второе это зашифрованный пароль, третье это GID, а четвертое это разделенный запятыми список членов группы. За более полным описанием синтаксиса обратитесь к group(5).
Суперпользователь может редактировать /etc/group при помощи текстового редактора. Как вариант, можно задействовать pw(8) для добавления и редактирования групп. Например, для добавления группы, называемой teamtwo , и проверки ее существования вы можете использовать:
Пример 8. Добавление группы с использованием pw(8)
teamtwo:В этом примере число 1100 это GID группы teamtwo . На данный момент в teamtwo нет членов. Следующая команда добавит jru в группу teamtwo .
Пример 9. Добавление пользователей в новую группу при помощи pw(8)
teamtwo:Аргумент к параметру -M это разделенный запятыми список пользователей, которые добавляются в новую (пустую) группу или заменяют существующих членов группы. Что касается пользователя - это членство в группе отличается от первичной группы пользователя, указанного в файле паролей. Это значит, что пользователь не будет показан как член группы при использовании pw(8) groupshow , но будет отображен при использовании id(1) или похожего инструмента. Когда программа pw(8) задействована для добавления пользователя в группу, то она работает только с файлом /etc/group и не ищет дополнительную информацию в файле /etc/passwd .
Пример 10. Добавление нового члена группы с использованием pw(8)
teamtwo:В этом примере аргументом к опции -m является разделенный запятыми список пользователей, добавляемых в группу. В отличие от предыдущего примера, пользователи добавляются в группу, а не замещают имеющийся список пользователей группы.
Пример 11. Использование id(1) для определения принадлежности к группам
% jru В этом примере jru является членом групп jru и teamtwo .
За дальнейшей информацией об этой команде и о формате файла /etc/group обратитесь к pw(8) и group(5).
4.4. Права доступа
FreeBSD является прямым потомком BSD UNIX® и основывается на некоторых ключевых концепциях UNIX®. В первую очередь это, конечно, тот факт, что FreeBSD - многопользовательская операционная система. Это означает, что несколько пользователей могут работать одновременно, решая различные задачи и совершенно не мешая друг другу. На системе лежит ответственность за правильное разделение и управление такими ресурсами как память, процессорное время, периферийные устройства и прочее.
Многопользовательская среда предполагает наличие механизма регулирования прав доступа к любому ресурсу в системе. Существует три типа прав доступа: на чтение, запись и исполнение. Права сгруппированы три по три, соответственно чтение/запись/выполнение для владельца/группы/всех остальных. Численное представление:
Ничего не разрешено
Нельзя читать и писать, разрешено исполнять
Нельзя читать и исполнять, разрешено писать
Нельзя читать, разрешено писать и исполнять
Разрешено читать, нельзя писать и исполнять
Разрешено читать и исполнять, нельзя писать
Разрешено читать и писать, нельзя исполнять
Вы можете использовать опцию -l команды ls(1) для получения подробного листинга каталога, включающего колонку с информацией о правах на файл для владельца, группы и всех остальных. Например, команда ls -l в произвольном каталоге может вывести следующее:
Вот как выглядит первая колонка вывода ls -l :
Первый (считая слева) символ говорит обычный ли это файл, каталог, символьное устройство, сокет или любое другое псевдо-файловое устройство. В нашем случае - указывает на обычный файл. Следующие три символа (в данном случае это rw- ) задают права доступа владельца файла. Затем идут права группы, которой принадлежит файл ( r-- ). Последняя тройка ( r-- ) определяет права для всех остальных. Минус означает отсутствие каких-либо прав (т.е. нельзя ни читать, ни писать, ни выполнять). В данном случае права установлены таким образом, что владелец может читать и писать в файл, а группа и другие могут только читать. Таким образом, численное представление прав 644 , где каждая цифра представляет три части прав на файл.
Права на устройства контролируются аналогичным образом. В FreeBSD все устройства представлены в виде файлов, которые можно открывать, читать и писать в них. Эти специальные файлы содержатся в каталоге /dev .
Каталоги также являются файлами. К ним применимы те же права на чтение, запись и выполнение. Правда, в данном случае "выполнение" имеет несколько другой смысл. Когда каталог помечен как "исполнимый", это означает, что можно "зайти" в него (с помощью команды cd , change directory). Это также означает, что в данном каталоге можно получить доступ к файлам, имена которых известны (конечно, если собственные права на файл разрешают такой доступ).
Если же требуется получить список файлов в некотором каталоге, права доступа на него должные включать доступ на чтение. Для того, чтобы удалить из каталога какой-либо файл, имя которого известно, на этот каталог должны быть даны права на запись и на исполнение.
Существуют и другие права доступа, но они как правило используются в особых случаях, например, setuid-бит на выполняемые файлы и sticky-бит на каталоги. За дополнительными сведениями по этому вопросу обращайтесь к chmod(1).
4.4.1. Символические обозначения прав
Символические обозначения, иногда называемые символическими выражениями, используют буквы вместо восьмеричных значений для назначения прав на файлы и каталоги. Символические выражения используют синтаксис (кто) (действие) (права), где существуют следующие значения:
Явная установка прав
Эти значения используются командой chmod(1) так же как и раньше, но с буквами. Например, вы можете использовать следующую команду для запрета доступа других пользователей к FILE:
Для изменения более чем одного набора прав можно применить список, разделенный запятыми. Например, следующая команда удалит права группы и "всех остальных" на запись в FILE, а затем добавит права на выполнение для всех:
% go-w,a+x FILE
4.4.2. Флаги файлов в FreeBSD
Кроме уже описанных прав доступа к файлам, FreeBSD поддерживает использование "флагов файлов". Эти флаги обеспечивают дополнительный уровень защиты и контроля над файлами, но не могут применяться к каталогам.
Эти флаги добавляют дополнительные возможности контроля над файлами, обеспечивая (при определенных условиях) невозможность их удаления или изменения даже пользователю root .
Файловые флаги изменяются при помощи утилиты chflags(1) посредством простого интерфейса. К примеру, чтобы установить системный признак неудаляемости на файл file1 , выполните следующую команду:
Чтобы отключить флаг неудаляемости, просто выполните предыдущую команду с ключом "no" перед параметром sunlink . Вот так:
Чтобы просмотреть флаги этого файла, воспользуйтесь командой ls(1) с параметрами -lo :
Результат выполнения команды должен выглядеть примерно так:
-rw-r--r-- 1 trhodes trhodes sunlnk 0 Mar 1 05:54 file1
Некоторые флаги могут быть установлены или сняты с файлов только пользователем root . В остальных случаях эти флаги может установить владелец файла. Для получения дополнительной информации мы рекомендуем изучить содержимое справки по командам chflags(1) и chflags(2).
4.4.3. setuid, setgid и sticky-биты в правах доступа
В дополнение к рассмотренным выше правам доступа и флагам файлов необходимо также упомянуть еще три бита прав доступа, о которых должны знать все системные администраторы. Это такие биты, как setuid , setgid и sticky .
Эти биты играют важную роль в определённых моментах работы UNIX®, так как они предоставляют функциональность, расширяющую права обычного пользователя. Чтобы понять как они работают, необходимо определить различие между реальным идентификатором пользователя (UID) и действующим идентификатором пользователя (effective UID, EUID).
Реальный UID - это идентификатор пользователя, запустившего процесс на выполнение. Действующий UID (EUID) - это идентификатор пользователя, с которым на самом деле выполняется процесс. Например, утилита passwd(1) во время смены пароля пользователем запускается с реальным ID пользователя; однако, чтобы внести изменения в базу данных пользователей, ей необходимо работать с действующим ID пользователя root . Это тот механизм, который позволяет обычным пользователям изменять свои пароли и при этом не наблюдать ошибку Permission Denied .
Опция nosuid , указанная при монтировании файловой системы, отменяет действие битов setuid и setgid . То есть, утилиты, использующие эти биты прав, откажутся выполняться, даже не выдав пользователю никакого предостережения. К тому же, (с точки зрения обеспечения безопасности) эта опция монтирования не является абсолютно надежной, так как, согласно странице справочника mount(8), накладываемые ею ограничения могут быть обойдены при помощи "обертки" nosuid ( nosuid wrapper).
Бит setuid устанавливается добавлением цифры четыре (4) перед численным представлением прав доступа, например:
Теперь права доступа на файл suidexample.sh выглядят подобно следующему:
-rwsr-xr-x 1 trhodes trhodes 63 Aug 29 06:36 suidexample.sh
В вышеприведенной строке приметно то, что в перечне прав доступа для владельца файла присутствует символ s , который заменил собой бит выполнения.
Чтобы посмотреть setuid в действии, откройте два терминала. На одном из них запустите команду passwd с правами обычного пользователя. Пока утилита ждет ввода нового пароля, просмотрите таблицу процессов и найдите в ней запись о процессе passwd .
Changing password trhodes Old Password:
trhodes 5232 0.0 0.2 3420 1608 0 R+ 2:10AM 0:00.00 passwd root 5211 0.0 0.2 3620 1724 2 I+ 2:09AM 0:00.01 passwd
Как уже было сказано, утилита passwd запущена с правами обычного пользователя, но ее действующий UID - root .
Действие бита setgid подобно действию setuid ; отличие заключается в том, что изменяются настройки прав для группы. Когда выполняется приложение (или утилита) с установленным битом setgid , то ему (ей) будут обеспечены права в соответствии с группой владельца файла, а не с группой пользователя, запустившего процесс.
Чтобы установить на файл бит setgid , выполните команду chmod , добавив цифру два (2) перед численным представлением прав доступа, например:
Новый бит отображается подобно предыдущему случаю: обратите внимание на наличие s в перечне прав доступа для группы:
В этих примерах, несмотря на то, что сценарий оболочки является исполняемым файлом, он не будет выполняться с другим действующим идентификатором пользователя (EUID). Так происходит потому, что сценариям командного интерпретатора недоступен системный вызов setuid(2).
Позволяя расширять права пользователя, оба бита прав доступа ( setuid и setgid ) могут привести к снижению безопасности системы. Третий обсуждаемый здесь бит - sticky - способствует повышению безопасности системы.
Бит sticky , будучи установленным на каталог, позволяет производить удаление файла только владельцу файла. Этот бит применяется для предотвращения удаления файлов в публичных каталогах, таких как /tmp , пользователями, не владеющими файлом. Чтобы задействовать этот бит, добавьте единицу (1) перед численным представлением прав доступа. Например:
Проверить результат можно при помощи команды ls :
drwxrwxrwt 10 root wheel 512 Aug 31 01:49 tmp
Отличительной особенностью бита sticky является наличие символа t в самом конце перечня прав.
4.5. Структура каталогов
Файловая система FreeBSD является ключевым моментом в понимании устройства всей системы. Самым важным понятием является, несомненно, корневой каталог, обозначаемый символом "/". Корневой каталог монтируется самым первым на этапе загрузки и содержит все необходимое, чтобы подготовить систему к загрузке в многопользовательский режим. Корневой каталог также содержит точки монтирования для остальных файловых систем, которые монтируются во время перехода в многопользовательский режим.
Точкой монтирования называется каталог, находящийся в родительской (обычно - корневой) файловой системе, к которому может быть подсоединена другая файловая система. Более детально это описывается в Организация дисков. Стандартные точки монтирования включают /usr , /var , /tmp , /mnt и /cdrom . Эти каталоги обычно перечислены в файле /etc/fstab , в котором указаны файловые системы и их точки монтирования. Большинство файловых систем, описанных в /etc/fstab монтируются автоматически из скрипта rc(8), если только для них не указана опция noauto . Более детальная информация находится в Файл fstab .
Полное описание иерархии файловой системы есть в hier(7). Здесь же мы упомянем лишь наиболее важные каталоги.
Корневой каталог файловой системы.
Основные утилиты, необходимые для работы как в однопользовательском, так и в многопользовательском режимах.
Программы и конфигурационные файлы, необходимые для нормальной загрузки операционной системы.
Конфигурационные файлы с настройками по умолчанию, используемые в процессе загрузки операционной системы (см. loader.conf(5)).
Файлы устройств (см. intro(4)).
Основные конфигурационные файлы системы и скрипты.
Основные конфигурационные файлы системы с настройками по умолчанию (см. rc(8)).
Конфигурационные файлы для систем обработки почты (например, sendmail(8)).
Конфигурационные файлы для утилиты named (см. named(8)).
Файлы сценариев, выполняемые ежедневно, еженедельно и ежемесячно (см. cron(8) и periodic(8)).
Конфигурационные файлы для утилиты ppp (см. ppp(8)).
Пустой каталог, часто используемый системными администраторами как временная точка монтирования.
Виртуальная файловая система, отображающая текущие процессы (см. procfs(5), mount_procfs(8)).
Статически собранные программы для восстановления после сбоев. Обратитесь к rescue(8).
Домашний каталог пользователя root .
Системные утилиты и утилиты администрирования, необходимые для работы как в однопользовательском, так и в многопользовательском режимах.
Временные файлы. Содержимое /tmp обычно теряется во время перезагрузки системы. Файловая система в памяти часто монтируется в /tmp . Это может быть автоматизированно с помощью переменных относительно tmpmfs из rc.conf(5) (или же с помощью записи в /etc/fstab ; обращайтесь к mdmfs(8)).
Большинство пользовательских утилит и приложений.
Пользовательские утилиты и приложения общего назначения.
Стандартные заголовочные файлы для языка C.
Файлы стандартных библиотек.
Файлы данных для различных утилит.
Системные даемоны и утилиты (выполняемые другими программами).
Локальные пользовательские приложения, библиотеки, и т.д. Также используется по умолчанию коллекцией портов. Внутри /usr/local иерархия каталогов должна следовать hier(7) для /usr . Исключение составляют каталог man , который расположен непосредственно в /usr/local , а не в /usr/local/share , и документация портов, которая расположена в share/doc/port .
Архитектурно-зависимые файлы и каталоги, образующиеся в процессе сборки системы из исходных текстов в /usr/src .
Коллекция портов FreeBSD (опционально).
Системные утилиты и утилиты администрирования (исполняемые пользователем).
Исходные тексты BSD и/или программ.
Утилиты, приложения и библиотеки X11R6 (X Window System; необязательно).
Файлы журналов общего назначения, временные, перемещаемые файлы и файлы очередей. Файловая система в памяти иногда монтируется в /var . Это может быть автоматизированно с помощью переменных относительно varmfs из rc.conf(5) (или же с помощью записи в /etc/fstab ; обращайтесь к mdmfs(8)).
Различные файлы системных журналов.
Почтовые ящики пользователей.
Файлы очередей печати, почты, и пр.
Временные файлы, которые обычно сохраняются во время перезагрузки системы, если только /var не является файловой системой в памяти.
4.6. Организация дисков
Наименьшая единица, которую FreeBSD использует для обращения к файлам, это имя файла. Имена файлов чувствительны к регистру, поэтому readme.txt и README.TXT - два разных файла. FreeBSD не использует расширение файла ( .txt ) для определения программа это, документ или другой тип данных.
Файлы хранятся в каталогах. Каталоги могут не содержать файлов, или могут содержать много сотен файлов. Каталоги также могут содержать другие каталоги, что позволяет создавать иерархию каталогов один в другом. Это упрощает организацию данных.
Обращение к файлам происходит путем задания имени файла или каталога, дополняемого прямым слэшем / , за которым может следовать имя другого каталога. Если есть каталог foo , содержащий каталог bar , который содержит файл readme.txt , полное имя, или путь к файлу будет foo/bar/readme.txt .
Каталоги и файлы хранятся в файловой системе. Каждая файловая система содержит один каталог на верхнем уровне, называемый корневым каталогом этой файловой системы. Этот корневой каталог может содержать другие каталоги.
Внешне это может быть похоже на те операционные системы, которые вы возможно использовали. Есть несколько отличий: например, MS-DOS® использует \ для разделения имен файлов и каталогов, а Mac OS® использует : .
FreeBSD не использует букв дисков, или других имен дисков в пути. Вам не нужно писать c:/foo/bar/readme.txt в FreeBSD.
Вместо этого, одна файловая система назначается корневой файловой системой. Обращение к корневому каталогу корневой файловой системы происходит через / . Любая другая файловая система монтируется к корневой файловой системе. Неважно как много дисков есть в вашей системе FreeBSD, каждый каталог будет выглядеть как расположенный на том же диске.
Предположим, у вас есть три файловых системы: A , B , и C . Каждая файловая система имеет один корневой каталог, в котором содержатся другие каталоги, называемые A1 , A2 (и аналогично B1 , B2 и C1 , C2 ).
Назовем A корневой файловой системой. Если вы используете команду ls для просмотра содержимого каталога, вы увидите два подкаталога, A1 и A2 . Дерево каталогов выглядит так:

Файловая система должна быть подмонтирована к каталогу другой файловой системы. Предположим, что вы монтируете файловую систему B на каталог A1 . Корневой каталог B замещается A1 , а каталоги в B отображаются соответственно:

Если потребуется, любые файлы из каталогов B1 или B2 могут быть получены через путь /A1/B1 или /A1/B2 . Все файлы, бывшие в /A1 , временно скрыты. Они появятся, если B будет размонтирована с A.
Если B была смонтирована на A2, диаграмма будет выглядеть так:

а пути будут /A2/B1 и /A2/B2 соответственно.
Файловые системы могут быть смонтированы одна на другую. Продолжая предыдущий пример, файловая система C может быть смонтирована на каталог B1 файловой системы B в таком порядке:

Или C может быть смонтирована прямо на файловую систему A , на каталог A1 :

Если вы знакомы с MS-DOS®, это похоже, хотя и не идентично, команде join .
Как правило, это не должно вас интересовать. Обычно вы создаете файловые системы во время установки FreeBSD, решаете куда их монтировать, и ничего не меняете, пока не понадобится добавить новый диск.
Можно создать одну большую корневую файловую систему и не создавать других. У такого подхода есть несколько недостатков и одно преимущество.
Преимущества нескольких файловых систем
- Различные файловые системы могут иметь различные опции монтирования. Например, в целях безопасности корневая файловая система может быть смонтирована только для чтения, что делает невозможным случайное удаление или редактирование критически важного файла. Отделение файловых систем, используемых пользователями для записи, таких как /home , от других файловых систем позволяет также монтировать их с параметром nosuid; этот параметр отменяет действие битов suid/ guid на исполняемых файлах, в этой файловой системе, что потенциально повышает безопасность.
- FreeBSD автоматически оптимизирует расположение файлов на файловой системе в зависимости от того, как файловая система используется. Файловая система, содержащая множество мелких часто записываемых файлов, будет иметь оптимизацию, отличную от таковой для файловой системы, содержащей несколько больших файлов. На одной большой файловой системе эта оптимизация не работает.
- Файловые системы FreeBSD очень устойчивы к внезапному отключению. Тем не менее, потеря питания в критический момент все же может повредить структуру файловой системы. Разделение данных на несколько файловых систем повышает шансы, что система все-таки будет работать и делает более легким восстановление с резервной копии.
Преимущество одной файловой системы
- Размер файловых систем фиксирован. Если вы создаете файловую систему при установке FreeBSD и задаете определенный размер, позднее вы можете обнаружить что нужен раздел большего размера. Это не так легко сделать без резервного копирования, создания файловых систем нового размера и последующего восстановления сохраненных данных.
В FreeBSD представлена команда growfs(8), которая позволяет увеличивать размер файловой системы на лету, устраняя это ограничение.
Файловые системы содержатся в разделах. Этот термин не имеет того же смысла, что и при более раннем его использовании в этой главе, из-за наследия UNIX® в FreeBSD. Каждый раздел обозначается буквой от a до h . Каждый раздел может содержать только одну файловую систему, это значит что файловая система может быть описана ее точкой монтирования в файловой иерархии, или буквой раздела, в котором она содержится.
FreeBSD также использует дисковое пространство под раздел подкачки (swap space). Подкачка позволяет FreeBSD работать с виртуальной памятью. Ваш компьютер может работать так, как если бы у него было больше памяти, чем есть на самом деле. Когда у FreeBSD кончается память, она перемещает часть данных, не используемых в данный момент, в раздел подкачки и возвращает их обратно (перемещая в подкачку что-то другое), когда они нужны.
По некоторым разделам есть определенные соглашения.
Как правило, содержит корневую файловую систему
Как правило, содержит раздел подкачки
Как правило, такого же размера, что и весь слайс (slice). Это позволяет утилитам, которым нужно работать над всем слайсом (например, сканер плохих блоков), работать с разделом c . В обычной ситуации не нужно создавать файловую систему на этом разделе.
Раздел d создавался для специальных целей, хотя сейчас они не актуальны и d может быть задействован как обычный раздел.
Каждый раздел-содержащий-файловую-систему хранится на том, что во FreeBSD называется слайс (slice). Слайс - это термин FreeBSD, то, что обычно называют разделом, и опять же это из-за UNIX® основы FreeBSD. Слайсы нумеруются с 1 по 4.
Номера слайсов следуют за именем устройства, предваряемые строчной s , начиная с 1. Так "da0s1" это первый слайс первого SCSI устройства. Может быть только четыре физических слайса на диске, но могут быть логические слайсы нужного типа внутри физических слайсов. Эти дополнительные слайсы нумеруются начиная с 5, так что "ad0s5" это первый дополнительный слайс на первом IDE диске. Эти устройства используются файловыми системами, занимающими весь слайс.
Слайсы, "эксклюзивно выделенные (dangerously dedicated)" физические устройства и другие устройства содержат разделы, представляемые буквами от a до h . Эти буквы добавляются к имени устройства. "da0a" это раздел a на первом устройстве da, который "эксклюзивно выделен". "ad1s3e" это пятый раздел в третьем слайсе второго IDE диска.
Наконец, каждый диск идентифицирован. Имя диска начинается с кода, обозначающего тип диска, затем идет номер диска. В отличие от слайсов, нумерация дисков начинается с 0. Основные коды, которые вам могут встретиться, есть в Коды дисковых устройств.
В то время, как ссылка на раздел FreeBSD требует также указания слайса и диска, содержащего раздел, ссылка на слайс требует также указания имени диска. Другими словами, ссылаясь на раздел, указывайте имя диска, s , номер слайса, и затем букву раздела. Примеры показаны в Пример имен диска, слайса, и раздела.
Концептуальная модель диска показывает концептуальную модель диска, которая должна помочь прояснить ситуацию.
Для установки FreeBSD вы должны сначала настроить слайсы дисков, затем создать разделы внутри слайсов, которые будут использованы для FreeBSD, а затем создать файловую систему (или подкачку) в каждом разделе и решить, куда файловая система будет смонтирована.
SCSI direct access диск
ATAPI (IDE) CDROM
Пример 12. Пример имен диска, слайса, и раздела
Первый раздел ( a ) на первом слайсе ( s1 ) первого IDE диска ( ad0 ).
Пятый раздел ( e ) на втором слайсе ( s2 ) второго SCSI диска ( da1 ).
Пример 13. Концептуальная модель диска
Эта диаграмма показывает первый подключенный к системе IDE диск с точки зрения FreeBSD. Предположим, что размер диска 4 GB, и он содержит два 2 GB слайса (MS-DOS® разделы). Первый слайс содержит MS-DOS® диск, C: , а второй слайс содержит установленную FreeBSD. В этом примере у установленной FreeBSD есть три раздела с данными и раздел подкачки.
В каждом из трех разделов есть файловая система. Раздел a используется для корневой файловой системы, e для иерархии каталогов /var , а f для иерархии каталогов /usr .

4.7. Монтирование и размонтирование файловых систем
Файловая система лучше всего представима в виде дерева, с корнем в / . Каталоги, /dev , /usr и прочие - это ветви дерева, которые, в свою очередь, являются корнями для поддеревьев, также имеющих ветви ( /usr/local ), и т.д.
Хорошей практикой является разнесение некоторых особо важных каталогов на разные файловые системы. Например, /var , содержит log/ , spool/ , а также всевозможные временные файлы и нередко может занять все свободное место на диске. Поэтому лучше смонтировать /var отдельно, чтобы избежать переполнения / .
Часто бывает так, что некоторые разделы файловой системы расположены на разных физических носителях (дисках, CDROM), виртуальных или сетевых (например, сетевая файловая система (Network File System, NFS)). В этом случае узлы файловой иерархии будут расположены на разных файловых системах.
4.7.1. Файл fstab
Файловые системы, перечисленные в /etc/fstab , монтируются автоматически в процессе загрузки (если, конечно, для них не указана опция noauto ).
Формат файла /etc/fstab следующий (файловые системы перечисляются построчно):
устройство /точка-монтирования тип файловой системы опции частота дампов порядок проверки
устройство
Имя устройства (которое должно присутствовать), как описано в Имена устройств.
Каталог (существующий), куда следует смонтировать файловую систему.
тип файловой системы
Тип файловой системы, который передается программе mount(8). По умолчанию FreeBSD использует ufs .
Например, rw , для монтирования файловой системы в режиме "чтение-запись", или ro , для режима "только чтение", за которыми могут следовать и другие опции. Довольно часто используется опция noauto , чтобы не монтировать автоматически файловые системы в процессе загрузки. Об остальных опциях можно прочитать в mount(8).
Используется утилитой dump(8) для определения файловых систем, с которых необходимо периодически снимать специальные архивные копии. При отсутствии этого параметра принимается равным нулю.
Определяет порядок, в котором следует проверять файловые системы (чаще всего, в случае некорректного размонтирования или внезапной перезагрузки системы). Если файловую системы не нужно проверять, этот параметр должен быть установлен в ноль. Для корневой файловой системы (которая должна быть проверена в первую очередь) установите его в 1. Для всех остальных - 2 или больше. Если две или более файловые системы имеют одинаковое значение passno , fsck(8) попытается проверять их параллельно (если, конечно, это возможно физически).
Обратитесь к fstab(5) за дополнительной информацией о формате файла /etc/fstab и различных опциях монтирования.
4.7.2. Команда mount
Команда mount(8) используется, как следует из ее имени, для монтирования файловых систем.
Пример использования (простейший случай):
Перечислим основные опции, которые может принимать команда mount(8) (полный список смотрите на странице справочника):
Опции монтирования
Смонтировать все файловые системы, перечисленные в файле /etc/fstab . Исключение составляют помеченные как "noauto", перечисленные после опции -t и уже смонтированные.
Сделать все, кроме самого системного вызова mount. Эта опция полезна вместе с флагом -v для определения того, что на самом деле пытается сделать mount(8).
Монтировать поврежденный раздел (опасно!), или форсировать отмену всех запросов на запись при изменении режима монтирования с "чтение-запись" на "только чтение".
Монтировать файловую систему в режиме "только для чтения". То же самое, что и указание аргумента ro для опции -o .
Монтировать файловую систему как систему указанного типа, или, в случае опции -a , только файловые системы данного типа.
По умолчанию, тип файловой системы - "ufs".
Обновить опции монтирования для файловой системы.
Выдавать более подробную информацию.
Монтировать файловую систему в режиме "чтение-запись".
Опция -o принимает разделенные запятыми аргументы, включая нижеперечисленные:
Запрет на исполнение бинарных файлов на файловой системе (тоже полезная опция для повышения безопасности системы).
Игнорировать setuid и setgid биты на файловой системе (еще одна полезная опция для повышения безопасности системы).
4.7.3. Команда umount
Команда umount(8) принимает в качестве параметра точку монтирования какой-либо файловой системы, имя устройства, опцию -a или -A .
Кроме того, вы можете дополнительно указать опцию -f для форсированного размонтирования файловой системы, и -v для получения более подробной информации. Имейте ввиду, что это в общем случае опасно и потому не рекомендуется, так как тем самым вы можете нарушить работу компьютера или повредить данные на файловой системе.
Опции -a и -A используются для размонтирования всех файловых систем (разве что вы укажете опцию -t ). Разница состоит в том, что -A не пытается размонтировать корневую файловую систему.
4.8. Процессы
FreeBSD является многозадачной операционной системой. Это означает, что одновременно может быть запущена более чем одна программа. Каждая программа, работающая в некоторый момент времени, называется процессом. Каждая команда, которую вы запускаете, порождает хотя бы один процесс. Есть несколько системных процессов, запущенных все время и поддерживающих функциональность системы.
У каждого процесса есть уникальный номер, называемый process ID, или PID, и, как и у файлов, у каждого процесса есть владелец и группа. Информация о владельце и группе процесса используется для определения того, какие файлы и устройства могут быть открыты процессом с учетом прав на файлы, о которых говорилось ранее. Также у большинства процессов есть родительский процесс. Например, при запуске команд из оболочки, оболочка является процессом и любая запущенная команда также является процессом. Для каждого запущенного таким путем процесса оболочка будет являться родительским процессом. Исключением из этого правила является специальный процесс, называемый init(8). init всегда первый процесс, его PID всегда 1. init запускается автоматически ядром во время загрузки FreeBSD.
Две команды очень полезны для просмотра работающих в системе процессов, это ps(1) и top(1). Команда ps используется для получения списка запущенных процессов и может показать их PID, сколько памяти они используют, команду, которой они были запущены и т.д. Команда top показывает запущенные процессы и обновляет экран каждые несколько секунд, что позволяет наблюдать за работой компьютера в реальном времени.
По умолчанию, ps показывает только принадлежащие вам процессы. Например:
% ps PID TT STAT TIME COMMAND 298 p0 Ss 0:01.10 tcsh 7078 p0 S 2:40.88 xemacs mdoc.xsl
Как вы можете видеть в данном примере, вывод ps(1) организован в несколько колонок. Идентификатор процесса PID обсуждался ранее. PID назначаются с 1 до 99999 и опять с начала, если последнее число будет превышено (однажды выданный и используемый PID не может быть назначен повторно). Колонка TT показывает терминал (tty), на котором запущена программа (можете пока забыть про это). STAT показывает состояние программы и опять же может быть пока проигнорирован. TIME это количество времени центрального процессора, использованное программой - это обычно не время, прошедшее с запуска программы, поскольку большинство программы проводят много времени в ожидании некоторого события перед тем, как занять время процессора. Наконец, COMMAND это команда, которой программа была запущена.
У ps(1) есть множество различных опций, влияющих на выводимую информацию. Один из наиболее полезных наборов опций это auxww . a позволяет показать информацию о всех запущенных процессах, а не только тех, которыми вы владеете. u показывает имя пользователя, владеющего процессом, и информацию об используемой памяти. x показывает информацию о процессах-даемонах и ww указывает ps(1) показать всю командную строку для каждого процесса, вместо обрезания ее, когда она станет слишком длинной, чтобы уместиться на экран.
Вывод top(1) похож на только что описанный. Обычно он выглядит так:
% top last pid: 72257
Вывод разбит на два раздела. Заголовок (первые пять строк) показывает PID последнего запущенного процесса, среднее значение загрузки системы (которое показывает насколько система занята), время работы системы с последней перезагрузки и текущее время. Другие цифры заголовка относятся к количеству запущенных процессов (в данном примере 47), количеству занятой памяти и подкачки и время, занимаемое различными состояниями процессора.
Ниже идут несколько колонок, содержащих похожую на вывод ps(1) информацию. Как и раньше, это PID, время процессора, командная строка. top(1) показывает также величину занятой процессом памяти. Это значение разбито на две колонки, одна для общего объема, а другая для резидентного - общий объем показывает сколько всего памяти нужно приложению, а резидентный показывает количество памяти, используемой в данный момент. Из этого примера видно, что getenv(3) требует почти 30 MB памяти, но в данный момент использует только 9 MB.
top(1) автоматически обновляет экран каждые две секунды; это значение можно изменить опцией s .
4.9. Даемоны, сигналы, уничтожение процессов
Если вы запускаете редактор, им можно легко управлять, открывать в нем файлы и т.д. Вы можете делать это, поскольку редактор предоставляет такие возможности и потому, что редактор присоединен к терминалу. Некоторые программы разработаны без поддержки интерфейса пользователя, поэтому они отсоединяются от терминала при первой возможности. Например, веб-сервер целый день отвечает на запросы из сети, и ему как правило не требуется ваше вмешательство. Программы, передающие почту от сервера к серверу - другой пример приложений этого класса.
Мы называем эти программы даемонами. Даемоны это персонажи греческой мифологии: хорошие или плохие, они были спутниками человека и, вообще говоря, выполняли полезную работу для людей, почти как веб- и почтовые серверы выполняют полезную работу сегодня. Это причина, по которой талисманом BSD долгое время является веселый даемон в кедах и с вилами.
Есть соглашение, по которому имя программы, которая обычно запускается как даемон, заканчивается на "d". BIND это Berkeley Internet Name Domain, а выполняемая программа называется named ; программа веб сервера Apache называется httpd ; даемон очереди печати это lpd и так далее. Это соглашение, а не жесткое правило; например, главный почтовый даемон для Sendmail называется sendmail , а не maild , как вы могли бы предположить.
Иногда может потребоваться взаимодействие с процессом даемона. Один из способов взаимодействия с процессом даемона (или с любым другим запущенным процессом) - это посылка ему так называемого сигнала. Есть множество различных сигналов - некоторые из них имеют специальное значение, другие обрабатываются приложением, реакция которого на эти сигналы должна быть описана в документации. Вы можете посылать сигналы только тем процессам, владельцем которых являетесь. Если вы отправите сигнал какому-то другому процессу с помощью kill(1) или kill(2), доступ будет запрещен. Исключением из правил является пользователь root , который может отправлять сигналы любому процессу.
В некоторых случаях FreeBSD тоже посылает сигналы приложениям. Если приложение плохо написано и пробует обратиться к области памяти, к которой оно не должно обращаться, FreeBSD посылает процессу сигнал нарушение сегментации ( SIGSEGV ). Если приложение использует системный вызов alarm(3), чтобы получить уведомление по истечении определенного периода времени, будет отправлен сигнал Alarm ( SIGALRM ) и т.д.
Два сигнала могут быть использованы для завершения процесса, SIGTERM и SIGKILL . SIGTERM это корректный способ завершить процесс; процесс может поймать сигнал, определить, что его хотят завершить, закрыть любые файлы, которые он мог открыть, и закончить то, что он делал в момент перед закрытием. В некоторых случаях процесс может даже игнорировать SIGTERM , если выполняет задачу, которая не может быть прервана.
SIGKILL не может быть проигнорирован процессом. Этот сигнал говорит "Меня не волнует что ты делаешь - остановись немедленно". Если вы посылаете процессу SIGKILL , FreeBSD сразу же остановит этот процесс.
Другие сигналы, которые возможно вам понадобятся, SIGHUP , SIGUSR1 , и SIGUSR2 . Это сигналы общего назначения, различные приложения могут по-разному реагировать на них.
Предположим, что вы изменили файл конфигурации веб сервера - теперь нужно указать ему перечитать конфигурацию. Можно остановить и запустить httpd , но это приведет к кратковременной остановке сервера, которая может быть нежелательна. Большинство даемонов написаны так, чтобы при получении сигнала SIGHUP перечитывать файлы конфигурации. Поэтому вместо уничтожения и запуска httpd можно послать сигнал SIGHUP . Поскольку нет стандартного способа реагирования на этот сигнал, различные даемоны будут вести себя по разному; прочитайте документацию на даемон по этому вопросу.
Сигналы посылаются с помощью команды kill(1), как показано в этом примере.
Procedure: Отправка сигнала процессу
Этот пример показывает как послать сигнал inetd(8). Файл конфигурации inetd /etc/inetd.conf , inetd перечитает этот файл, если ему отправить сигнал SIGHUP .
- Нужно определить PID процесса, которому вы хотите отправить сигнал. Сделайте это с помощью ps(1) и grep(1). Команда grep(1) используется для поиска по заданной строке в выходном потоке. Эта команда запускается под обычным пользователем, а inetd(8) под root , поэтому ps(1) должна быть запущена с параметром ax .
% ps inetd 198 ?? IWs 0:00.00 inetd
% su Password:
Как и большинство команд UNIX®, kill(1) ничего не выведет, если отработает нормально. Если вы посылаете сигнал процессу, которым не владеете, на экране появится kill: PID: Operation not permitted . При неправильно набранном PID вы или отправите сигнал другому процессу, что может привести к неприятностям, или, если повезет, сигнал будет отправлен на PID, который в данный момент не используется - на экране появится kill: PID: No such process .
Зачем использовать /bin/kill ?
Во многих оболочках команда kill встроена; таким образом, оболочка вместо вызова /bin/kill сама посылает сигнал. Это может быть очень полезно, но в разных оболочках имя сигнала указывается по-разному. Чем пытаться выучить их все, гораздо проще использовать /bin/kill … непосредственно.
Отправка других сигналов очень похожа, просто замените TERM или KILL в командной строке на имя другого сигнала.
Уничтожение процессов наугад может быть плохой идеей. В частности, init(8), чей PID 1, имеет особое значение. Выполнение /bin/kill -s KILL 1 - быстрый способ перегрузить систему. Всегда дважды проверяйте параметры запуска kill(1) перед тем, как нажать Enter .
4.10. Интерпретатор команд
При работе с FreeBSD, в большинстве случаев для выполнения повседневных задач используется командный интерфейс (так называемая "оболочка", "shell"). Основная задача интерпретатора - принимать вводимые команды и выполнять их. Многие командные интерпретаторы имеют встроенные средства для выполнения повседневной работы, например, операции над файлами и каталогами, редактирование командной строки, командные макросы и переменные окружения. Вместе с FreeBSD поставляется несколько командных интерпретаторов, например, sh , или Bourne Shell, и tcsh , расширенная версия C-shell. Многие другие интерпретаторы доступны из коллекции портов FreeBSD, например zsh и bash .
Какой из командных интерпретаторов использовать? Это дело вкуса. Если вы программируете на C, то вам, возможно, понравится tcsh . Если вы работали с Linux, или только начинаете работать с интерфейсом командной строки UNIX®, попробуйте bash . Каждый из названных интерпретаторов имеет свои особенности, которые отличат его от других, и, возможно, повлияют на ваш выбор.
Одна из наиболее часто используемых функций командного интерпретатора - дополнение частичного имени файла до полного. Вы можете набрать только первые несколько символов имени файла, нажать клавишу табуляции (TAB), и командный интерпретатор автоматически завершит имя. Например, у нас есть два файла, названные foobar и foo.bar . Допустим, мы хотим удалить файл foo.bar . Для этого, наберем на клавиатуре rm fo[Tab].[Tab] .
Вы увидите следующее: rm foo[BEEP].bar .
Здесь [BEEP] - это так называемый консольный сигнал, оповещающий о том, что интерпретатор не в состоянии закончить имя файла, так как по введенным вами символам невозможно однозначно идентифицировать файл. Например, имена файлов foobar и foo.bar оба начинаются с fo , но после нажатия TAB можно однозначно дополнить только до foo . Если же теперь ввести точку ( . ) и вновь нажать TAB, интерпретатор достроит имя файла целиком.
Дополнительные возможности при работе с интерпретатором дает использование переменных окружения. Переменные окружения это пары переменная/значение, хранящиеся в памяти интерпретатора. Значение переменных окружения может быть прочитано любой программой, запущенной из командного интерпретатора, и часто содержит настройки для многих приложений и утилит. Ниже приведены некоторые наиболее часто встречающиеся переменные окружения и их значения:
Имя текущего пользователя.
Каталоги, разделенные двоеточием, для поиска исполняемых файлов.
Сетевое имя виртуального дисплея X11, доступного для подключения.
Текущий командный интерпретатор.
Тип терминала пользователя. Используется, чтобы узнать возможности терминала.
Список escape-последовательностей для управления различными функциями терминала.
Название (тип) операционной системы. Например, FreeBSD.
Архитектура машины (процессора).
Выбранный пользователем текстовый редактор.
Выбранная пользователем утилита просмотра файлов.
Каталоги, разделенные двоеточием, для поиска файлов системного справочника.
Установка значений переменных окружения различна для разных оболочек. Например, в интерпретаторах C-стиля, таких как tcsh и csh , это setenv . В интерпретаторах Bourne, таких как sh и bash , это export . Например, чтобы установить или изменить значение переменной EDITOR к значению /usr/local/bin/emacs в csh или tcsh , выполните команду:
% setenv EDITOR /usr/local/bin/emacs
В оболочках Bourne:
% Чтобы получить значение переменной, например, в командной строке, поместите символ $ перед именем переменной. Например, команда echo $TERM выведет значение переменной $TERM .
Командный интерпретатор воспринимает некоторые символы, называемые метасимволами, в качестве управляющих. Один из наиболее часто используемых - символ * , который заменяет любое количество символов в имени файла. Метасимволы используются для поиска файлов по маске, например, команда echo * делает практически тоже самое, что и команда ls , поскольку интерпретатор вызывает команду echo , передавая ей имена всех файлов, попадающих под маску * .
В некоторых ситуациях требуется, чтобы интерпретатор воспринимал метасимволы как обычные, не несущие специальной смысловой нагрузки. Этого можно достичь, поставив перед символом обратную косую черту ( \ ). Например, команда echo $TERM выведет тип вашего терминала, в то же время команда echo \$TERM выведет именно слово $TERM , а не значение переменной $TERM .
4.10.1. Как изменить командный интерпретатор по умолчанию
Самым простым способом, пожалуй, будет воспользоваться командой chsh . Если переменная EDITOR определена, то будет загружен соответствующий текстовый редактор, иначе vi. Вам нужно будет изменить значение поля "Shell:" и выйти из редактора с сохранением результатов.
Можно также воспользоваться опцией -s команды chsh . Например, если вы хотите изменить интерпретатор на bash , выполните:
% chsh
Интерпретатор, который вы будете использовать, обязательно должен быть в файле /etc/shells . Обычно, при установке интерпретаторов из коллекции портов, это делается автоматически. Если же это не так, вам нужно будет самостоятельно добавить соответствующую строчку в этот файл.
Например, если вы установили bash вручную и поместили его в каталог /usr/local/bin , нужно набрать:
> /etc/shells
Теперь можно смело использовать команду chsh .
4.11. Текстовые редакторы
Большинство настроек в FreeBSD производится путем редактирования текстовых файлов. Соответственно, вам нужно будет освоиться с каким-либо текстовым редактором. Вместе с FreeBSD поставляются лишь некоторые из них, гораздо больше редакторов доступно из Коллекции портов.
Самым простым в изучении и использовании, по-видимому, можно назвать ee, что расшифровывается как "easy editor", т.е. "простой редактор". Чтобы начать редактировать какой-либо файл, наберите в командной строке ee filename , где filename имя редактируемого файла. Например, для редактирования файла /etc/rc.conf , наберите ee /etc/rc.conf . В верхней части экрана вы увидите список основных команд редактора. Символ каретки ( ^ ) означает клавишу Ctrl , таким образом, ^e означает комбинацию клавиш Ctrl + e . Чтобы выйти из редактора, нажмите клавишу Esc , затем Enter . Если остались какие-либо не сохраненные данные, вам потребуется подтвердить выход, сохранив результат работы или оставив файл без изменения.
В FreeBSD присутствует также более мощный текстовый редактор vi, а редакторы emacs и vim можно найти в коллекции портов (editors/emacs и editors/vim). Эти редакторы обладают еще большей функциональностью и мощью, но они также и более сложны в изучении. Однако, если в будущем вам потребуется часто редактировать большие объемы текстов, то время, потраченное на изучение более мощного редактора, такого как vim или Emacs, окупится с лихвой.
Многие приложения, модифицирующие файлы или требующие текстового ввода, автоматически открывают текстовый редактор. Чтобы сменить используемый по умолчанию редактор, установите переменную окружения EDITOR . За деталями обратитесь к разделу интерпретатор команд.
4.12. Устройства и файлы устройств
Термин "устройство" используется в основном по отношению к аппаратному обеспечению системы, такому как диски, принтеры, графические адаптеры, устройства ввода текста. При загрузке FreeBSD главным образом выводит на экран информацию об обнаруженных устройствах. Вы можете найти эти сообщения в файле /var/run/dmesg.boot .
Например, acd0 это первый диск IDE CDROM, а kbd0 - клавиатура.
В UNIX® доступ к большинству этих устройств можно получить через специальные файлы устройств, расположенные в каталоге /dev .
4.12.1. Создание файлов устройств
При добавлении в систему нового устройства, или добавлении поддержки дополнительных устройств, потребуется создать один или несколько файлов устройств для нового оборудования.
4.12.1.1. DEVFS (DEVice File System)
Device filesystem, или DEVFS , предоставляет доступ к пространству устройств ядра через общую файловую систему. Вместо создания и модификации файлов устройств, DEVFS создает специальную файловую систему.
Обращайтесь к devfs(5) за дополнительной информацией.
4.13. Бинарные форматы
Для понимания того, почему FreeBSD использует формат elf(5), вам потребуется сначала немного узнать о трех "доминирующих" исполняемых форматах для UNIX®:
Старейший и "классический" объектный формат UNIX®. Он использует короткий и компактный заголовок с магическим числом в начале, которое часто используется для описания формата (смотрите a.out(5) с более подробной информацией). Он содержит три загружаемых сегмента: .text, .data и .bss плюс таблицу символов и таблицу строк.
Объектный формат SVR3. Заголовок включает таблицу разделов, так что могут быть сегменты кроме .text, .data и .bss.
Наследник формата COFF, поддерживающий множественные сегменты и 32-битные или 64-битные значения. Одно важное замечание: ELF был разработан в предположении что есть только по одному ABI на одну архитектуру. Это предположение совершенно неверно, и не только в мире коммерческих SYSV (в котором есть как минимум три ABI: SVR4, Solaris, SCO).
FreeBSD пытается обойти эту проблему, в частности предоставляя утилиту для оглавления известного исполняемого файла ELF информацией об ABI с которым он совместим. Обратитесь к странице справочника brandelf(1) за более подробной информацией.
FreeBSD имеет произошла из "классического" лагеря и использовала формат a.out(5), технологию опробованную и проверенную на многих поколениях релизов BSD, до начала ветки 3.X. Хотя собирать и запускать родные бинарные файлы ELF (и ядро) в системе FreeBSD можно было несколько раньше, FreeBSD вначале сопротивлялась "проталкиванию"ELF как формата по умолчанию. Почему? Когда лагерь Linux производил болезненный переход к ELF, у него не было большого преимущества перед исполняемым форматом a.out , из-за негибкого, основанного на таблице переходов механизма разделяемых библиотек, что делало создание разделяемых библиотек очень трудным для поставщиков и разработчиков. Когда доступные инструменты ELF предоставили решение проблемы разделяемых библиотек, и появилась некоторая перспектива, цена перехода была признана допустимой и он был сделан. Механизм разделяемых библиотек FreeBSD близок по стилю к механизму разделяемых библиотек SunOS™ от Sun, и поэтому очень прост в использовании.
Итак, почему так много разных форматов?
Давно, в темном далеком прошлом, оборудование было простым. Это простое оборудование поддерживало простые, маленькие системы. a.out был совершенно адекватен задаче представления бинарных файлов на таких простых системах (PDP-11). Люди, портировавшие UNIX® с этих простых систем, оставили a.out формат потому, что он был достаточен для ранних портов UNIX® на архитектуры, подобные Motorola 68k, VAXen, etc.
Затем какой-то смышленый инженер по оборудованию решил, что если он сможет заставить программы исполнять некоторые трюки, то сможет несколько упростить дизайн и заставить ядро CPU работать быстрее. Хотя это было сделано с новым типом оборудования (известного сейчас как RISC), формат a.out не подходил для него, и было разработано множество форматов, чтобы получить лучшую производительность на таком оборудовании по сравнению с той, которую мог предоставить простой формат a.out . Были изобретены форматы COFF, ECOFF и некоторые другие малоизвестные форматы, и их ограничения были учтены, когда все похоже остановились на ELF.
Кроме того, размеры программ стали огромны, а диски (и оперативная память) остались относительно малы, поэтому появилась концепция разделяемых библиотек. Система VM также стала более сложной. Хотя все эти усовершенствования были выполнены с форматом a.out , его полезность все больше и больше уменьшалась с каждым нововведением. К тому же потребовалась динамическая загрузка во время выполнения, или выгрузка частей программы после выполнения стартового кода для экономии памяти или места на диске. Языки усложнялись, и потребовался автоматический вызов кода перед главной программой. Множество изменений было внесено в формат a.out , чтобы все это появилось, и в основном работало некоторое время. Настал момент, когда a.out не смог решить все эти проблемы без чрезмерного увеличения размера и сложности. В то время, как ELF решил многие из этих проблем, перевод этого формата с системы на систему болезнен. Поэтому формату ELF пришлось подождать, пока не стало более болезненным оставаться с a.out , чем перейти на ELF.
Тем временем, инструменты разработки, от которых произошли инструменты разработки FreeBSD (особенно ассемблер и загрузчик), развивались в двух параллельных направлениях. Направление FreeBSD добавило разделяемые библиотеки и устранило некоторые ошибки. Люди из GNU, написавшие эти программы, переписали их и добавили простую поддержку сборки кросс-компиляторов, подключения различных форматов в будущем и так далее. Многим требовалось собрать кросс-компиляторы для FreeBSD, и это не удалось, поскольку устаревшие исходные тексты FreeBSD для as и ld не подходили для этой задачи. Новый набор инструментов GNU (binutils) поддерживает кросс-компилирование, ELF, разделяемые библиотеки, C++, расширения и т.д. В дополнение, многие поставщики выпустили программы в формате ELF и они хорошо подходят для запуска в FreeBSD.
ELF более выразителен, чем a.out , позволяет базовой системе быть более гибкой. ELF лучше поддерживается, и предоставляет поддержку кросс-компиляторов, что важно для многих людей. ELF может быть немного медленнее, чем a.out , но замерить это сложно. Есть также множество деталей, отличающихся для этих двух форматов, в том как они отображают страницы, обрабатывают начальный код, и т.д. В этом нет ничего очень важного, но они различаются. В настоящее время поддержка a.out убрана из ядра GENERIC , и со временем будет убрана из ядра, как только потребность в запуске старых программ a.out останется в прошлом.
4.14. Дополнительная информация
4.14.1. Системный справочник (man)
Пожалуй, самым полным руководством по FreeBSD является системный справочник (man). Практически каждое приложение или утилита имеют соответствующую страницу (часто не одну), описывающую тот или иной аспект работы программы, всевозможные опции и настройки. Для просмотра этих страниц существует команда man :
% man Здесь command - это команда, о которой вы хотите получить информацию. Например, чтобы узнать побольше о команде ls , наберите:
% man Содержимое системного справочника для удобства разделено на несколько разделов:
- Пользовательские команды.
- Системные вызовы и коды ошибок.
- Функции стандартных библиотек.
- Драйверы устройств.
- Форматы файлов.
- Развлечения и игры.
- Дополнительная информация.
- Команды системного администрирования.
- Для разработчиков ядра.
В некоторых случаях (не так уж редко), страницы, относящиеся к одной и той же команде, находятся в различных разделах справочника. Например, есть команда chmod и системный вызов chmod() . В этом случае, необходимо явно указать раздел man , в котором нужно искать соответствующую страницу:
% man 1 Эта команда выведет справку об утилите chmod . По традиции, конкретный раздел справочника указывается в скобках после команды, например, chmod(1) относится к утилите chmod , а chmod(2) - к соответствующему системному вызову.
Часто бывает так, что вы не знаете название команды, но имеете представление о том, что она должна делать. В этом случае можно попытаться найти нужную команду по ключевым словам, встречающимся в ее описании, используя опцию -k программы man :
Вы получите список команд, имеющих слово "mail" в своих описаниях. Это эквивалентно использованию команды apropos .
Или например, вы видите список файлов в каталоге /usr/bin , при этом не имея ни малейшего представления о том, какие функции выполняет каждый их них? Просто наберите:
% что фактически одно и то же.
4.14.2. Файлы GNU Info
FreeBSD поставляется с многочисленными приложениями и утилитами от Фонда Свободного Программного Обеспечения, Free Software Foundation (FSF). В дополнение к страницам справочника, с этими программами поставляется обширная гипертекстовая документация в виде так называемых info файлов, которые могут быть просмотрены с помощью команды info , или, если установлен emacs, в info режиме этого редактора.
Чтобы воспользоваться командой info(1), просто наберите в командной строке:
% info
Вызвать на экран краткое введение можно набрав h . Краткий список команд можно получить набрав ? .
Изменено: 11 декабря 2021 г. by Sergio Carlavilla Delgado