BashTex | Linux
2.55K subscribers
47 photos
9 videos
291 links
Авторский канал для тех, кто хочет глубже погрузиться в мир Linux.

Подойдет для разработчиков, системных администраторов и DevOps

Реклама: @dad_admin
Download Telegram
chattr и lsattr для защиты файлов от изменений

Иногда chmod и chown недостаточно для защиты важных файлов. В linux есть инструмент chattr, который позволяет устанавливать атрибуты, защищающие файлы от удаления, изменений или перезаписи, даже root'ом

🛠 lsattr - просмотр атрибутов файлов. Прежде чем что-то менять, посмотрим на атрибуты файла:


lsattr myfile.txt

----i--------- myfile.txt


i (immutable) - файл нельзя удалить, изменить или переименовать.

📍 Просмотр всех атрибутов в папке:


lsattr /etc


🛠 chattr - защита файлов

1️⃣ Запрет любых изменений (даже root'ом)


chattr +i important.conf


Теперь даже root не сможет удалить или изменить файл:


rm important.conf
rm: cannot remove 'important.conf': Operation not permitted


Чтобы снять защиту:


chattr -i important.conf


2️⃣ Защита от случайного удаления (флаг a). Файл можно дописывать, но нельзя удалить или изменить существующее содержимое:


chattr +a log.txt


Теперь команды вроде rm log.txt не сработают, но echo "data" >> log.txt работает.
Снять защиту можно так:


chattr -a log.txt


3️⃣ Защита каталогов (запрет удаления файлов внутри)


chattr +i /important_dir


Это запретит любые изменения в папке (нельзя добавлять/удалять файлы).

4️⃣ Автоматическая очистка файла при перезаписи (s)


chattr +s secret.txt


Файл будет перезаписан нулями перед удалением, что затруднит восстановление.

5️⃣ Файл не записывается в журналы (j)


chattr +j critical.log


Полезно для файлов, которые не должны попадать в журналируемую файловую систему (ext3/ext4).

BashTex 📱 #linux #utils
Please open Telegram to view this post
VIEW IN TELEGRAM
👍19
Краткие и понятные мануалы вместо man

Если вам надоели километровые страницы man, где сложно найти примеры, то tldr - хорошая альтернатива! Это сборник кратких и понятных примеров для популярных команд.

🛠 Установка tldr


brew install tldr #MacOS
sudo pacman -S tldr #Arch Linux
sudo apt install tldr #Ubuntu/Debian


🔎 Как пользоваться? Просто вводите команду:


tldr tar


Вы получите краткую и понятную инструкцию:


tar -xvf archive.tar # Распаковать архив
tar -cvf archive.tar dir/ # Создать архив из папки
tar -tvf archive.tar # Просмотреть содержимое


Гораздо удобнее, чем листать man tar и быстрее, чем лезть в гугл.

💡 Если хотите использовать tldr в оффлайн-режиме, выполните:


tldr --update


BashTex 📱 #linux #utils
Please open Telegram to view this post
VIEW IN TELEGRAM
👍21🔥1
Выполнение команд с ограничением по времени

Иногда нужно запустить команду, но ограничить её время выполнения. Например, если программа зависла или работает слишком долго. Для этого используется команда timeout.

▪️ Простой пример. Запустим команду sleep на 5 секунд, но прервём её через 2 секунды:


timeout 2s sleep 5


Через 2 секунды процесс будет завершён.

▪️ Прерывание долгих команд. Если вы хотите ограничить время выполнения скрипта:


timeout 10s ./долгий_скрипт.sh


Если скрипт не завершится за 10 секунд, timeout его принудительно остановит.

▪️ Игнорирование SIGTERM. Некоторые команды игнорируют сигнал SIGTERM. В таком случае можно использовать -k для отправки SIGKILL:


timeout -k 5s 30s ./непослушный_процесс


Сначала timeout подождёт 30 секунд, затем отправит SIGTERM.
Если процесс не завершится через 5 секунд, отправится SIGKILL.

▪️ Использование с ping. Ограничим ping 5 секундами:


timeout 5s ping 8.8.8.8


Через 5 секунд ping остановится автоматически.

▪️ Вывод кода завершения

Если команда успела завершиться - timeout передаст её код возврата.
Если команда была принудительно остановлена - код возврата будет 124.

Проверим:


timeout 2s sleep 5
echo $? # Выведет 124


BashTex 📱 #linux #utils
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10🔥2
Настройка удалённого аудита логов с rsyslog

rsyslog позволяет пересылать логи с серверов на удалённый лог-агрегатор, обеспечивая удобный аудит и хранение.

1️⃣ Настройка сервера (приём логов). На сервере, который будет принимать логи, включаем поддержку удалённых сообщений:

Редактируем конфиг /etc/rsyslog.conf. Добавляем:


# Разрешаем приём логов по TCP и UDP
$ModLoad imudp
$UDPServerRun 514

$ModLoad imtcp
$InputTCPServerRun 514


UDP - быстрее, но ненадёжно.
TCP - более надёжно, но может вызывать задержки.

Перезапускаем rsyslog:


systemctl restart rsyslog


И не забываем открыть порт в firewalld или iptables:


firewall-cmd --permanent --add-port=514/udp
firewall-cmd --permanent --add-port=514/tcp
firewall-cmd --reload


2️⃣ Настройка клиента (отправка логов). На сервере-отправителе редактируем /etc/rsyslog.conf и добавляем в конец:


*.* @192.168.1.100:514 # Отправка по UDP
# *.* @@192.168.1.100:514 # Для TCP — две @


Где 192.168.1.100 - IP сервера сбора логов.

Перезапускаем rsyslog:


systemctl restart rsyslog


Проверяем отправку тестового сообщения:


logger "Тестовая запись в удалённые логи"


3️⃣ Фильтрация и хранение логов. Можно настроить rsyslog на приём и сортировку логов по папкам:


$template RemoteLogs,"/var/log/remote/%HOSTNAME%/%PROGRAMNAME%.log"
*.* ?RemoteLogs
& stop


Теперь логи будут храниться по серверам и сервисам в /var/log/remote/.

4️⃣ Шифрование логов (TLS). Открытые логи могут содержать чувствительные данные. Для безопасной передачи можно включить TLS.

Добавляем в /etc/rsyslog.conf на сервере:


$DefaultNetstreamDriverCAFile /etc/rsyslog.d/ca.pem
$DefaultNetstreamDriverCertFile /etc/rsyslog.d/server-cert.pem
$DefaultNetstreamDriverKeyFile /etc/rsyslog.d/server-key.pem

$ModLoad imtcp
$InputTCPServerStreamDriverMode 1
$InputTCPServerStreamDriverAuthMode anon
$InputTCPServerRun 6514


И на клиенте:


$DefaultNetstreamDriverCAFile /etc/rsyslog.d/ca.pem
$DefaultNetstreamDriverCertFile /etc/rsyslog.d/client-cert.pem
$DefaultNetstreamDriverKeyFile /etc/rsyslog.d/client-key.pem

*.* @@(overtls)192.168.1.100:6514



rsyslog позволяет собирать логи с разных серверов в одном месте.
Можно использовать фильтрацию и сортировку логов по сервисам.
Для безопасности передача логов может быть зашифрована через TLS.

BashTex 📱 #linux #utils
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8
Настройка Failover-интерфейсов для отказоустойчивости сети

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

Разберём, как настроить failover-интерфейсы в Linux с помощью bonding и keepalived.

▪️ Метод 1: Используем bonding. Он позволяет объединять два интерфейса в один логический и автоматически переключаться на рабочий при отказе основного.

1️⃣ Установите модуль bonding:


sudo modprobe bonding


2️⃣ Настроим интерфейсы (пример для Ubuntu/Debian в /etc/netplan/01-netcfg.yaml):


network:
version: 2
renderer: networkd
ethernets:
eth0:
dhcp4: no
eth1:
dhcp4: no
bonds:
bond0:
interfaces: [eth0, eth1]
parameters:
mode: active-backup
primary: eth0


Режим active-backup: Используется eth0, если он работает. Если eth0 выходит из строя, подключается eth1.

3️⃣ Применяем настройки:


sudo netplan apply


Проверяем статус:


cat /proc/net/bonding/bond0


▪️ Метод 2: Используем keepalived для виртуального IP. Этот метод позволяет создать виртуальный IP (VIP), который будет переключаться между интерфейсами при отказе.

1️⃣ Установите keepalived:


sudo apt install keepalived -y


2️⃣ Настроим keepalived (файл /etc/keepalived/keepalived.conf):


vrrp_instance FAILOVER {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass secret
}
virtual_ipaddress {
192.168.1.100/24
}
}


