локальный (привязаны к процессору и возможны только в пределах компьютера);
— каналы
- pipe (они же конвейеры, так же неименованные каналы), о них я много рассказывал в прошлом посте, примером можно привести: команда1 | команда2. По сути, pipe использует stdin, stdout и stderr.
- Именованные каналы (FIFO: First In First Out). Данный вид канала создаётся с помощью mknod или mkfifo, и два различных процесса могут обратиться к нему по имени. Пример работы с fifo:
в первом терминале (создаем именованный канал в виде файла pipe и из канала направляем данные с помощью конвейера в архиватор):
# mkfifo pipe # ls -l total 0 prw-r--r-- 1 root root 0 Nov 9 19:41 pipe # gzip -9 -c < pipe > out
во втором терминале (отправляем в именованный канал данные):
# cat /path/to/file > pipe
в результате это приведет к сжатию передаваемых данных gzip-ом
— сигналы
сигнал — это асинхронное уведомление процесса о каком-либо событии. Когда сигнал послан процессу, операционная система прерывает выполнение процесса. Если процесс установил собственный обработчик сигнала, операционная система запускает этот обработчик, передав ему информацию о сигнале. Если процесс не установил обработчик, то выполняется обработчик по умолчанию.
Все сигналы начинаются на «SIG…» и имеют числовые соответствия, определяемые в заголовочном файле signal.h. Числовые значения сигналов могут меняться от системы к системе, хотя основная их часть имеет в разных системах одни и те же значения. Утилита kill позволяет задавать сигнал как числом, так и символьным обозначением.
Сигналы можно послать следующими способами:
— разделяемая память
Разделяемую память применяют для того, чтобы увеличить скорость прохождения данных между процессами. В обычной ситуации обмен информацией между процессами проходит через ядро. Техника разделяемой памяти позволяет осуществить обмен информацией не через ядро, а используя некоторую часть виртуального адресного пространства, куда помещаются и откуда считываются данные.
После создания разделяемого сегмента памяти любой из пользовательских процессов может подсоединить его к своему собственному виртуальному пространству и работать с ним, как с обычным сегментом памяти.
— очереди сообщений
В общих чертах обмен сообщениями выглядит примерно так: один процесс помещает сообщение в очередь посредством неких системных вызовов, а любой другой процесс может прочитать его оттуда, при условии, что и процесс-источник сообщения и процесс-приемник сообщения используют один и тот же ключ для получения доступа к очереди.
Техника fork-exec
Придумана Д. Ритчи.
Создание нового процесса выполняется двумя системными вызовами.
- После fork появляется новый дочерний процесс, который продолжает выполнять программу родителя.
- В результате exec процесс переключается на выполнение другой программы.
#include <unistd.h> #include <stdio.h> #include <stdlib.h> #include <sys/wait.h> int main() { pid_t pid = fork(); if (pid == -1) { fprintf(stderr, "Unable to fork\n"); } else if (pid > ) { printf("I am parent %d\n", getpid()); printf("Child is %d\n", pid); int status; // wait(&status); waitpid(pid, &status, ); printf("Wait OK\n"); } else { // we are the child printf("I am child %d of %d\n", getpid(), getppid()); if (execlp("ls", "ls", "-l", NULL) == -1) { fprintf(stderr, "Unable to exec\n"); } } }
Контроль размера POST
Метод запроса HTTP POST используется, когда клиенту (браузеру или пользователю) необходимо отправить данные на веб-сервер Apache как часть запроса, например, при загрузке файла или отправке заполненной формы. Злоумышленники могут попытаться отправить POST-запросы большого размера, чтобы съесть ресурсы вашей системы. Вы можете ограничить максимальный размер POST-запроса, который будет обрабатывать PHP. Отредактируйте /etc/php.d/security.ini и установите следующую директиву:
; Установите здесь реалистичное значение post_max_size = 1K
1K устанавливает максимальный размер данных публикации, разрешенный приложениями php. Этот параметр также влияет на загрузку файлов. Для загрузки больших файлов это значение должно быть больше, чем upload_max_filesize. Я также предлагаю вам ограничить доступные методы с помощью веб-сервера Apache. Отредактируйте httpd.conf и установите следующую директиву для DocumentRoot /var/www/html:
<directory /var/www/html> <limitExcept GET POST> Order allow,deny </limitExcept> ## Add rest of the config goes here... ## </directory>
Основные log файлы Ubuntu
Традиционно логи в Linux хранятся в директории /var/log. Вот описание стандартных лог файлов Ubuntu, которые там присутствуют. Кстати, если вы только планируете устанавливать ubuntu, то можете воспользоваться моей подробной статьей на этот счет — установка ubuntu server. Так же вам может быть интересен мой обзор и сравнение сервера убунту с другими linux системами — Ubuntu Server — обзор для начинающих, сравнение, отзывы.
- syslog или messages. Последнего чаще всего нет и вместо него только syslog. Это традиционные глобальные системные журналы операционной системы linux. Сюда пишутся события загрузки, ядра системы, системы инициализации systemd и т.д.
- auth.log — лог авторизации и аутентификации в системе.
- dmesg — в этом логе хранится информация о загрузке ядра и драйверов оборудования.
- alternatives.log — лог файл программы update-alternatives. Не знаю, за какие такие заслуги ей выделили отдельный лог файл, а cron, к примеру, нет.
- kern.log — лог сообщений ядра ubuntu, да и любой другой linux системы.
- maillog — сообщения почтовой системы. Обычно postfix или exim. Если на сервере ubuntu они не установлены, то и почтового лога не будет.
- dpkg.log — логирование работы пакетных менеджеров ubuntu. Обычно это apt или apt-get.
- lastlog и wtmp — информация о прошлых авторизациях пользователей.
Пользователь PHP и идентификатор группы
mod_fastcgi — это cgi-модуль для веб-сервера Apache. Он может подключаться к внешнему серверу FASTCGI. Вам необходимо убедиться, что php запускается как пользователь без полномочий root. Если PHP выполняется как root или UID ниже 100, он может обращаться к системным файлам и / или манипулировать ими. Вы должны выполнять PHP CGI от имени непривилегированного пользователя, используя suEXEC или mod_suPHP Apache . Функция suEXEC предоставляет пользователям Apache возможность запускать программы CGI под идентификаторами пользователя, отличными от идентификатора пользователя вызывающего веб-сервера. В этом примере мой php-cgi работает как пользователь phpcgi, а apache — как пользователь apache:
# ps aux | grep php-cgi
Примеры вывода результатов:
phpcgi 6012 0,0 0,4 225036 60140? С 22 ноября 0:12 /usr/bin/php-cgi phpcgi 6054 0,0 0,5 229928 62820? С 22 ноября, 0:11 /usr/bin/php-cgi phpcgi 6055 0,1 0,4 224944 53260? С 22 ноября 0:18 /usr/bin/php-cgi phpcgi 6085 0,0 0,4 224680 56948? С 22 ноября, 0:11 /usr/bin/php-cgi phpcgi 6103 0,0 0,4 224564 57956? С 22 ноября, 0:11 /usr/bin/php-cgi phpcgi 6815 0,4 0,5 228556 61220? S 00:52 0:19 /usr/bin/php-cgi phpcgi 6821 0,3 0,5 228008 61252? S 00:55 0:12 /usr/bin/php-cgi phpcgi 6823 0,3 0,4 225536 58536? S 00:57 0:13 /usr/bin/php-cgi
Вы можете использовать такой инструмент, как spawn-fcgi, для создания удаленных и локальных процессов FastCGI от имени пользователя phpcgi (сначала добавьте пользователя phpcgi в систему ):
# spawn-fcgi -a 127.0.0.1 -p 9000 -u phpcgi -g phpcgi -f /usr/bin/php-cgi
теперь вы можете настроить веб-сервер Apache , Lighttpd и Nginx для использования внешнего php FastCGI, работающего на порт 9000 с IP-адресом 127.0.0.1.
14. Monitorix – Мониторинг системы и сети
Monitorix – это бесплатная, не требовательная к ресурсам утилита, которая предназначена для контроля за системой и сетевыми ресурсами в серверах Linux/Unix настолько, насколько это возможно. Она имеет встроенный HTTP веб-сервер, которые регулярно собирает системную и сетевую информацию и отображает её в графиках. Программа следит за нагрузкой на систему и использованием ресурсов, распределением памяти, здоровьем диска, системными сервисами, сетевыми портами, почтовой статистикой (Sendmail, Postfix, Dovecot и пр.), MySQL статистикой и многим другим. Программа предназначена для контроля общей производительности системы и помогает в обнаружении сбоев, узких мест, аномальной активности и т.д.
46. csysdig – ncurses интерфейс для sysdig
csysdig экспортирует функциональность sysdig через интуитивный и мощный пользовательский интерфейс, основанный на ncurses.
csysdig создана похожей на инструменты вроде top и htop, но программа предлагает более богатую функциональность, включая:
- Поддержку живого анализа и файлов трассировки sysdig. Файлы трассировки могут быть с этой же машины или с другой машины.
- Видимость широкого диапазона метрик, включая центральной процессор, память, дисковый вводы/вывод, сетевой вводы/вывод.
- Возможность наблюдать активности ввода/вывода для процессов, файлов, сетевых подключений и прочего.
- Возможность углубляться в процессы, файлы, сетевые соединения и многое другое для более глубокого изучения их поведения.
- Полная поддержка настройки под пользователя.
- Поддержка языка фильтров sysdig.
- Поддержка LXC.
- csysdig может работать в любом терминале и имеет поддержку цветов и ввода мышью.
Что делать, если такой сервис, как nginx, не запущен?
Включите службу systemd:
Запустите службу nginx:
Мы можем остановить или перезапустить службу следующим образом:
Проверить, включена ли служба или нет, запустить:
Снова просмотреть статус:Чтобы увидеть полные выходные данные для проблемы службы -full или -l:
Мы может отлаживать и просматривать все сообщения журнала, относящиеся к службе, с помощью команды journalctl:
Aug 02 03:51:05 utls-wp-mg-www-cbz systemd: Stopped A high performance web server and a reverse proxy server. Aug 02 03:51:15 utls-wp-mg-www-cbz systemd: Starting A high performance web server and a reverse proxy server... Aug 02 03:51:15 utls-wp-mg-www-cbz systemd: nginx.service: Control process exited, code=exited, status=1/FAILURE Aug 02 03:51:15 utls-wp-mg-www-cbz systemd: nginx.service: Failed with result 'exit-code'. Aug 02 03:51:15 utls-wp-mg-www-cbz systemd: Failed to start A high performance web server and a reverse proxy server. Aug 02 03:51:48 utls-wp-mg-www-cbz systemd: Starting A high performance web server and a reverse proxy server... Aug 02 03:51:48 utls-wp-mg-www-cbz systemd: nginx.service: Control process exited, code=exited, status=1/FAILURE Aug 02 03:51:48 utls-wp-mg-www-cbz systemd: nginx.service: Failed with result 'exit-code'. Aug 02 03:51:48 utls-wp-mg-www-cbz systemd: Failed to start A high performance web server and a reverse proxy server. Aug 02 03:52:07 utls-wp-mg-www-cbz systemd: Starting A high performance web server and a reverse proxy server... Aug 02 03:52:07 utls-wp-mg-www-cbz systemd: nginx.service: Control process exited, code=exited, status=1/FAILURE Aug 02 03:52:07 utls-wp-mg-www-cbz systemd: nginx.service: Failed with result 'exit-code'. Aug 02 03:52:07 utls-wp-mg-www-cbz systemd: Failed to start A high performance web server and a reverse proxy server. Aug 02 03:53:05 utls-wp-mg-www-cbz systemd: Starting A high performance web server and a reverse proxy server... Aug 02 03:53:05 utls-wp-mg-www-cbz systemd: Started A high performance web server and a reverse proxy server. Aug 04 04:11:47 utls-wp-mg-www-cbz systemd: Stopping A high performance web server and a reverse proxy server... Aug 04 04:11:48 utls-wp-mg-www-cbz systemd: nginx.service: Succeeded. Aug 04 04:11:48 utls-wp-mg-www-cbz systemd: Stopped A high performance web server and a reverse proxy server. -- Reboot -- Aug 04 04:27:35 utls-wp-mg-www-cbz systemd: Starting A high performance web server and a reverse proxy server... Aug 04 04:27:35 utls-wp-mg-www-cbz systemd: Started A high performance web server and a reverse proxy server.
Динамичные страницы
Это одна из лучших возможностей PHP. Представьте, что вы создали десять страниц на html. Если вы захотите внести изменение в дизайн, то придется переделывать все десять файлов. А если страниц будет несколько десятков, сотен или даже тысяч, то нужно будет заняться и ими.
На PHP достаточно создать один файл, который будет отвечать за главную страницу, каталог товаров и все остальное.
Чтобы сделать это, используйте метод GET. Если пользователь перейдет по ссылке index.php, он окажется на главной. А если введет index.php?page=articles&id=5, то увидит статью с идентификатором пять.
Также можно подключать другие файлы с помощью функции include(). Допустим, у вас есть несколько страниц:
- index.php;
- contacts.php;
- cart.php;
- about.php и так далее.
И вам нужно, чтобы на этих страницах были какие-то общие элементы — например, одинаковые шапка и подвал сайта. Для этого вы можете создать файл с разметкой для этих элементов и подключать его в нужных местах.
Это экономит массу времени и места, потому что не нужно каждый раз прописывать этот код заново.
Также обратите внимание, что подключаемые файлы лучше хранить в отдельной папке. В файле .htaccess нужно запретить доступ к содержимому этого каталога напрямую
Это обезопасит ваш сайт от утечки данных.
34. smem – Создание отчётов по использованию памяти
smem сообщает об использовании физической памяти, принимая во внимание общие страницы памяти. Неподелённая память показывается как USS
Общая память делится поровну между процессами, разделяющими её. Неподелённая память (USS), плюс доля процесса в совместной памяти показывается как PSS. USS и PSS включают только физическое использование памяти. Они не включают память, выгруженную на диск в файл подкачки.
Память может показываться по процессам, по пользователям, mapping или по всей системе. Доступен как текстовый режим вывода, так и графический.
smem PID User Command Swap USS PSS RSS 709 mial /usr/bin/VBoxClient --displ 0 96 332 1308 708 mial /usr/bin/VBoxClient --draga 0 100 335 1336 711 mial /usr/bin/VBoxClient --seaml 0 100 337 1340 712 mial /usr/bin/VBoxClient --clipb 0 168 371 1372 717 mial /usr/bin/VBoxClient --displ 0 152 508 3416 604 mial /usr/bin/dbus-daemon --conf 0 472 599 3956 714 mial /usr/bin/VBoxClient --seaml 0 232 616 3644 710 mial /usr/bin/VBoxClient --draga 0 308 694 3676 648 mial /bin/bash /usr/bin/cinnamon 0 420 735 3172 634 mial /usr/lib/dconf/dconf-servic 0 672 763 4772 573 mial /usr/bin/dbus-daemon --sess 0 816 942 4300 560 mial /usr/lib/gdm/gdm-x-session 0 824 951 6020 716 mial /usr/bin/VBoxClient --clipb 0 684 1071 4412 606 mial /usr/lib/at-spi2-core/at-sp 0 952 1164 6892 597 mial /usr/lib/gvfs/gvfsd-fuse /r 0 1160 1274 5668 592 mial /usr/lib/gvfs/gvfsd 0 968 1313 6680 689 mial /usr/lib/gvfs/gvfsd-trash - 0 1284 1691 7736 554 mial /usr/lib/systemd/systemd -- 0 1064 1747 6524 1189 mial bash 0 1408 1897 4920 898 mial bash 0 1616 2107 5192 637 mial /usr/lib/gvfs/gvfs-udisks2- 0 1816 2280 9756 848 mial /usr/lib/gvfs/gvfsd-metadat 0 2244 2397 7328 652 mial /usr/lib/cinnamon-settings- 0 2188 3106 13372 624 mial /usr/bin/pulseaudio --daemo 0 3268 4896 11860 599 mial /usr/lib/at-spi2-core/at-sp 0 4952 5118 10196 672 mial /usr/lib/polkit-gnome/polki 0 4596 5668 21668 668 mial nm-applet 0 7380 9450 29708 1223 mial python2 /usr/bin/smem 0 9948 9991 11984 618 mial /usr/lib/cinnamon-settings- 0 9436 12656 37960 575 mial cinnamon-session --session 0 9696 14185 45444 667 mial nemo -n 0 12256 14775 37496 892 mial /usr/lib/gnome-terminal/gno 0 15196 18087 40904 669 mial /usr/bin/python3 /usr/bin/c 0 15284 18493 37776 845 mial cinnamon-screensaver 0 24564 29875 57856 562 mial /usr/lib/xorg-server/Xorg v 0 65008 69721 92372 650 mial cinnamon 0 352060 368556 421884
22. Netdata
Netdata – это чрезвычайно оптимизированная утилита Linux, которая в реальном времени (посекундно) обеспечивает мониторинг производительности систем Linux, приложений, SNMP устройств и т.д. и показывает полностью интерактивные графики, которые через веб-браузер показывают абсолютно все собранные значения для их анализа.
Программа была создана чтобы быть установленной на систему Linux без прерывания на ней текущих запущенных приложений. Вы можете использовать этот инструмент для контроля и обзора в реальном времени того, что происходит или только что произошло в ваших системах Linux и приложениях.
Что мониторит Netdata:
- Общее использование и использование каждого ядра ЦПУ, прерывания (interrupts), отложенные прерывания (softirqs) и частоту.
- Общую память, оперативную память, использование раздела подкачки (Swap) и Kernel
- Операции ввода/вывода на диск (по каждому диску: скорость, операции, backlog, utilization и пр.)
- Мониторинг сетевых интерфейсов, включая: скорость пропускания, пакеты, ошибки, отброшенное и пр.)
- Мониторы подключений, события, ошибки и пр. файервола Linux Netfilter / iptables
- Процессы (запущенные, заблокированные, форки, активные и пр.)
- Системные приложения с деревом процессов (ЦПУ, память, swap, чтение/запись на диск, потоки и т.д.)
- Мониторинг статуса Apache и Nginx с mod_status.
- Мониторинг баз данных MySQL: запросы, обновления, блокировки, проблемы, потоки и т.д.
- Очередь сообщений почтового сервера
- Мониторинг пропускной способности и запросов Squid прокси
- Сенсоры железа (температура, вольтаж, вентиляторы, напряжение, влажность и т.д.)
- SNMP устройства
Об установке и описание работы с Netdata смотрите «Как настроить мониторинг производительности реального времени с Netdata на Ubuntu 16.10».
Находим PID зависшего процесса
Каждый процесс в Linux имеет свой идентификатор, называемый PID. Перед тем, как выполнить остановку процесса, нужно определить его PID. Для этого воспользуемся командами ps и grep. Команда ps предназначена для вывода списка активных процессов в системе и информации о них. Команда grep запускается одновременно с ps (в канале) и будет выполнять поиск по результатам команды ps. Вывести список всех процессов можно, выполнив в командной строке:
Но, как правило, список очень большой и найти процесс, который мы хотим «убить», бывает не так просто. Здесь на помощь приходит команда grep. Например, чтобы найти информацию о процессе с именем gcalctool выполните команду:
Команда grep выполнит поиск по результатам команды ps и на экран будут выведены только те строки, которые содержат строку (слово) gcalctool. Здесь есть одна интересная деталь, например, если у вас не запущено приложение gcalctool, то после выполнения ps axu | grep gcalctool вы получите:
То есть мы получили сам процесс grep, так как в качестве параметра команде мы указали слово gcalctool, и grep нашел сам себя в выводе команды ps.
Если процесс gcalctool запущен, то мы получим:
Здесь нас интересует строка: «yuriy 25609 7.6 0.4 500840 17964 ? Sl 10:20 0:00 gcalctool». Число 25609 и есть идентификатор (PID) процесса gcalctool.
Есть еще один более простой способ узнать PID процесса — это команда pidof, которая принимает в качестве параметра название процесса и выводит его PID. Пример выполнения команды pidof:
Команда ps в Linux
Сначала рассмотрим общий синтаксис команды, здесь все очень просто:
$ ps опции
$ ps опции | grep параметр
Во втором варианте мы используем утилиту grep для того, чтобы отобрать нужные нам процессы по определенному критерию. Теперь рассмотрим опции утилиты. Они делятся на два типа — те, которые идут с дефисом Unix и те, которые используются без дефиса — BSD. Лучше пользоваться только опциями Unix, но мы рассмотрим и одни и другие. Заметьте, что при использовании опций BSD, вывод утилиты будет организован в BSD стиле.
- -A, -e, (a) — выбрать все процессы;
- -a — выбрать все процессы, кроме фоновых;
- -d, (g) — выбрать все процессы, даже фоновые, кроме процессов сессий;
- -N — выбрать все процессы кроме указанных;
- -С — выбирать процессы по имени команды;
- -G — выбрать процессы по ID группы;
- -p, (p) — выбрать процессы PID;
- —ppid — выбрать процессы по PID родительского процесса;
- -s — выбрать процессы по ID сессии;
- -t, (t) — выбрать процессы по tty;
- -u, (U) — выбрать процессы пользователя.
Опции форматирования:
- -с — отображать информацию планировщика;
- -f — вывести максимум доступных данных, например, количество потоков;
- -F — аналогично -f, только выводит ещё больше данных;
- -l — длинный формат вывода;
- -j, (j) — вывести процессы в стиле Jobs, минимум информации;
- -M, (Z) — добавить информацию о безопасности;
- -o, (o) — позволяет определить свой формат вывода;
- —sort, (k) — выполнять сортировку по указанной колонке;
- -L, (H)- отображать потоки процессов в колонках LWP и NLWP;
- -m, (m) — вывести потоки после процесса;
- -V, (V) — вывести информацию о версии;
- -H — отображать дерево процессов;
Теперь, когда вы знаете синтаксис и опции, можно перейти ближе к практике. Чтобы просто посмотреть процессы в текущей оболочке используется такая команда терминала ps:
Все процессы, кроме лидеров групп, в том же режиме отображения:
Все процессы, включая фоновые и лидеры групп:
Чтобы вывести больше информации о процессах используйте опцию -f:
При использовании опции -f команда выдает такие колонки:
- UID — пользователь, от имени которого запущен процесс;
- PID — идентификатор процесса;
- PPID — идентификатор родительского процесса;
- C — процент времени CPU, используемого процессом;
- STIME — время запуска процесса;
- TTY — терминал, из которого запущен процесс;
- TIME — общее время процессора, затраченное на выполнение процессора;
- CMD — команда запуска процессора;
- LWP — показывает потоки процессора;
- PRI — приоритет процесса.
Например, также можно вывести подробную информацию обо всех процессах:
Больше информации можно получить, использовав опцию -F:
Эта опция добавляет такие колонки:
- SZ — это размер процесса в памяти;
- RSS — реальный размер процесса в памяти;
- PSR — ядро процессора, на котором выполняется процесс.
Если вы хотите получить еще больше информации, используйте вместо -f опцию -l:
Эта опция добавляет отображение таких колонок:
- F — флаги, ассоциированные с этим процессом;
- S — состояние процесса;
- PRI — приоритет процесса в планировщике ядра Linux;
- NI — рекомендованный приоритет процесса, можно менять;
- ADDR — адрес процесса в памяти;
- WCHAN — название функции ядра, из-за которой процесс находится в режиме ожидания.
Дальше мы можем отобрать все процессы, запущенные от имени определенного пользователя:
С помощью опции -H можно отобразить дерево процессов:
Если вас интересует информация только об определенном процессе, то вы можете использовать опцию -p и указать PID процесса:
Через запятую можно указать несколько PID:
Опция -С позволяет фильтровать процессы по имени, например, выберем только процессы chrome:
Дальше можно использовать опцию -L чтобы отобразить информацию о процессах:
Очень интересно то, с помощью опции -o можно настроить форматирование вывода, например, вы можете вывести только pid процесса и команду:
Вы можете выбрать такие колонки для отображения: pcpu, pmem, args, comm, cputime, pid, gid, lwp, rss, start, user, vsize, priority. Для удобства просмотра можно отсортировать вывод программы по нужной колонке, например, просмотр процессов, которые используют больше всего памяти:
Или по проценту загрузки cpu:
Ещё одна опция — -M, которая позволяет вывести информацию про права безопасности и флаги SELinux для процессов:
Общее количество запущенных процессов Linux можно узнать командой:
Мы рассмотрели все основные возможности утилиты ps. Дальше вы можете поэкспериментировать с её параметрами и опциями чтобы найти нужные комбинации, также можно попытаться применить опции BSD.
Использование тоннелей
Можно работать не только с файлами, но и перенаправлять вывод одной команды в качестве ввода другой. Это очень полезно для выполнения сложных операций. Например, выведем пять недавно измененных файлов:
С помощью утилиты xargs вы можете комбинировать команды таким образом, чтобы стандартный ввод передавался в параметры. Например, скопируем один файл в несколько папок:
Здесь параметр -n 1 задает, что для одной команды нужно подставлять только один параметр, а опция -v в cp позволяет выводить подробную информацию о перемещениях. Еще одна, полезная в таких случаях команда — это tee. Она читает данные из стандартного ввода и записывает в стандартный вывод или файлы. Например:
В сочетании с другими командами все это может использоваться для создания сложных инструкций из нескольких команд.
Как настроить PAM в Linux
Все конфигурационные файлы PAM для различных приложений находятся в папке /etc/pam.d. Давайте посмотрим на конфигурационный файл для утилиты sudo:
Каждая строчка файла состоит из нескольких полей:
тип обязательность модуль параметры
Разберем подробнее:
- Первое поле — тип, определяет какой тип запроса к PAM надо выполнить. Существует четыре различных типа запроса auth (проверка данных входа, например, логина и пароля), account (проверка не истёк ли пароль пользователя), password (обновление пароля), и session (обслуживание сессии, например, логгирование и монтирование папок).
- Второе поле определяет как нужно интерпретировать результат, возвращённый модулем PAM. Доступно тоже несколько возможных вариантов: required (тест должен быть обязательно пройден, но следующие строки тоже будут проверяться), requisite (аналогично required, только если тест не проходит, то следующие строки уже не проверяются), sufficient (противоположно requisite, если тест проходит, то следующие строки уже не проверяются), optional (проваленные тесты игнорируются).
- Третье и четвертое поле — это название библиотеки модуля и её параметры. Всё это надо выполнить для выполнения теста авторизации или действия.
Кроме того, существуют директивы include, которые включают строки из других файлов так, как будто они были написаны в этом файле. Файл настройки sudo кажется совсем коротким, но в него включаются другие файлы. Давайте посмотрим ещё на файл /etc/pam.d/common-auth:
Здесь можно видеть более расширенный синтаксис параметра обязательности. Он позволяет лучше понять как всё это работает. Давайте его рассмотрим:
Модули PAM могут возвращать около 30-ти значений и они зависят от выбранного типа (account/auth/session…), вот они все: success, open_err, symbol_err, service_err, system_err, buf_err, perm_denied, auth_err, cred_insufficient, authinfo_unavail, user_unknown, maxtries, new_authtok_reqd, acct_expired, session_err, cred_unavail, cred_expired, cred_err, no_module_data, conv_err, authtok_err, authtok_recover_err, authtok_lock_busy, authtok_disable_aging, try_again, ignore, abort, authtok_expired, module_unknown, bad_item, conv_again, incomplete и default. Последнее, default, означает все поля, которые явно не заданы.
В качестве действия могут быть указанны такие значения:
- ignore — не влияет на общий код возврата в приложение;
- bad — расценивать это значение как свидетельство сбоя модуля;
- die — аналогично bad, только сразу возвращать управление в приложение;
- ok — значение должно влиять на общий возвращаемый результат, переопределяет общий результат если он раньше был успешен, но не отменяет сбой;
- done — аналогично ok, только управление сразу возвращается приложению.
Таким образом, те четыре варианта обязательности, которые мы рассматривали выше можно описать вот так:
- required:
- requisite:
- sufficient:
- optional:
Здесь:
- success — модуль вернул состояние успешно, поскольку значение ok, это состояние будет учтено если ни один предыдущий модуль не дал сбоя;
- new_authtok_reqd — модуль сообщает, что пароль пользователя желательно обновить;
- ignore — модуль просит игнорировать его результат, игнорируем;
- default — все остальные возвращаемые значение расцениваем как сбой.
Обратите внимание. что модуль возвращает только одно определенное значение и уже к нему применяется действие
Чтобы закрепить всё это на практике давайте рассмотрим как запретить авторизацию от имени пользователя losst на компьютере с помощью PAM. Для этого можно воспользоваться модулем /lib/security/pam_listfile.so. Он позволяет ограничить доступ для пользователей на основе файла со списком. Откройте файл /etc/pam.d/sshd и добавьте туда такую строчку:
Здесь мы используем тип запроса auth, обязательность required и указанный выше модуль. Вот его опции и их значения:
- onerr=succeed — если возникает ошибка, доступ разрешить;
- item=user — указывает, что в файле конфигурации находятся логины пользователей;
- sense=deny — действие, если логин пользователя найден в файле;
- file=/etc/denyusers — файл с логинами пользователей, для которых надо запретить доступ.
Теперь в файл /etc/denyusers добавьте имя пользователя losst, естественно, такой пользователь должен существовать в системе. Затем попробуйте перейти в любую консоль и авторизоваться от его имени. У вас ничего не выйдет, а в логе /var/log/security или /var/log/auth.log будет сообщение об ошибке:
А если эту строчку закомментировать, то всё снова заработает.
Лог загрузки
Начнем с самого начала. В момент загрузки системы записывается вся основная информация, имеющая к ней отношение. Если у вас будут какие-то ошибки во время старта сервера, вы сможете их увидеть в этом логе. Посмотреть лог загрузки Ubuntu можно следующим образом.
sudo dmesg
У вас получится очень длинный вывод всего того, что происходило с системой на старте. Если ищите что-то конкретное, то можете сделать фильтрацию вывода с помощью grep. Допустим, вам надо узнать информацию только о диске.
sudo dmesg | grep sda
Вы увидите лог загрузки системы ubuntu, содержащий информацию только о диске sda. Аналогичным образом можно фильтровать вывод по другим темам. Например, посмотреть все ошибки, которые были во время загрузки.
sudo dmesg | grep error
И так далее. Информация, которую выводит команда dmesg, хранится в log файле /var/log/dmesg.
Редактирование прав
Все, что нужно для разрешения проблем, связанных с правами в Linux.
sudo — выдает права суперпользователя. Используется перед любой командой, если нужно выполнить ее от имени администратора. Многие программы и операции запускаются исключительно при наличии этих прав, так что sudo используется часто. Например, чтобы обновить список пакетов в Fedora, введем: sudo dnf update. При этом система запросит пароль администратора.
sudo su — на время превращает все вводимые в терминал команды в команды суперпользователя. Пригодится, если предстоит вносить много изменений в системные файлы, которые нельзя редактировать без соответствующих прав.
sudo !! — запускает предыдущую команду от имени администратора. Пригодится, если уже ввели команду, требующую прав суперпользователя, но забыли их затребовать. Не придется вводить весь текст заново. Достаточно сокращенной версии.
chmod — корректирует права доступа к выбранному файлу. Применяется исключительно с набором опций, обозначающих список прав. Допустим, я хочу выдать права на чтение и запись файла Timeweb.html на рабочем столе. Для этого введу в терминал: chmod 777 ~/Desktop/timeweb.html. Теперь его можно открывать и редактировать. Аналогичным образом пользователи поступают с системными файлами, когда приходит время что-то в них менять. По умолчанию большая их часть защищена от записи.
chown — назначает владельца для выбранной директории, документа, картинки или любого другого элемента в файловой системе. Синтаксис следующий: chown имя учетной записи, которому надо передать права путь до файла, права на который нужно передать. На примере этого может выглядеть следующим образом: есть пользователь Timeweb, которому я хочу передать права на файл timeweb-file.txt с рабочего стола. Сделаю это командой:
chown Timeweb ~/Desktop/timeweb-file.txt