Archive for pev

Основные процессы Linux

[kthreadd] – PID 2, так называемый “мастер потоков” – это мастер-процесс, создающий процессы для управления аппаратной составляющей. В целом, большинство процессов ниже являются порождениями этого процесса, он как главный босс, раздающий работу и кричащий, что делать.

[rcu_gp] – Read-copy update. Специальный механизм синхронизации данных, позволяющий обрабатывать данные в несколько потоков. Нужен для многопоточной работы с данными.

[kworker/(u)X:X(H)] – процессы которые помогают ядру обрабатывать запросы. Таких процессов может быть много (в зависимости от нагрузки на ядро, чем больше запросов на выделение прерывания, чем больше таймеров и системных вызовов, тем больше процессов по работе в пространстве ядра).

[mm_percpu_wq] – процесс для управления памятью для каждого ядра.

[ksoftirqd/0] – на каждое процессорное ядро ядром Linux порождается один такой процесс, который необходим как для обработки аппаратных прерываний от установленного оборудования, прерываний от установленного программного обеспечения так и обработки исключений возникающих в процессе работы операционной системы. Посмотреть статистику можно в файле /proc/interrupts

[rcu_sched] – дополнительный процесс для корректной работы RCU (это процесс-планировщик).

[rcu_bh] – дополнительный процесс для корректной работы RCU, родственный rcu_sched, отвечает за так называемые “грейс периоды”, они же интервалы времени для завершения RCU-заданий (если простыми словами).

[migration/0] – процесс, которые распределяет другие процессы по ядрам. Один процесс на одно ядро.

[cpuhp/0] – процесс, создающийся 1 на 1 ядро, отвечающий за физическое добавление/удаление CPU в/из систем.

[kdevtmpfs] – заполняет и обслуживает дерево устройств.

[netns] – управляет сетью (фактически оно управляет пространством имен для сетей)

[khungtaskd] – процесс, который каждые две (чаще всего) минуты ищет зависшие задания.

[oom_reaper] – процесс, отвечающий за “убийство” процесса, который потребляет больше всего памяти, если ОЗУ на компьютере заканчивается.

[writeback] – процесс который записывает отложенные в кэше контроллера накопителя данные на сам накопитель. Инициировать можно командой sync

[kcompactd0] – отвечает за так называемое уплотнение памяти (работает по 1 процессу на 1 ядро, обычно – каждые 15 секунд).

[khugepaged] – отслеживает эффективность использование “huge pages” виртуальной памяти.

[crypto] – предоставляет API к крипто-модулю ядра.

[kintegrityd] – проверяет целостность блочных устройств с помощью записи/чтения с/на этих устройств/ах.

[kblockd] – процесс ищет перегрузки в I/O (операциях ввода-вывода).

[edac-poller] – ищет ошибки в памяти и устраняет их.

[devfreq_wq] – процесс  разрешает повторное использование так называемых “рабочих очередей” (workqueues).

[watchdogd] – средство наблюдения за нормальной работой системы, и если происходит какой-то сбой, то данный процесс запускает сброс (reset) системы с целью возобновить нормальное функционирование.

[kswapd0] – древняя, но почтенная система управления виртуальной памятью.

[kthrotld] – контролирует пропускную способность посредством “удушения” запросов в соответствии с приоритетами.

[ipv6_addrconf] – отвечает за конфигурацию очередей IPv6.

[kworker/u2:1-events_unbound] – тот же процесс, что и kworker.

[kstrp] – так называемый “парсер потоков”, он необходим для разбора и анализа сообщений на прикладном уровне.

[ata_sff] – процесс для использования устаревших ide/pata устройств.

[scsi_eh_0] – процесс обрабатывает ошибки, которые могут появляться при подключении дисков, определяемых как scsi-устройства.

[jbd2/vda1-8] – процесс, отвечающий за обновление журнала файловой системы.

[ttm_swap] – процесс, отвечающий за использование GPU памяти.

Модули Systemd

Чтобы понять разницу между всеми этими “модулями” или “юнитами”, надо вспомнить, что systemd, как и все остальное в Linux, является файлом. И все systemd-сущности являются разными файлами (например systemd службы хранят конфигурации в файле с расширением .service, а сокеты –  .socket и т.д.). Systemd, если рассматривать как демон, управляет другими демонами и является первым демоном, который запускается во время загрузки ОС.

