Статья рассчитана на тех, кто не имеет или имеет мало опыта работы с командной строкой Unix/Linux, но желает научиться с ней эффективно взаимодействовать и разрабатывать скрипты для выполнения своих задач. Приведенные примеры справедливы для выполнения в командной оболочке bash операционной системы Ubuntu/Debian, но могут быть использованы и в других оболочках и ОС с учетом их специфики.
1. Командные оболочки
Существует множество дистрибутивов(форков) операционных систем(ОС) семейства Linux, наиболее известные среди них: Ubuntu, Debian, CentOS, Red Hat, Fedora, SuSE, FreeBSD, Mint.
Здесь есть большая схема со всеми форками Linux.
В каждой ОС существуют различные командные оболочки (shell), их назначение одинаково (администрирование, автоматизация, вычисления, мониторинг и т.д.), как и большинство основных команд, но реализация может отличаться. В таблице ниже приведено сравнение, в котором видно, что некоторые возможности поддерживаются не всеми оболочками.
Feature |
Bourne |
C |
TC |
Korn |
Bash |
Псевдонимы (синонимы) |
Нет |
Да |
Да |
Да |
Да |
Редактор командной строки |
Нет |
Нет |
Да |
Да |
Да |
Расширенные шаблоны файлов |
Нет |
Нет |
Нет |
Да |
Да |
Автозавершение имени файла |
Нет |
Да |
Да |
Да |
Да |
Стеки директорий (pushd and popd) |
Нет |
Да |
Да |
Нет |
Да |
История |
Нет |
Да |
Да |
Да |
Да |
Функции |
Да |
Нет |
Нет |
Да |
Да |
Горячие клавиши |
Нет |
Нет |
Да |
Нет |
Да |
Управление заданиями |
Нет |
Да |
Да |
Да |
Да |
Исправление ошибок в командах |
Нет |
Нет |
Да |
Нет |
Да |
Формат приглашения командной строки |
Нет |
Нет |
Да |
Нет |
Да |
Список доступных командных оболочек можно получить командой
cat /etc/shells
При необходимости можно установить нужную командную оболочку
командой sudo apt install <имя_оболочки>
.
Например, для установки ksh нужно выполнить
sudo apt install ksh
2. Настройка тестовой среды
Если у вас уже есть виртуальная/реальная машина с установленным
Linux, или вы знаете, как её настроить, то можно пропустить
информацию из спойлера ниже. Если есть доступ по ssh к какому-либо
серверу, то Вы также можете использовать его shell для тренировок.
Используйте имеющийся доступ с осторожностью, не тренируйтесь на
продуктовых(промышленных) серверах и других критичных окружениях.
Если вы не хотите развертывать виртуальную машину(ВМ), то для
тестов можно воспользоваться онлайн-терминалами, но нужно знать и
учитывать их особенности и ограничения. Примеры
онлайн-терминалов:
https://cocalc.com/app?anonymous=terminal
https://www.tutorialspoint.com/execute_bash_online.php
https://rextester.com/l/bash_online_compiler
VirtualBox ПО для виртуализации, позволяющее запускать одну ОС внутри другой. Разумеется, существуют и другие способы развертывания ВМ, здесь мы рассмотрим лишь один из них. В данном случае, предполагается, что у вас ПК под управлением Windows или Mac. Для начала нужно скачать VirtualBox отсюда и установить его.
Также нужно скачать образ ВМ с установленной ОС Ubuntu отсюда. Качайте самую новую версию, убедитесь, что скачиваемый образ имеет формат VirtualBox (VDI).
Создадим виртуальную машину. Сначала создаем на локальном диске папку для размещения в ней ВМ и их файлов (у меня C:\vmachines). Распакуем скачанный образ диска ВМ в созданную папку:
Для распаковки потребуется архиватор 7zip или другой, поддерживающий формат .7z. Далее запускаем VirtualBox и выбираем меню Машина -> Создать:
В открывшемся окне указываем имя ВМ (тип и версия в большинстве случаев подтягиваются автоматически, если это понятно из имени), а также созданную нами папку. Объем оперативной памяти устанавливается автоматически, 1Гб достаточно для выполнения тестов. Выбираем Использовать существующий виртуальный жесткий диск, нажимаем значок выбора образа жесткого диска, в открывшемся окне нажимаем Добавить, выбираем распакованный ранее файл образом ВМ и нажимаем Открыть:
Нажимаем Выбрать:
И нажимаем Создать:
Выбираем в списке созданную ВМ и нажимаем Запустить:
После запуска ВМ появится окно для входа в ОС:
Выбираем учетную запись osboxes.org и вводим пароль osboxes.org. После входа в систему нажимаем Ctrl+Alt+T, у нас откроется окно терминала, в котором можно выполнять тесты:
Для удобства можно развернуть окно виртуальной машины на весь экран, окно терминала также будет развернуто. Для того, чтобы можно было вставлять данные из буфера в терминал ВМ и копировать их, можно включить в настройках ВМ общий буфер обмена в меню Устройства -> Общий буфер обмена -> Двунаправленный:
Создадим тестового пользователя.
Для создания пользователя нам понадобятся права
суперпользователя (root). Для их получения выполним команду
sudo su -
, указав пароль текущего пользователя
(osboxes.org). Далее создадим пользователя test командой
adduser test
. Также выдадим пользователю test права на
повышение привилегий при необходимости, выполнив команду
usermod -aG sudo test
:
osboxes@osboxes:~$ sudo su -[sudo] password for osboxes:root@osboxes:~# adduser testAdding user `test' ...Adding new group `test' (1001) ...Adding new user `test' (1001) with group `test' ...The home directory `/home/test' already exists. Not copying from `/etc/skel'.New password:Retype new password:passwd: password updated successfullyChanging the user information for testEnter the new value, or press ENTER for the default Full Name []: Room Number []: Work Phone []: Home Phone []: Other []:Is the information correct? [Y/n]root@osboxes:~# usermod -aG sudo testroot@osboxes:~#
На данном этапе уже можно использовать тестовую среду, выполняя команды в терминале (Ctrl+Alt+T). Дополнительно можно настроить подключение по ssh клиентом (например, PuTTY), мы рассмотрим это отдельно.
3. Первые команды
Итак, мы подключились к терминалу и находимся в shell. Давайте
сориентируемся в пространстве.Чтобы узнать имя машины(сервера), на
которой мы находимся, введем hostname
и нажмем
Enter:
test@osboxes:~$ hostnameosboxes
Имя пользователя, под которым мы подключены, как правило
отображается в приглашении командной строки
(test@osboxes:~$). Если имя текущего пользователя
не отображается (например, если задан другой формат приглашения),
то его можно получить командой whoami
, или
id
(также отображает группы пользователя):
test@osboxes:~$ whoamitesttest@osboxes:~$ iduid=1001(test) gid=1001(test) groups=1001(test),27(sudo)
Чтобы узнать, в какой оболочке мы находимся, нужно выполнить
команду echo $SHELL
:
test@osboxes:~$ echo $SHELL/bin/bash
Разберем, что произошло. Команда echo
выводит
значение параметра, переданного ей, в нашем случае мы передали
$SHELL. Знак $ означает, что мы обращаемся к переменной, т.е.
$SHELL возвращает значение переменной SHELL, заданной в окружении.
Список значений всех переменных можно получить командой
env
. Таким образом, отобразив значение переменной, мы
видим, что мы находимся в оболочке bash. Оболочка конкретного
пользователя указана в файле /etc/passwd, содержимое которого можно
получить так:
test@osboxes:~$ cat /etc/passwdroot:x:0:0:root:/root:/bin/bash...test:x:1001:1001:,,,:/home/test:/bin/dash
Команда cat выводит содержимое файла (часть строк в приведенном выводе пропущена и заменена на ). Из файла видим, что для пользователя test указана оболочка /bin/dash. Изменить оболочку текущего пользователя, которая будет загружаться по умолчанию, можно следующей командой(chsh сокращенное от change shell):
test@osboxes:~$ chsh -s /bin/bashPassword:
Теперь давайте проверим, в каком каталоге мы находимся, для
этого выполним команду pwd
:
test@osboxes:~$ pwd/home/test
Для получения списка файлов текущей директории используем
команду ls
. По соглашению, скрытые файлы начинаются с
точки. Для отображения их с помощью команды ls нужно добавить ключ
a. Чтобы отобразить список в расширенном формате, добавим ключ l.
Таким образом команда и её вывод будут выглядеть так:
test@osboxes:~$ ls -altotal 36drwxr-xr-x 5 test test 4096 Nov 9 01:05 .drwxr-xr-x 5 root root 4096 Nov 8 11:39 ..-rw------- 1 test test 9 Nov 8 12:28 .bash_history-rw-r--r-- 1 test test 220 Nov 8 11:39 .bash_logout-rw-r--r-- 1 test test 3771 Nov 8 11:39 .bashrcdrwxr-xr-x 4 test test 4096 Nov 8 11:40 .cachedrwxr-xr-x 4 test test 4096 Nov 8 11:40 .configdrwxr-xr-x 3 test test 4096 Nov 8 11:40 .local-rw-r--r-- 1 test test 807 Nov 8 11:39 .profile-rw-r--r-- 1 test test 0 Nov 9 01:05 .sudo_as_admin_successfultest@osboxes:~$
Для команды ls с параметрами может быть задан синоним (alias),
что упрощает её ввод. Список уже заданных синонимов можно получить
командой alias
:
test@osboxes:~$ aliasalias alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')"'alias egrep='egrep --color=auto'alias fgrep='fgrep --color=auto'alias grep='grep --color=auto'alias l='ls -CF'alias la='ls -A'alias ll='ls -alF'alias ls='ls --color=auto'
Видим, что команда ll
является синонимом команды
ls -alF
. Синонимы могут ссылаться на другие синонимы.
Так, в приведенном выше примере команда ll
выполняет
команду ls -alF
, в которой ls
в свою
очередь также является синонимом команды ls
--color=auto
. Для любой команды с целью упрощения её ввода
при частом использовании можно задать синоним. В синонимах также
можно использовать переменные среды. Например, чтобы иметь
возможность из любой директории получить список файлов домашней
директории, можно задать синоним командой alias lshome='ls
-alF $HOME'
, таким образом, можно выполнить:
test@osboxes:~$ cd /tmptest@osboxes:/tmp$ lshometotal 40drwxr-xr-x 5 test test 4096 Nov 9 02:29 ./drwxr-xr-x 5 root root 4096 Nov 8 11:39 ../-rw------- 1 test test 47 Nov 9 02:36 .bash_history-rw-r--r-- 1 test test 220 Nov 8 11:39 .bash_logout-rw-r--r-- 1 test test 3771 Nov 8 11:39 .bashrcdrwxr-xr-x 5 test test 4096 Nov 9 02:29 .cache/drwxr-xr-x 5 test test 4096 Nov 9 02:29 .config/drwxr-xr-x 3 test test 4096 Nov 8 11:40 .local/-rw-r--r-- 1 test test 807 Nov 8 11:39 .profile-rw-rw-r-- 1 test test 72 Nov 9 02:29 .selected_editor-rw-r--r-- 1 test test 0 Nov 9 01:05 .sudo_as_admin_successful
Здесь командой cd /tmp
мы перешли в директорию
/tmp, и, находясь в ней, выполнили команду lshome
,
которая вывела список файлов директории /home/test. При этом в
синониме мы ссылаемся на переменную $HOME, в которой содержится
путь к домашней директории текущего пользователя.
Алиасы задаются в файле ~/.bash_aliases. Тильда (~) означает домашнюю директорию пользователя. В нашем случае /home/test. Также можно задать их в файле ~/.bashrc. Здесь нужно сказать пару слов об этих файлах.
При запуске bash в качестве оболочки, сначала выполняется файлы (в случае их наличия), в которых могут быть заданы различные настройки профиля и выполнены различные действия в процессе входа до появления командной строки: сначала выполняется файл /etc/profile, далее bash последовательно ищет и выполняет первый из найденных файлов в следующем порядке: ~/.bash_profile, ~/.bash_login, ~/.profile. Из указанных файлов могут вызываться и другие.
Так, например, из файла ~./profile вызывается файл ~/.bashrc, из которого, в свою очередь, в числе прочих, вызывается файл .bash_aliases при его наличии. А файл /etc/profile выполняет также все файлы .sh, находящиеся в директории etc/profile.d.
В bash существуют внутренние команды, их список можно получить
командой help. Помощь по конкретной внутренней команде можно
получить с помощью команды help <имя_команды>
,
например:
test@osboxes:~$ help pwdpwd: pwd [-LP] Print the name of the current working directory. Options: -L print the value of $PWD if it names the current working directory -P print the physical directory, without any symbolic links By default, `pwd' behaves as if `-L' were specified. Exit Status: Returns 0 unless an invalid option is given or the current directory cannot be read.
Некоторые внутренние команды bash дублированы в виде исполняемых
файлов. Это сделано, чтобы скрипты можно было корректно выполнять в
оболочках, в которых не реализованы эти команды. Например,
существует исполняемый файл /usr/bin/echo, который реализует
функционал внутренней команды echo. Команда help echo
выведет справку по внутренней команде, а команда
/usr/bin/echo help
выведет справку для
соответствующего исполняемого файла. Вывод справки для этих команд
отличается, но в целом они реализуют идентичный функционал.
Таким образом, если в оболочке не реализована внутренняя команда echo, скрипт, содержащий вызов echo, сможет успешно выполниться, т.к. для обработки вызова будет использован исполняемый файл /usr/bin/echo. Для поиска выполненных ранее команд можно использовать клавиши Вверх и Вниз, команды из истории можно редактировать и повторно выполнять. В конце статьи приведен список полезных команд.
Если данный материал интересен, то в продолжении статьи я расскажу про скрипты и их параметры, права доступа к файлам, операторы условного выполнения, выбора и циклы, функции и планировщик заданий.