Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!
Статья рассчитана на тех, кто не имеет или имеет мало опыта работы с командной строкой 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 test
Adding 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 successfully
Changing the user information for test
Enter 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 test
root@osboxes:~#
На данном этапе уже можно использовать тестовую среду, выполняя команды в терминале (Ctrl+Alt+T). Дополнительно можно настроить подключение по ssh клиентом (например, PuTTY), мы рассмотрим это отдельно.
3. Первые команды
Итак, мы подключились к терминалу и находимся в shell. Давайте сориентируемся в пространстве.
Чтобы узнать имя машины(сервера), на которой мы находимся, введем hostname
и нажмем Enter:
test@osboxes:~$ hostname
osboxes
Имя пользователя, под которым мы подключены, как правило отображается в приглашении командной строки (test@osboxes:~$). Если имя текущего пользователя не отображается (например, если задан другой формат приглашения), то его можно получить командой whoami
, или id
(также отображает группы пользователя):
test@osboxes:~$ whoami
test
test@osboxes:~$ id
uid=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/passwd
root: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/bash
Password:
Теперь давайте проверим, в каком каталоге мы находимся, для этого выполним команду pwd
:
test@osboxes:~$ pwd
/home/test
Для получения списка файлов текущей директории используем команду ls
. По соглашению, скрытые файлы начинаются с точки. Для отображения их с помощью команды ls нужно добавить ключ –a. Чтобы отобразить список в расширенном формате, добавим ключ –l. Таким образом команда и её вывод будут выглядеть так:
test@osboxes:~$ ls -al
total 36
drwxr-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 .bashrc
drwxr-xr-x 4 test test 4096 Nov 8 11:40 .cache
drwxr-xr-x 4 test test 4096 Nov 8 11:40 .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-r--r-- 1 test test 0 Nov 9 01:05 .sudo_as_admin_successful
test@osboxes:~$
Для команды ls с параметрами может быть задан синоним (alias), что упрощает её ввод. Список уже заданных синонимов можно получить командой alias
:
test@osboxes:~$ alias
alias 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 /tmp
test@osboxes:/tmp$ lshome
total 40
drwxr-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 .bashrc
drwxr-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 pwd
pwd: 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. Для поиска выполненных ранее команд можно использовать клавиши «Вверх» и «Вниз», команды из истории можно редактировать и повторно выполнять. В конце статьи приведен список полезных команд.
Если данный материал интересен, то в продолжении статьи я расскажу про скрипты и их параметры, права доступа к файлам, операторы условного выполнения, выбора и циклы, функции и планировщик заданий.