1. Service unit (служба .service) –  подразумевается самая обычная системная служба

2. Target unit (цель .target) – это юнит, используемый для группировки юнитов по зависимостям. Они выполняют ту же функцию, что и runlevels (уровни запуска), но принцип работы отличается. Посмотреть список юнитов типа “цель” можно следующей командой: systemctl list-units –type=target

3. Mount unit (точка монтирования .mount) – надстройка systemd, используемая для манипуляций точками монтирования на уровне генерации unit-файлов

4. Automount unit (точка автомонтирования .automount) – похожа на mount unit, но позволяет монтировать ФС только тогда, когда вы действительно хотите обратиться к точке монтирования, например чтобы скопировать какой-нибудь файл

5. Device unit (устройство .device) – юнит для управления девайсами, как определено в sysfs/udev (udev – утилита для управления устройствами). При запуске ОС systemd динамично создает юниты устройств для всех кернел-девайсов, которые помечены udev-тегом “systemd” – к ним чаще всего относятся блочные и сетевые устройства, и некоторые другие. Посмотреть список юнитов можно как и остальные: systemctl list-units –type=device

6. Path unit (файловый путь .path) – используется для наблюдения за файлом или директорий на предмет наличия определенного события, и если это событие происходит, то выполняется запуск service-юнита с таким же именем (если не указан другой). Тут стоит привести более конкретный пример, чтобы было понятнее:

Например есть такой юнит:

[Unit] 
Description=Smotrim za izmeneniyami v faile
[Path] 
PathChanged=/home/some_path/some_file 
Unit=changes_applied.service 
[Install] 
WantedBy=multi-user.target

Он описывает следующее:

Вы наблюдаете за файлом /home/some_path/some_file, и если он меняется, то запускается сервис, определенный в Unit=changes_applied.service.

7. Scope unit (не создаются через конфигурационные файлы, только программно через bus-интерфейсы systemd, имеют расширение .scope) – если говорить просто и коротко – нужен для создания контрольных групп (cgroups) для дерева процессов.

8. Slice unit (слайс имеет расширение .slice) – это юнит, использующий концепт ограниченного потребления ресурсов группой процессов. Тесно связан с cgroups. Юниты, управляющие процессами (обычно это .service и .scope юниты), могут быть назначены конкретному слайсу. И этому слайсу могут быть назначены лимиты потребления ресурсов для всех процессов всех юнитов, собранном в этом слайсе.

9. Snapshot unit (снимок .snapshot) – не конфигурируется через файл. Сам файл.snapshot ссылается на конкретный снимок systemd-состояния. Снимок создается динамично через systemctl snapshot. Снимок работает как сохраненное состояния systemd менеджера.

10. Socket unit (гнездо, сокет с расширением .socket) – обычный сокет, только в виде systemd-юнита. Для каждого сокет-юнита должен быть создан service-юнит, работающий с данным сокетом. Самый обычный сокет выглядит так:

a. [Unit] Description = Socket for echoing 
b. [Socket] ListenStream = 1111 
c. Accept = yes 
d. [Install] WantedBy = sockets.target
e. Юнит будет слушать 1111 порт, вы также можете указать и полный IP-адреc.

11. Swap unit (файл подкачки или раздел подкачки .swap) – управляет swap-файлами/разделами.

12. Timer unit (таймер .timer) – юнит, позволяющий контролировать сервисы или события, можно назвать его аналогом крона. Имеет поддержку календарных и регулярных событий. Бывают таймеры реального времени (OnCalendar= …) и монотонные таймеры (OnTypeSec= …), где Type – тип события (загрузка OnBootSec, активация юнита OnUnitActiveSec и т.д.)

systemctl – основной инструмент управления systemd.

Синтаксис:
Запуск, останов и просмотр статуса какой-либо службы  происходит посредством команд:

Примечание: в debian 10 команда без d, просто cron

systemctl start crond
systemctl stop crond
systemctl status crond


Перезапуск командой

systemctl restart crond


Для добавления сервиса в автозагрузку используется

systemctl enable crond


Чтобы убрать приложение из автозапуска, соответственно

systemctl disable crond


Можно также “замаскировать” сервис – то есть, лишить модуль возможности запускаться.

systemctl mask crond


Посмотреть дерево зависимостей – от каких процессов зависит cron.

systemctl list-dependencies crond

Список всех имеющихся модулей в системе покажет команда systemctl list-units