3️⃣ Запускаем сервис:


sudo systemctl enable --now keepalived


Проверяем виртуальный IP:


ip a show eth0


▪️ Итоги:

bonding: объединяет интерфейсы в один и автоматически переключается между ними.
keepalived: создаёт виртуальный IP, который "переезжает" на другой интерфейс при отказе основного.

BashTex 📱 #linux #networks
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8
Редактирование и повторный запуск команд из истории

Часто ли бывает, что нужно повторить или поправить команду из истории? Да. Вместо того чтобы пролистывать её через history, можно использовать fc. Команда fc (fix command) позволяет открыть последнюю команду в редакторе, изменить её и выполнить повторно.

▪️ Открыть последнюю команду в редакторе (по умолчанию nano или vim):


fc


После редактирования и сохранения команда будет выполнена

▪️ Выбрать команду по номеру (history показывает номера):


fc 123


▪️ Повторить предыдущую команду без изменений:


fc -s


▪️ Заменить аргумент в последней команде и выполнить её снова:


fc -s old=new


Пример:


$ grep "error" log.txt
$ fc -s error=warning # Выполнится grep "warning" log.txt


▪️ Расширенные возможности

1️⃣ Просмотр истории команд с номерами


fc -l


2️⃣ Фильтрация по последним N командам