Рассмотрим отдельно модуль файла планировщика cron

[Unit] – директива, указывающая systemd, что эта часть файла является описательной, указывает параметры запуска и т.д.

Description=Regular background program processing daemon – описание юнита

Documentation=man:cron(8) – указание пути к документации

After=remote-fs.target nss-user-lookup.target – параметр, указывающий, что данный юнит должен запускаться после (after) модуля, указанного справа от “=”.

[Service]  блок конфигурации юнита

EnvironmentFile=/etc/default/cron – файл окружения

ExecStart=/usr/sbin/cron -f $EXTRA_OPTS – команда для старта

IgnoreSIGPIPE=false – параметр для игнорирования SIGPIPE сигнала (SIGPIPE — сигнал, посылаемый процессу при записи в соединение (пайп, сокет) при отсутствии или обрыве соединения с другой (читающей) стороной.)

KillMode=process – указывает, как “убивать” процесс.

Restart=on-failure – указание, когда необходимо перезагружать сервис.

[Install] – блок, описывающий информацию об установке юнита (нужен для команд systemctl enable/disable)

WantedBy=multi-user.target – данная директива, является наиболее распространенным способом определения того, как юнит должен быть включен, от чего зависит.

Cинтаксис планировщика Крон:

минута, час, день месяца, месяц, день недели (0 = воскресенье)
запускаемая команда


https://crontab.guru/ – удобный интструмент для создания заданий

Типы разметки дисков

MBR (master boot record, основная загрузочная запись) – загрузочный сектор в начале диска. Этот сектор содержит загрузчики и данные о разделах диска. 

GPT (GUID Partition Table) – Современный и актуальный. Каждому разделу на вашем диске присваивается «уникальный глобальный идентификатор» (GUID). отличие от MBR в том, что нет ограничений на количество создаваемых разделов (до 128) и их размер.

systemd – актуальная и широко используемая система инициализации и управления службами в Linux.

PS – утилита,, отображающая запущенные на данный момент процессы. Эта утилита выводит “снимок” состояния процессов.

У утилиты ps много разных ключей для манипуляции выводом информации, но полезными для ежедневной работы вы найдете не так много. Рассмотрим примеры с выводами и объяснениями:

root# ps
PID TTY          TIME CMD
1883 pts/0    00:00:00 bash
1888 pts/0    00:00:00 ps

Команда ps без ключей выводит информацию о запущенных процессах конкретной оболочки, в которой вы находитесь.

root# ps -A

или

root# ps -e

Выводит список всех активных процессов на Linux-системе в generic (Unix/Linux) формате. Та же самая команда, но вывод в BSD формате: ps au или ps aux (в зависимости оттого, какой вывод вам нужен).

root# ps -x

Вывод всех процессов, владельцем которых является ваш пользователь (из под которого выполняется команда).

root# ps -fu root

или

root# ps -fU 0

Вывод процессов конкретного пользователя по его имени или ID.

root# ps -e --forest

Вывод процессов в виде дерева (какие процессы от кого наследуются).

root# ps -eo pid,user,cmd

Вывод процессов в кастомном формате вывода, где будут три колонки: ID процесса, пользователь и команда.

OOM killer ([oom_reaper])
Он призван решать проблему нехватки памяти и как вы можете заменить из названия, весьма радикальными методами – “убийством” (SIGKILL) процессов, которые больше все тратят ресурсы оперативной памяти, когда она закончилась.

OOM killer работает, используя “рейтинг плохишей” (в оригинале: badness score). Каждому процессу он назначает очки от 0 до 1000 в зависимости от потребления оперативной памяти, после чего “убивает” процесс с наибольшим количеством очков. При необходимости, процесс можно защитить от убийцы, выставив минимальный рейтинг, но это чревато паникой ядра и последующим зависанием сервера.

Как узнать информацию о машине и ОС Версия ядра и операционной системы

Проверить, какой версии ядро Linux вашего сервера, можно с помощью команды: 

uname -r

Эта же команда в подробном режиме покажет всю информацию: 

  • имя ядра;
  • имя сервера (hostname);
  • релиз ядра;
  • версию ядра;
  • тип процессора;
  • вид операционной системы.
uname -a

Альтернативный способ — посмотреть содержимое файла /proc/version:

cat /proc/version

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

cat /etc/os-release

Либо через файл /etc/issue — он содержит информацию о системе, которая отображается в сообщении после авторизации на сервере:

Оборудование

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

Краткую информацию об оборудовании можно посмотреть следующим образом:

lshw -short

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

Аналогичный инструмент есть и для просмотра данных процессора: 

lscpu

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

Посмотреть диск и его разделы так же просто:

lsblk -a

Команда отображает все блочные устройства, подключенные к серверу. По умолчанию в эту категорию попадает диск сервера и его разделы. Есть много других способов посмотреть, какой объём диска или разделы диска доступны на сервере, этот один из самых простых.

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

Например, следующая команда выведет информацию о процессоре:

cat /proc/cpuinfo

Для вывода информации о дисках можно использовать следующую утилиту: 

fdisk -l

Также можно использовать dmidecode — этот инструмент выводит информацию о железе, зашитую в BIOS, в человекочитаемом виде. Правда, при использовании на виртуальных серверах полезной информации будет крайне мало.

Например, так можно вывести информацию о системе:

dmidecode -t system

Проверить, какой версии ядро Linux вашего сервера, можно с помощью команды: 

uname -r

Эта же команда в подробном режиме покажет всю информацию: 

  • имя ядра;
  • имя сервера (hostname);
  • релиз ядра;
  • версию ядра;
  • тип процессора;
  • вид операционной системы.
uname -a

Альтернативный способ — посмотреть содержимое файла /proc/version:

cat /proc/version

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

cat /etc/os-release

Либо через файл /etc/issue — он содержит информацию о системе, которая отображается в сообщении после авторизации на сервере:

Оборудование

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

Краткую информацию об оборудовании можно посмотреть следующим образом:

lshw -short

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

Аналогичный инструмент есть и для просмотра данных процессора: 

lscpu

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

Посмотреть диск и его разделы так же просто:

lsblk -a

Команда отображает все блочные устройства, подключенные к серверу. По умолчанию в эту категорию попадает диск сервера и его разделы. Есть много других способов посмотреть, какой объём диска или разделы диска доступны на сервере, этот один из самых простых.

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

Например, следующая команда выведет информацию о процессоре:

cat /proc/cpuinfo

Для вывода информации о дисках можно использовать следующую утилиту: 

fdisk -l

Также можно использовать dmidecode — этот инструмент выводит информацию о железе, зашитую в BIOS, в человекочитаемом виде. Правда, при использовании на виртуальных серверах полезной информации будет крайне мало.

Например, так можно вывести информацию о системе:

dmidecode -t system

Изменение данных пользователей

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

pgrep -l -u user

Проверить, авторизован ли пользователь, можно с помощью уже известной команды:

pinky user

Отредактировать данные существующего пользователя можно с помощью команды usermod. По структуре она похожа на предыдущую команду:

usermod [что поменять] [для какого пользователя]

Набор параметров расширен дополнительными опциями:

-mсоздаёт новую директорию, указанную в качестве домашней (если её не существует), и переносит туда данные из старой
-d /home/users/new-test-userменяет домашнюю директорию пользователя на /home/users/new-test-user
-c “Имя2 Фамилия2”меняет комментарий к пользователю
-a -G users,wheelдобавляет пользователя в дополнительные группы
-s /bin/bashменяет командную оболочку пользователя
-u 100500изменяет UID пользователя
-e 2060-01-01меняет дату, до которой аккаунт будет активен
-f 7меняет количество дней до блокировки пользователя, когда его пароль станет недействителен
-l new-test-userменяет имя пользователя на new-test-user
-Lблокирует аккаунт пользователя. Для этого в файле /etc/shadow перед хэшем пароля пользователя ставится символ «!»
-Uснимает блокировку с аккаунта (удаляет символ «!» из пароля в /etc/shadow)

То есть если мы захотим отредактировать данные пользователя test-user, созданного в примере выше, это будет выглядеть так:

usermod -l new-test-user -m -d /home/new-test-user -c "Имя2 Фамилия2" -u 100500 -e 3000-01-01 -f -1 test-user

В примере мы меняем логин — имя пользователя на new-test-user, изменяем домашнюю папку на /home/new-test-user с копированием файлов, меняем комментарий, UID пользователя, срок жизни аккаунта и отменяем блокировку в случае устаревания пароля.

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

Удаление пользователей

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

Для удаления пользователей используется команда userdel. Её структура аналогична предыдущим:

userdel [что удаляем] [кого удаляем]

Основных параметра два: 

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

После удаления пользователей важно вручную проверить, что на сервере не осталось файлов или директорий, принадлежащих удалённому пользователю.

Группы пользователей

Информация о группах хранится в файле /etc/group. Работа с группами пользователей куда проще. 

Группы применяются для делегирования прав доступа на определённые файлы, папки, скрипты сразу нескольким пользователям. Живой пример: работа с FTP-сервером. Вы выбираете какую-то директорию для работы с файлами, создаёте группу пользователей и присваиваете ей выбранную папку. Теперь вам не нужно отдельно настраивать права каждому новому пользователю — достаточно добавить его в эту группу, и он автоматически получит доступ к FTP-каталогу.

Создание

Для создания групп используется команда groupadd:

groupadd new-group

Из параметров можно выделить следующие:

-fесли группа с указанным именем или GID уже существует, опция прерывает выполнение команды без соответствующей ошибки
-g 100500позволяет назначить свой GID для создаваемой группы
-rсоздаёт системную группу
-p p@ssw0rdУстанавливает для группы пароль p@ssw0rd. Пароль запрашивается системой при попытке входа в группу с помощью команды newgrp.Не рекомендуется к использованию из-за проблем с безопасностью. Настроенный таким образом пароль можно увидеть в истории команд.

Редактирование

Для редактирования групп используется команда groupmod. Список изменений задаётся с помощью параметров:

-g 100500меняет GID группы на 100500
-n another-nameменяет имя группы на another-name

Например, если нам нужно изменить имя группы test-group на имя named-group, команда будет выглядеть так:

groupmod -n named-group test-group

 

Удаление

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

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

groupdel test-group

Как и в случае удаления пользователей, нужно вручную проверить, что на сервере не осталось данных, принадлежащих удалённой группе.

Управление пользователями в группе

Базовым инструментом для управления группами является утилита gpasswd. Она имеет несколько параметров, но с одной особенностью — в отличие от предыдущих примеров, здесь большинство параметров (кроме -A и -M) не сочетаются. То есть в команде может быть только один параметр за раз.

Структура команды проста:

gpasswd [что сделать] [в какой группе]

Рассмотрим опции команды подробнее: 

-a new-userДобавляет пользователя new-user в группу
-d bad-userУдаляет пользователя bad-user из группы
-A user1,user2,…Доступна для использования привилегированным пользователям (с правами root). Назначает список пользователей-администраторов группы
-M user1,user2,…Доступна для использования привилегированным пользователям. Назначает список участников группы
-rОтключает пароль группы. После этого только члены группы смогут использовать команду newgrp для подключения к группе
-RОтключает внешний доступ к группе. После этого только члены группы смогут использовать команду newgrp для подключения к группе

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

gpasswd -a new-user test-group

Также для добавления пользователей в новую группу используется описанная выше команда usermod. Следующий пример добавляет пользователя test-user в группу new-group

usermod -a -G new-group test-user

Или, если нужно указать группу new-group в качестве основной группы пользователя test-user:

usermod -g new-group test-user

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

newgrp new-group

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

Изменение атрибутов файлов

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

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

lsattr example.txt

Первые 20 символов в строке предназначены для отображения атрибутов файла.

Список атрибутов может отличаться в зависимости от файловой системы.  

Изменить атрибуты файла позволяет команда chattr:

chattr [модификатор][изменяемые атрибуты] [целевой файл или папка]

То есть, если нам нужно защитить какой-то важный файл от посягательств, можно использовать такую команду:

chattr +i example.txt

Проверяем — посягательства не работают.

Если же нам нужно вернуть файл в нормальное состояние, нужно выполнить обратную операцию: 

chattr -i example.txt

Для просмотра более подробной информации о файловых атрибутах, их ограничениях и правилах применения используйте команду:

man chattr

Работа с пользователями и группами Создание пользователей

Процесс добавления пользователя состоит из двух шагов: создания пользователя и настройки пароля. 

На первом шаге используется команда useradd c набором опций для настройки нового пользователя и его именем (логином):

useradd [как создать] [как назвать]

Эта команда имеет ряд настроек по умолчанию, которые задаются с помощью файлов /etc/default/useradd и /etc/login.defs Увидеть основные можно с помощью команды:

useradd -D
GROUPGID группы, в которую пользователь будет добавлен после создания
HOMEбазовый каталог, в котором будет размещена директория пользователя
INACTIVEуказывает время до блокировки пользователя, когда его пароль станет недействителен. Значение «-1» отключает опцию
EXPIREдата, до которой действителен аккаунт. По умолчанию не установлена — то есть без ограничений
SHELLиспользуется для настройки доступа к командной оболочке
SKELсодержит путь к директории, в которой хранятся файлы по умолчанию. После создания пользователя они будут автоматически скопированы в его домашнюю папку
CREATE_MAIL_SPOOLопределяет, нужно ли создать папку для писем этого пользователя в /var/spool/mail/

Все эти настройки применяются, если использовать самый простой вариант команды создания пользователя без параметров:

useradd test-user

Но обычно нам требуется добавить пользователя со специфическими настройками — для этого используется расширенный вариант этой команды. Перечислим основные опции:

-mсоздаёт указанную домашнюю директорию, если она ещё не существует
-d /home/test-userустанавливает /home/test-user в качестве домашней директории
-c “Имя Фамилия”добавляет комментарий. Например, с именем пользователя
-g testуказывает группу, в которую попадёт пользователь после создания. Можно использовать с GID или именем группы. Указанная группа должна существовать. Используется в сочетании с ключом -N (отменяет автоматическое создание группы с именем пользователя)
-G users,wheelуказывает список дополнительных групп пользователя. Они перечисляются через запятую без пробелов
-s /bin/bashпозволяет настроить доступ к shell
-rсоздаёт системного пользователя. Используется, когда вам нужно настроить службу на работу из-под конкретного пользователя. По умолчанию данные таких пользователей не вносятся в /etc/shadow, для них не создаётся домашняя папка
-uпозволяет указать свой UID, который будет присвоен новому пользователю. В качестве UID указывается положительное целое число. UID должен быть уникален
-e 2021-01-01указывает дату, до которой аккаунт будет активен. Дата задаётся в формате YYYY-MM-DD
-f 3указывает количество дней до блокировки пользователя, когда его пароль станет недействителен

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

useradd -m -u 666 -d /home/users/test-user -c "Тестовый пользователь" -e 2060-01-01 -s /bin/bash test-user

В примере мы создаём тестового пользователя test-user с идентификатором 666, домашней папкой в /home/users/test-user, комментарием «Тестовый пользователь» и доступом к командной оболочке. Учётная запись будет действительна до конца света по Ньютону.

Более подробную информацию о доступных опциях для useradd можно увидеть с помощью команды man useradd.

Очень важно после создания пользователя настроить для него надёжный пароль. Для этого нужно ввести следующую команду:

passwd test-user

Система предложит ввести и подтвердить пароль. На этом процесс создания пользователя можно считать завершённым.

Текстовый редактор vi (vim)

Vim (сокр. от Vi Improved, произносится Вим) — текстовый редактор, созданный на основе более старого Vi. Ныне это один из мощнейших текстовых редакторов с полной свободой настройки и автоматизации.

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

 Режимы работы