fc -l -10 # Вывести последние 10 команд


3️⃣ Редактирование определённого диапазона команд


fc 100 105 # Открыть команды 100-105 в редакторе


4️⃣ Выбрать редактор вручную


FCEDIT=nano fc


▪️ Почему fc удобнее history?

Мгновенное редактирование и выполнение
Гибкость в выборе команд
Быстрое исправление ошибок без ручного ввода


BashTex 📱 #linux #utils
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
Изменение приоритета процессов без их перезапуска

Когда система начинает тормозить из-за прожорливого процесса, многие просто убивают его (kill -9). Но что, если процесс важен и его нельзя останавливать? Решение - renice. Команда позволяет изменять приоритет процесса на лету, не перезапуская его.

Приоритет процессов в Linux измеряется в niceness - от -20 (наивысший приоритет) до 19 (наименьший).
Чем выше значение nice, тем меньше процессу достаётся CPU.

▪️ Как изменить приоритет процесса?
📍 Снизить приоритет процесса (уменьшить нагрузку на систему):


sudo renice +10 -p 1234 # Процессу 1234 отдадут меньше CPU


📍 Повысить приоритет процесса (ускорить выполнение):


sudo renice -5 -p 1234 # Процесс 1234 будет выполняться быстрее


📍 Изменить приоритет всех процессов пользователя:


sudo renice +5 -u username


📍 Изменить приоритет группы процессов (по GID):


sudo renice -10 -g 1001


▪️ Как узнать текущий приоритет?

Через ps:


ps -o pid,ni,cmd -p 1234


Через top:

Запустите top, в колонке NI (Nice) будет указан приоритет.

▪️ Когда использовать renice?

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


BashTex 📱 #linux #utils
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
Оптимизация времени загрузки системы с systemd-analyze

Когда Linux загружается слишком долго, то сначала необходимо определить, какие службы тормозят процесс. Для этого в systemd есть инструмент - systemd-analyze, который помогает выявить узкие места при старте системы.

1️⃣ Анализ общего времени загрузки


systemd-analyze


Вывод покажет время, затраченное на:

прошивку (firmware)
загрузчик (bootloader)
ядро (kernel)
службы systemd (userspace)

Пример вывода:


Startup finished in 3.2s (kernel) + 5.1s (userspace) = 8.3s


2️⃣ Поиск медленных сервисов


systemd-analyze blame


Этот список покажет службы, которые загружаются дольше всего:


10.543s networkd-wait-online.service
3.213s apt-daily.service
1.145s snapd.service


Самый медленный - networkd-wait-online.service. Его можно отключить, если он не нужен:


sudo systemctl disable --now networkd-wait-online.service


3️⃣ Граф зависимостей сервисов. Чтобы увидеть все зависимости и их время загрузки, используйте:


systemd-analyze critical-chain


Этот граф покажет какие службы блокируют запуск других.

📌 Если какая-то служба загружается слишком долго, её можно отключить или перевести в "ленивый" запуск:


sudo systemctl disable имя_сервиса
sudo systemctl mask имя_сервиса


4️⃣ Визуализация загрузки в SVG. Чтобы построить график загрузки системы, выполните:


systemd-analyze plot > boot.svg


Откройте boot.svg в браузере - увидите наглядную диаграмму загрузки сервисов.

5️⃣ Ускорение загрузки с systemctl

Отключите ненужные службы


sudo systemctl disable --now service_name


Включите параллельную загрузку. В файле /etc/default/grub замените строку:


GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"


на


GRUB_CMDLINE_LINUX_DEFAULT="quiet splash systemd.legacy_boot=false"


Затем примените изменения:


sudo update-grub


BashTex 📱 #linux
Please open Telegram to view this post
VIEW IN TELEGRAM
👍17🔥4
Запись и воспроизведение сессий терминала

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

В отличие от обычного видео, записи asciinema:

занимают всего несколько килобайт
позволяют копировать команды прямо из записи
легко встраиваются в сайты и документацию


▪️ Установка


brew install asciinema -- MacOS
sudo apt install asciinema -- Ubuntu/Debian
sudo pacman -S asciinema -- Arch Linux


📍 Запись терминальной сессии. Просто запустите:


asciinema rec


Теперь всё, что вы вводите в терминале, записывается.

📌 Чтобы остановить запись: Ctrl + D или exit.
📌 После остановки asciinema предложит сохранить локально или загрузить в облако.

📂 Сохранение записи в файл:


asciinema rec demo.cast


▪️ Воспроизведение записи. Если запись сохранена в файл, проиграйте её так:


asciinema play demo.cast


▪️ Публикация и расшаривание. Если нужно поделиться записью:


asciinema upload demo.cast


▪️ Запись с паузами между командами:


asciinema rec -t 2


(это замедлит вывод, чтобы было комфортнее читать)

▪️ Конвертация записи в GIF-анимацию. Для этого можно использовать утилиту agg:


agg demo.cast demo.gif


BashTex 📱 #linux #utils
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥4
Продвинутый cat с подсветкой кода

Если вы часто используете cat для просмотра файлов, попробуйте bat - улучшенную версию с подсветкой синтаксиса, номерами строк и встроенной пагинацией.

🌟 Почему bat лучше cat?

Подсветка кода для более чем 500 языков
Номера строк прямо в выводе
Интеграция с git (показывает изменённые строки)
Встроенный пейджинг (автоматически передаёт вывод в less)


⚙️ Установка


sudo pacman -S bat -- Arch Linux
brew install bat -- MacOS
sudo apt install bat -- Ubuntu/Debian


Windows:


scoop install bat
choco install bat


▪️ Как использовать?
📍Простая замена cat:


bat script.sh


📍 Нумерация строк:


bat -n myfile.txt


📍 Отображение различий с последним коммитом (если файл в git-репозитории):


bat --diff myfile.py


📍Использование как cat:


bat --paging=never file.txt


📍Вывод с определённой темой оформления:


bat --theme=Dracula config.yaml


(Темы можно посмотреть через bat --list-themes)

📍Интеграция с less и man. Сделать bat основным просмотрщиком для man:


export MANPAGER="sh -c 'col -bx | bat -l man -p'"


Использовать bat с less:


export BAT_PAGER="less -RF"


bat - это альтернатива cat, которая делает работу с файлами удобнее. Отлично подходит для просмотра кода, конфигов и текстовых файлов.

BashTex 📱 #linux #utils
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11
Чтение файлов в массив без cat

Часто при работе с файлами в Bash используют cat и while read, но есть более элегантное решение - команда mapfile (она же readarray).

🌟 Почему mapfile удобнее?

Читает файл целиком в массив.
Избавляет от проблем с разбиением строк по пробелам.
Работает быстрее cat | while read.
Поддерживает фильтрацию и постобработку данных.


🌟 Как это работает? Допустим, у нас есть файл users.txt:


Vanya
Anna
Roman

Читаем его в массив одной командой:

```bash
mapfile -t users < users.txt


Теперь можно обращаться к строкам по индексам:


echo "Первый пользователь: ${users[0]}"
echo "Второй пользователь: ${users[1]}"


Первый пользователь: Vanya
Второй пользователь: Anna```

🌟 mapfile vs cat | while read. Обычный способ через while read ломает строки с пробелами:


while read user; do
echo "$user"
done < users.txt


Если строка "Vanya Ivanov", while read разобьёт её на "Vanya" и "Ivanov". А mapfile сохранит строку целиком.

🌟 Применение mapfile в реальных задачах

1️⃣ Удаление пустых строк из файла


mapfile -t lines < <(grep -v '^$' users.txt)


2️⃣ Чтение вывода команды в массив


mapfile -t processes < <(ps aux)


3️⃣ Чтение первых N строк


mapfile -t -n 5 top_lines < users.txt


BashTex 📱 #linux #utils
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥15👍1
Развёртывание Linux по сети с PXE

Когда нужно установить Linux на множество серверов или ПК без USB-флешек и дисков, на помощь приходит PXE (Preboot Execution Environment) - загрузка ОС по сети. PXE позволяет запустить установщик Linux прямо из сети, что особенно удобно в дата-центрах, офисах и лабораториях.

🌟 Как это работает?

Компьютер включается и запрашивает сетевой загрузчик по DHCP.
Сервер отвечает и передаёт загрузочный образ через TFTP.
Клиент загружает ядро Linux и переходит к установке системы.