Существует три основных режима работы: режим команд, режим редактирования и режим последней строки. Выход из режима редактирования осуществляется клавишей Escape (далее обозначена как (esc), переход в режим редактирования клавишами i или insert. Находясь в режиме команд, можно выполнять сложные операции редактирования текста с помощью клавиши “двоеточие”(:). При нажатии этой клавиши курсор устанавливается в последнюю строку экрана, поэтому данный режим называется режимом последней строки. Он считается особым типом режима команд.

Для того, чтобы открыть какой-то файл или создать новый надо выполнить команду:

# vi имя файла

Затем можно нажать клавишу i (или insert) и внести нужные изменения.

если вместо i нажать a, текст будет вставляться за символом на котором стоит курсор (обычно используется при редактировании файлов этот метод), если нажать o – будет вставлена новая строка.

Стирать текст следует выйдя из режима редактирования клавишей Escape и затем можно использовать клавишу x – она работает как клавиша del – стирает вперед, если нажимать shift+x, то будет стирать назад (по аналогии с backspace)

После редактирования нажмите (esc):wq чтобы выйти с сохранением текста

Включить/выключить нумерацию строк

set number / :set nonumber

Основные команды перемещения по тексту

  • Перейти к строке с номером
(esc):номер или (esc),номер,shift+g
  • Поиск по тексту
(esc)/слово_которое_ищем

(esc) shift+j в конце строки объединит строки вместе.

(esc) shift+g - переместит в конец текста
  • Перемещение на первый символ в режиме просмотра
1g

Работа с буфером

(esc) dd - удалит строку в буфер

(esc) 10dd - удалит 10 строк в буфер

(esc) yy - скопирует строку в буфер

(esc) 10yy - скопирует 10 строк в буфер

(esc) p - вставит содержимое буфера под курсором

(esc) P - вставит содержимое буфера над курсором

Замена текста

(esc):s/что_меняем/на_что_меняем/g

g – обозначает замену до конца строки

если надо менять по всему файлу, то тогда пишем

(esc):%s/что_меняем/на_что_меняем/g

т.е. просто появился символ % в начале команды

  • Комментировать блок текста от курсора до строки номер 10
:.,10s/^/#/
  • Комментировать блок текста от курсора до конца
:.,$/^/#/

Как выйти из редактора vi

  • Выход осуществляется последовательностью нажатий
(esc):q
  • Выход без сохранения
(esc):q!
  • Выход с сохранением текста
(esc):wq или (esc):exit
  • Выход с принудительным сохранением (например, если файл read-only)
(esc):wq!

Выполнение в фоновом режиме

Некоторые команды могут временно блокировать или усложнять работу в терминале. Например, когда запущенный процесс долго выполняется или выводит в консоль большие объёмы не особо полезного текста. Такие команды можно запускать в фоновом режиме. Тогда система будет выполнять их «на заднем плане», а вы продолжите работать и не будете ждать выполнения очередной операции.

Чтобы запустить команду в фоновом режиме, достаточно добавить в конце знак «&»:

sleep 3600 &

sleep — команда «И пусть весь мир подождёт». Включает паузу на заданный промежуток времени в секундах.

Если вам нужно переместить на задний план активный процесс, тогда нужно приостановить процесс его выполнения сочетанием Ctrl + Z и ввести в консоли команду bg:

sleep 3600

[приостановка процесса сочетанием Ctrl + Z]

bg

Вывести список команд, запущенных в фоновом режиме, можно с помощью команды 

jobs -l

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

nohup sleep 3600 &

Либо, если процесс уже запущен, отвязать его от сессии можно командой disown с идентификатором ID нужной задачи. 

disown -h %ID

После выхода из терминала задание будет удалено из списка jobs, но продолжит выполняться на фоне. Проверить его выполнение можно, отобразив список всех запущенных процессов командой ps aux:

Команды, запущенные в фоновом режиме, при наличии ошибок будут отправлять их в терминал — что не всегда удобно. Можно перенаправить вывод ошибок. В следующем примере ошибки вместо вывода в терминал будут записаны в файл error.log:

sleep 3600 2>>error.log &

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

fg %ID

Отмена процесса, запущенного в фоновом режиме, выполняется с помощью следующей команды:

kill PID

Где PID — ID процесса, указанный в выводе jobs -l. Если процесс завис и не реагирует, можно использовать более грубый вариант:

kill -KILL PID

Запуск исполняемых bash-скриптов

Чтобы запустить скрипт script.sh на сервере, нужно выполнить два шага: 

  1. Настроить права на запуск файла для пользователей:
    chmod +x ./script.sh
  2. Запустить скрипт. Если вы находитесь в той же директории, где лежит скрипт, достаточно вызвать его по имени:
    ./script.shВ некоторых случаях нужно использовать команду sh либо указать путь к исполняемому файлу командной оболочки:
    sh ./script.shлибо
    /bin/bash ./script.shЕсли вы находитесь в другой директории, для запуска нужно указать полный путь к скрипту. 

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

Весь список существующих алиасов системы можно вывести с помощью команды alias:

Создать свой постоянный алиас можно с помощью файла .bashrc, размещённого в домашнем каталоге вашего пользователя. Нужно открыть его для редактирования:

vi ~/.bashrc

В соответствующем разделе нужно добавить ваш алиас в следующем формате:

alias [короткая команда]='[исходная команда]'

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

alias myScript='sh /путь/к/скрипту/script.sh'

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

source ~/.bashrc

После этого вы сможете вызывать ваш скрипт с помощью короткой команды.

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

Запуск нескольких команд за раз

 

Командная строка имеет несколько инструментов, которые позволяют запускать сразу несколько операций, управлять порядком их выполнения и выводом.

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

echo -n "Hello, "; echo "World!"

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

echo -n "Hello, " && echo "World!"

Оператор || действует наоборот — запускает следующую операцию при условии, что первая не выполнилась или завершилась с ошибкой.

wrongCommand || echo "Что-то пошло не так!"

Также можно запускать команды параллельно. Для этого в конец команд добавляется символ &, каждая команда заключается в круглые скобки, которые между тем разделяются между собой точкой с запятой:

(echo "Кто сказал, что убить двух зайцев" &); (echo "одним махом нельзя?" &)

Горячие клавиши в shell Сочетания с клавишей Ctrl

Ctrl + a – переход в начало строки (cisco, csh, zsh)

Ctrl + b – переход на 1 символ назад (cisco, csh, zsh)

Ctrl + c – посылает программе SIGINT. Обычно, прерывает текущее задание (csh, zsh)

Ctrl + d – удаляет символ под курсором (аналог delete) (cisco, csh, zsh)

Ctrl + e – переход к концу строки (cisco, csh, zsh)

Ctrl + f – переход на 1 символ вперёд (cisco, csh, zsh)

Ctrl + k – удаляет всё, до конца строки (EOL, а не на экране!) (cisco, csh, zsh)

Ctrl + l – очищает экран. Аналог команды clear. (csh, zsh)

Ctrl + r – поиск по истории. Повторение поиска (листание результатов поиска). То есть инкрементальный поиск. (zsh)

Ctrl + j – прекращает поиск и позволяет отредактировать найденную команду. Если поиск не производился, то аналогично нажатию return. (в zsh выполняет команду)

Ctrl + t – меняет символ под курсором на предыдущий. Или, если хотите, тянет предыдущий символ к концу строки. (cisco, csh, zsh)

Ctrl + u – удаляет все символы слева от курсора до начала строки. (cisco, в csh, zsh удаляет всю строку)

Ctrl + w – удаляет символы слева от курсора до начала слова. (cisco, csh, zsh)

Ctrl + xx – переходит от текущей позиции курса в начало строки и обратно. На циске работает аналогично ctrl + u. (csh)

Ctrl + x @ – показывает возможные дополнения имени хоста (имена берутся из /etc/hosts)

Ctrl + z – suspend’ит текущую задачу (csh, zsh)

Ctrl + x; Ctrl + e – открывает $EDITOR для изменения введённой строки. После сохранения изменений, команда отправляется на исполнение. Если переменная не задана, то открывается системный текстовый редактор (для линукса это, зачастую, nano)

 Сочетания с клавишей Alt

Alt + < – переход к первой команде в истории команд (zsh)

Alt + > – переход к последней команде в истории

Alt +? – показывает список возможных дополнений команды(аналогично tab-tab) (в csh, zsh аналог which string)

Alt + * – вставляет все возможные дополнений команды в строку команд

Alt + / – пытается дополнить имя файла (аналогично табуляции)

Alt +. – вставляет последний аргумент предыдущей команды (аналог !$, только не надо делать :p, чтобы проверить )

Alt + b – сдвигает курсор влево на 1 слово (cisco, csh, zsh)

Alt + c – делает букву под курсором большой, а остальные, до конца слова, маленькими. (cisco, csh, zsh)

Alt + d – удаляет символы с текущей позиции курсора и до конца слова. (cisco, csh, zsh)

Alt + f – передвигает курсор на одно слово вперёд (cisco, csh, zsh)

Alt + l – делает все буквы с текущей позиции курсора и до конца слова маленькими (cisco, csh, zsh)

Alt + t – меняет местами слова под курсором и предыдущее (zsh)

Alt + u – переводит буквы с текущей позиции курсора и до конца слова в верхний регистр (cisco, csh, zsh)

Alt + back-space – удаляет символы с текущей позиции курсора до начала слова (cisco, csh, zsh)

 
Сочетания с двойным нажатием клавиши табуляции (Tab) (обозначено как «2Т»)

Если нажать при пустой строке — выведет список всех доступных команд

(string)2T – выведет список возможных дополнений

(dir)2T – покажет подпапки папки dir

*2T – покажет подпапки исключая скрытые (имена которых начинаются с точки)

~2T – выведет всех пользователей из /etc/passwd. Дополнив имя пользователя можно перейти в его домашний каталог. Например ~oxpa/ — домашний каталог пользователя oxpa

$2T – выводит список дополнений для системных переменных

@2T – дополняет имена хостов содержащимися в /etc/hosts

=2T – листинг текущей директории, аналогичный ls.