🌟 Что нужно для развертывания PXE?

DHCP-сервер (для раздачи PXE-загрузчика)
TFTP-сервер (для передачи загрузочных файлов)
HTTP/NFS-сервер (для хранения установочных файлов)


1️⃣ Устанавливаем нужные пакеты. На PXE-сервере установим DHCP, TFTP и Apache (для раздачи образов):


sudo apt update && sudo apt install isc-dhcp-server tftpd-hpa apache2


2️⃣ Настраиваем DHCP для PXE. Редактируем /etc/dhcp/dhcpd.conf:


subnet 192.168.1.0 netmask 255.255.255.0 {
range 192.168.1.100 192.168.1.200;
option routers 192.168.1.1;
next-server 192.168.1.10; # PXE-сервер
filename "pxelinux.0";
}


Перезапускаем DHCP:


sudo systemctl restart isc-dhcp-server


3️⃣ Настраиваем TFTP-сервер. Указываем папку для загрузки PXE-файлов в /etc/default/tftpd-hpa:


TFTP_DIRECTORY="/srv/tftp"
TFTP_OPTIONS="--secure"


Перезапускаем:


sudo systemctl restart tftpd-hpa


4️⃣ Загружаем PXELINUX. Скачиваем файлы для PXE:


sudo mkdir -p /srv/tftp
cd /srv/tftp
sudo apt install syslinux pxelinux
sudo cp /usr/lib/PXELINUX/pxelinux.0 .
sudo cp /usr/lib/syslinux/modules/bios/* .


Создаём каталог для меню:


mkdir -p /srv/tftp/pxelinux.cfg


5️⃣ Создаём загрузочное меню PXE. Создаём файл /srv/tftp/pxelinux.cfg/default:


DEFAULT menu.c32
PROMPT 0
TIMEOUT 100
ONTIMEOUT install

LABEL install
MENU LABEL Install Ubuntu 22.04
KERNEL ubuntu/vmlinuz
APPEND initrd=ubuntu/initrd.gz netboot=https://192.168.1.10/ubuntu/


6️⃣ Готовим установочные файлы. Загружаем образы на веб-сервер:


sudo mkdir -p /var/www/html/ubuntu
cd /var/www/html/ubuntu
wget https://archive.ubuntu.com/ubuntu/dists/jammy/main/installer-amd64/current/images/netboot/netboot.tar.gz
tar -xzf netboot.tar.gz


Перезапускаем Apache:


sudo systemctl restart apache2


7️⃣ Запускаем установку по сети. Теперь включаем клиентский компьютер, в BIOS включаем PXE-загрузку и выбираем сетевой интерфейс в качестве загрузочного устройства.

Клиент загрузится и начнёт установку Linux прямо из сети.

BashTex 📱 #linux #utils
Please open Telegram to view this post
VIEW IN TELEGRAM
👍26
Cтраховка от неожиданных ошибок в скриптах

При написании скриптов важно не просто запускать команды, но и гарантировать их корректное выполнение. Без дополнительных опций Bash может пропустить ошибки и продолжить выполнение, что приведёт к неожиданным последствиям. Использование set -euo pipefail помогает защитить скрипты от ошибок и упростить отладку.

Что делает эта магическая строка?


set -euo pipefail


-e (exit on error) — прерывает скрипт при ошибке любой команды (кроме в if, &&, ||).
-u (unset variables) — ошибка при попытке использовать неинициализированную переменную.
-o pipefail — ошибка в пайпах, если любая из команд завершится с ошибкой (обычно учитывается только последняя команда).


Разберём на примерах.

🚫 Скрипт без set -euo pipefail (пропустит ошибки)


#!/bin/bash
echo "Начинаем работу..."

rm /несуществующий_файл # Ошибка, но скрипт продолжит работу
echo "Удалили файл (на самом деле нет)"

VAR=$(cat $UNKNOWN_VAR) # Неинициализированная переменная (ошибка, но не критично)

ls | grep myfile | awk '{print $1}' # Ошибка в grep или awk не остановит выполнение
echo "Скрипт завершён"


Итог: скрипт продолжает работать, даже если что-то пошло не так.

✔️ Скрипт с set -euo pipefail (контроль ошибок)


#!/bin/bash
set -euo pipefail

echo "Начинаем работу..."

rm /несуществующий_файл # Скрипт сразу прервётся из-за ошибки
echo "Удалили файл"

VAR=$(cat $UNKNOWN_VAR) # Ошибка: переменная не объявлена

ls | grep myfile | awk '{print $1}' # Ошибка в любой команде пайпа приведёт к остановке
echo "Скрипт завершён"


Итог: скрипт остановится сразу при первой же ошибке, не допуская некорректного выполнения.

⭐️ Где это особенно полезно?

Бэкап-скрипты (чтобы не создать пустой бэкап, если команда провалилась).
Скрипты развёртывания (чтобы не получить систему в непредсказуемом состоянии).
Автоматизация обновлений (чтобы обновление не зависло в неизвестном месте).


❗️ Когда set -euo pipefail может мешать? Иногда ошибки могут быть ожидаемыми и не критичными.

Например, если файл может отсутствовать, но это не должно останавливать выполнение:


rm myfile.txt || true # Явно игнорируем ошибку


Или если команда в пайпе не всегда должна возвращать код 0:


set +o pipefail # Отключаем pipefail временно
ls | grep myfile | awk '{print $1}'
set -o pipefail # Включаем обратно


BashTex 📱 #linux #utils
Please open Telegram to view this post
VIEW IN TELEGRAM
👍17🔥1
Ограничение ресурсов процессов прямо из терминала

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

🌟 Что такое ulimit?

ulimit - это встроенная команда оболочки, которая позволяет устанавливать ограничения на использование ресурсов для текущего сеанса оболочки и всех дочерних процессов.


🌟 Что можно ограничить? Команда ulimit -a покажет текущие лимиты:


ulimit -a

core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
file size (blocks, -f) unlimited
open files (-n) 1024
max user processes (-u) 15635


🌟 Часто используемые лимиты

Параметр Назначение
-n Количество открытых файлов (очень важно для веб-серверов и баз данных)
-u Кол-во пользовательских процессов
-f Максимальный размер создаваемого файла
-v Максимальный объём виртуальной памяти
-s Размер стека
-t Максимальное время CPU, сек


▪️ Примеры использования
📍 Увеличить лимит открытых файлов:


ulimit -n 65535


📍 Ограничить процесс в использовании CPU временем:


ulimit -t 60


(После 60 секунд использования CPU - процесс будет убит)

📍 Запретить создание файлов > 10 МБ:


ulimit -f $((10 * 1024)) # 10 МБ в блоках по 1K


▪️ Мягкие и жёсткие лимиты

Мягкий лимит - может быть изменён пользователем в рамках жёсткого
Жёсткий лимит - верхняя граница, меняется только от root

📍 Посмотреть:


ulimit -Sn # soft
ulimit -Hn # hard


📍 Установить:


ulimit -Sn 4096
ulimit -Hn 65535


📍 Постоянные настройки. Чтобы лимиты сохранялись после перезагрузки:

/etc/security/limits.conf:


youruser hard nofile 65535
youruser soft nofile 65535


Убедитесь, что PAM обрабатывает лимиты:


/etc/pam.d/common-session


Добавьте:


session required pam_limits.so


⭐️ Когда пригодится?

Высоконагруженные сервисы (nginx, PostgreSQL, Elasticsearch)
CI/CD-сборки, которые могут упереться в лимит памяти или процессов
Безопасность: ограничение прав скриптов или сторонних процессов


BashTex 📱 #linux #utils
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12🔥4
Настройка автообновления сертификатов Let’s Encrypt

Сертификаты Let’s Encrypt действуют всего 90 дней, и если забыть продлить - сайт покажет пользователю страшную ошибку о "небезопасном соединении". Обновлять сертификаты можно автоматически, и делается это за 5 минут.

1️⃣ Установка Certbot. Certbot - официальный клиент для работы с Let's Encrypt.

Для Ubuntu/Debian:


sudo apt update
sudo apt install certbot python3-certbot-nginx # для Nginx


Для Apache:


sudo apt install certbot python3-certbot-apache


2️⃣ Получение сертификата. Пример для Nginx:


sudo certbot --nginx -d example.com -d www.bashtex.com


Для Apache:


sudo certbot --apache -d bashtex.com


Certbot сам пропишет нужные директивы в конфиг веб-сервера и активирует HTTPS.

3️⃣ Проверка автоматического обновления. После установки certbot создает cron или systemd job, которая автоматически проверяет и обновляет сертификаты.

Проверить вручную:


sudo certbot renew --dry-run


Если тест успешен — автообновление работает.

4️⃣ Кастомный крон (если нужен). Если хочешь сделать всё под себя:


sudo crontab -e

Добавь строку:

```bash
0 3 * * * certbot renew --quiet && systemctl reload nginx


Обновление каждый день в 3:00 ночи. После обновления - перезагрузка веб-сервера, чтобы подхватить новый сертификат.

5️⃣ Обновление через hook (если веб-сервер кастомный)


certbot renew --deploy-hook "systemctl reload myserver"


Хук сработает только если сертификат реально обновился - не будет лишних рестартов.

🌟 Как узнать дату истечения сертификата?


openssl x509 -in /etc/letsencrypt/live/example.com/fullchain.pem -noout -enddate


BashTex 📱 #linux #utils
Please open Telegram to view this post
VIEW IN TELEGRAM
👍17🔥2
Удобное копирование файлов в облако

Если ты хочешь работать с Google Drive, Yandex.Disk, Dropbox, S3 и десятками других облаков так, будто это обычная файловая система - тебе нужен rclone. Это утилита для синхронизации, копирования, шифрования и резервного копирования файлов в облачные хранилища.
Поддерживает более 60 облаков, включая: Google Drive, OneDrive, Яндекс Диск, FTP/SFTP и даже локальные диски.

⚙️ Установка


sudo apt install rclone #Ubuntu/Debian

Или вручную:

```bash
curl https://rclone.org/install.sh | sudo bash


▪️ Быстрая настройка (на примере Google Drive)


rclone config


n - создать новое подключение

1. Введи имя, например gdrive
2. Выбери тип (drive для Google Drive)
3. Авторизуй через браузер

Готово!

▪️ Основные команды
📍 Копировать файлы в облако:


rclone copy ./backup gdrive:/my_backups


📍 Синхронизация (удаляет на целевой стороне лишнее):


rclone sync ./media gdrive:/media --progress


📍 Копирование из облака:


rclone copy gdrive:/media ./local_copy


📍 Просмотр файлов в облаке:


rclone ls gdrive:/my_backups


▪️ Продвинутые фишки
📍 Шифрование:

Создай новый remote с типом crypt, укажи как базу - существующий gdrive:encrypted/
Теперь все файлы будут шифроваться на лету, прямо перед отправкой.

📍 Сжатие + передача:


tar cz folder | rclone rcat gdrive:archive.tar.gz


📍 Тест пропускной способности:


rclone bench


📍 Мониторинг через Web UI:


rclone rcd --rc-web-gui


🌟 Зачем использовать rclone?

Удобный CLI-стиль как у rsync
Работает с почти любым облаком
Поддержка крипты, логирования, многопоточности
Можно использовать в скриптах, cron, backup-сценариях
Идеален для сервера без GUI


Rclone = rsync для облаков.

BashTex 📱 #linux #utils
Please open Telegram to view this post
VIEW IN TELEGRAM
👍17
Массивы и ассоциативные массивы

Если ты до сих пор используешь только переменные в Bash, пора прокачаться - массивы и ассоциативные массивы дают прокачку в области автоматизации.

▪️ Обычные массивы. Когда нужен список значений, например, список баз данных:


databases=("db1" "db2" "db3")

for db in "${databases[@]}"; do
echo "Делаю бэкап $db..."
pg_dump "$db" > "$db.sql"
done


▪️ Ассоциативные массивы. Когда нужно сопоставить ключ → значение, например: сервис и его порт.


declare -A services
services=(
[nginx]=80
[ssh]=22
[postgres]=5432
)

for service in "${!services[@]}"; do
port=${services[$service]}
echo "$service работает на порту $port"
done


▪️ Реальное применение

📍 Мониторинг процессов:


declare -A procs=( [nginx]="nginx" [db]="postgres" [ssh]="sshd" )

for name in "${!procs[@]}"; do
pgrep -x "${procs[$name]}" > /dev/null || echo "$name не работает!"
done


📍 Распределённая отправка по email:


emails=([email protected] [email protected] [email protected])

for email in "${emails[@]}"; do
echo "Привет!" | mail -s "Уведомление" "$email"
done


BashTex 📱 #linux #utils
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥14👍4🫡2
Создание своего systemd-сервиса для скрипта

Если у тебя есть полезный скрипт, который должен запускаться как сервис (например, при старте системы или по крону не подходит) - самое время подружить его с systemd.

1️⃣ Подготовка скрипта. Убедись, что скрипт исполняемый и логирует всё в файл:


#!/bin/bash
echo "$(date): Скрипт запущен" >> /var/log/myscript.log
# Здесь твоя логика
Сохрани его, например, в /usr/local/bin/myscript.sh


И не забудь дать права:


chmod +x /usr/local/bin/myscript.sh


2️⃣ Юнит-файл systemd. Создай сервис:


sudo nano /etc/systemd/system/myscript.service


Пример содержимого:


[Unit]
Description=Мой кастомный скрипт
After=network.target

[Service]
ExecStart=/usr/local/bin/myscript.sh
Restart=on-failure
User=root
StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target


3️⃣ Активация и запуск


sudo systemctl daemon-reexec
sudo systemctl daemon-reload
sudo systemctl enable myscript.service
sudo systemctl start myscript.service


Проверка:


systemctl status myscript.service


🌟 Зачем это вообще?

Скрипт запускается при старте
Контролируется systemd (перезапуск, статус, логи)
Удобная интеграция в системную инфраструктуру


🌟 Советы:

Нужен таймер? Используй myscript.timer
Хочешь лог в journalctl? - уже встроено
Скрипт должен зависеть от другого сервиса? Укажи в After= и Requires=


BashTex 📱 #linux #utils
Please open Telegram to view this post
VIEW IN TELEGRAM
👍17🔥3
Сравнение производительности: grep / awk / sed / perl

Когда дело доходит до обработки текста в Linux, у нас есть классическая "великая четвёрка": grep, awk, sed, perl. Все они умеют искать и преобразовывать строки, но что выбрать, если важна производительность?

⭐️ Тест: кто быстрее?

Возьмём файл на 1 млн строк (logs.txt) и задачу - найти строки, содержащие "ERROR" и вывести их.


# 1. grep — специализируется на поиске
time grep 'ERROR' logs.txt

# 2. awk — универсален, но чуть медленнее grep
time awk '/ERROR/' logs.txt

# 3. sed — может искать, но не для этого заточен
time sed -n '/ERROR/p' logs.txt

# 4. perl - мощь и регулярки, но запускается дольше
time perl -ne 'print if /ERROR/' logs.txt


🕛 Результаты (примерные):

Команда Время (сек) Комментарий
grep 0.18 - Самый быстрый в чистом поиске
awk 0.25 - Универсал, чуть медленнее
sed 0.30 - Не лучший для просто поиска
perl 0.35 - 0.50 Мощно, но медленно стартует


🌟 Что важно помнить:

grep - лучший выбор для быстрого поиска. Используй grep -F (fixed strings) для ещё большей скорости.
awk - когда нужна логика: фильтрация, подсчёты, агрегирование.
sed - идеально для простых замен (особенно sed -i), но не лучший инструмент для поиска.
perl - тянет даже сложнейшие регулярки и постобработку, но стоит дороже по времени запуска.


🌟 Хитрости: Для поиска без регулярных выражений:

1. grep -F "ERROR" → быстрее, чем обычный grep.

2. Используй LC_ALL=C или LANG=C для ускорения поиска (отключает локализацию):


LC_ALL=C grep 'ERROR' logs.txt


3. Объединяй:


grep 'ERROR' logs.txt | awk '{print $1}' # вытащить дату, например


BashTex 📱 #linux #utils
Please open Telegram to view this post
VIEW IN TELEGRAM
👍20🔥3👨‍💻1
Логирование доступа к файлам через auditd

Если ты хочешь знать, кто и когда открыл или изменил важные файлы на сервере - добро пожаловать в мир auditd. Это подсистема аудита Linux, а вместе с Bash она превращается в инструмент контроля безопасности.

auditd - демон ядра, который пишет события доступа к ресурсам (файлам, системным вызовам, пользователям и т.д.) в лог /var/log/audit/audit.log.

⚙️ Установка:


sudo apt install auditd audispd-plugins # Debian/Ubuntu
sudo yum install audit -y # RHEL/CentOS


▪️ Отслеживаем доступ к файлу. Допустим, тебе важно следить за файлом /etc/shadow:


sudo auditctl -w /etc/shadow -p rwxa -k shadow_watch


-w — путь к файлу
-p — права (read/write/execute/attribute)
-k — метка (ключ) для фильтрации логов


▪️ Пример события в логе:


type=SYSCALL msg=audit(1613403003.244:516): ...
type=PATH msg=audit(1613403003.244:516): item=0 name="/etc/shadow" ...


📱 Скрипт для анализа:


#!/bin/bash

KEY="shadow_watch"
LOG="/var/log/audit/audit.log"
REPORT="/var/log/shadow_access_report.txt"

echo "Анализ доступа к /etc/shadow — $(date)" > "$REPORT"

ausearch -k "$KEY" | \
grep 'name="/etc/shadow"' | \
awk -F"uid=" '{print $2}' | \
awk '{print $1}' | \
sort | uniq -c | sort -nr >> "$REPORT"

cat "$REPORT"


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

▪️ Как убрать правило:


sudo auditctl -W /etc/shadow


▪️ Расширение идеи:

Нужно логировать доступ к нескольким файлам? Добавь их в список и прогоняй в цикле.

BashTex 📱 #linux #utils
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15🔥2