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

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

Реклама: @dad_admin
Download Telegram
Как проверить существование файла в скрипте

При написании Bash-скриптов часто возникает необходимость проверить, существует ли файл (или директория), прежде чем продолжить выполнение. Давайте разберём несколько подходов с примерами.

1. Проверка существования файла. Самый простой способ проверить, существует ли файл:


if [ -e "/path/to/file" ]; then
echo "Файл существует."
else
echo "Файл не найден."
fi


2. Проверка, что это обычный файл. Если нужно убедиться, что это именно файл (а не директория или символическая ссылка):


if [ -f "/path/to/file" ]; then
echo "Это файл."
else
echo "Это не файл или его не существует."
fi


3. Проверка существования директории. Чтобы проверить, существует ли директория:


if [ -d "/path/to/directory" ]; then
echo "Директория существует."
else
echo "Директория не найдена."
fi


4. Проверка прав доступа к файлу. Проверить доступ на чтение:


if [ -r "/path/to/file" ]; then
echo "Файл доступен для чтения."
fi
Проверить доступ на запись:
bash
Копировать код
if [ -w "/path/to/file" ]; then
echo "Файл доступен для записи."
fi
Проверить доступ на выполнение:
bash
Копировать код
if [ -x "/path/to/file" ]; then
echo "Файл доступен для выполнения."
fi


5. Проверка нескольких условий. Можно комбинировать проверки:


if [ -f "/path/to/file" ] && [ -w "/path/to/file" ]; then
echo "Файл существует и доступен для записи."
else
echo "Файл не существует или недоступен для записи."
fi


Пример: Реальный сценарий. Предположим, вы пишете скрипт для архивации файла, только если он существует.


#!/bin/bash

FILE="/path/to/file"
ARCHIVE="/path/to/archive"

if [ -f "$FILE" ]; then
tar -czf "$ARCHIVE/archive.tar.gz" "$FILE"
echo "Файл заархивирован."
else
echo "Файл не найден. Архивация не выполнена."
fi


Полезный совет: Для проверки в одном условии часто используют флаг || (или):


[ -f "/path/to/file" ] || echo "Файл не найден."


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

BashTex 📱 #bash
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🔥3
Создание кластера Unix-серверов

Кластеризация серверов в Unix - это процесс объединения нескольких серверов в единое целое для повышения надёжности, масштабируемости и производительности. Кластеры используются для задач высокой доступности (HA), распределённой обработки и балансировки нагрузки.

В этой статье разберём базовые шаги по созданию кластера Unix-серверов и обеспечению их совместной работы.

Что потребуется?

1. Несколько Unix-серверов.
Например, Ubuntu, CentOS или другие дистрибутивы Linux/Unix.
2. Общий доступ к данным.
Используем NFS или другой механизм для хранения.
3. Балансировщик нагрузки.
Например, HAProxy или встроенные механизмы IPVS.
4. Программное обеспечение для кластера.
Для высокой доступности можно использовать Corosync и Pacemaker.


Шаг 1: Настройка узлов

1. Обновите все системы. Перед началом убедитесь, что пакеты обновлены на всех узлах:


sudo apt update && sudo apt upgrade -y # Для Ubuntu
sudo yum update -y # Для CentOS


2. Настройте хосты. Пропишите имена серверов в /etc/hosts, чтобы узлы могли видеть друг друга:


192.168.1.1 node1
192.168.1.2 node2
192.168.1.3 node3


3. Настройте SSH-доступ. Для работы кластера потребуется SSH-доступ между узлами без пароля:


ssh-keygen -t rsa # Генерация ключа
ssh-copy-id node2 # Копирование ключа
ssh-copy-id node3


Шаг 2: Настройка общего доступа к данным (NFS)

1. Установите NFS-сервер на одном из узлов:


sudo apt install nfs-kernel-server # Для Ubuntu
sudo yum install nfs-utils # Для CentOS


2. Настройте экспортируемую директорию, для этого добавьте в /etc/exports:


/data/shared *(rw,sync,no_root_squash)


Примените изменения:


sudo exportfs -a


3. На других узлах подключите общий ресурс:


sudo mount 192.168.1.1:/data/shared /mnt/shared


Проверьте:


df -h


Шаг 3: Настройка кластера HA (High Availability)

1. Установите Pacemaker и Corosync, для этого на всех узлах выполните:


sudo apt install pacemaker corosync -y # Для Ubuntu
sudo yum install pacemaker corosync -y # Для CentOS


2. Настройте Corosync. Отредактируйте файл /etc/corosync/corosync.conf и добавьте узлы:


nodelist {
node {
ring0_addr: node1
}
node {
ring0_addr: node2
}
node {
ring0_addr: node3
}
}
totem {
version: 2
secauth: off
cluster_name: unix_cluster
transport: udpu
}


Запустите Corosync и Pacemaker:


sudo systemctl start corosync
sudo systemctl start pacemaker
sudo systemctl enable corosync
sudo systemctl enable pacemaker


3. Добавьте ресурс в кластер. Например, ресурс виртуального IP:


pcs resource create virtual_ip ocf:heartbeat:IPaddr2 \
ip=192.168.1.100 cidr_netmask=24 op monitor interval=30s


Шаг 4: Проверка и управление кластером
Статус кластера:


pcs status


Добавление нового узла:


pcs cluster auth newnode
pcs cluster node add newnode


Остановка кластера


pcs cluster stop --all


Шаг 5: Настройка балансировки нагрузки (опционально)
Установите HAProxy для равномерного распределения нагрузки:


sudo apt install haproxy # Для Ubuntu
sudo yum install haproxy # Для CentOS


Настройте /etc/haproxy/haproxy.cfg:


frontend http_front
bind *:80
default_backend servers

backend servers
balance roundrobin
server node1 192.168.1.1:80 check
server node2 192.168.1.2:80 check
server node3 192.168.1.3:80 check


Запустите HAProxy:


sudo systemctl restart haproxy


---

Кластеризация Unix-серверов - это основа для построения надёжной инфраструктуры. Вы можете настроить кластеры для высокой доступности, балансировки нагрузки или распределённой обработки. С правильными инструментами, такими как NFS, Pacemaker и HAProxy, вы получите стабильную и масштабируемую систему.

BashTex 📱 #linux #utils
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11
Автоматизация управления с помощью Ansible

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

В этой статье разберём, как начать работу с Ansible, автоматизировать задачи и повысить эффективность управления серверами.

Что такое Ansible? Ansible - это инструмент, основанный на архитектуре "push", который использует SSH для взаимодействия с серверами.
Основные преимущества:

Лёгкость установки и настройки.
YAML-формат для описания задач (Playbooks).
Модульная структура.
Поддержка сотен модулей для работы с различными системами.


1. Установка на управляющей машине
Для Ubuntu:


sudo apt update
sudo apt install ansible -y


Для CentOS:


sudo yum install epel-release -y
sudo yum install ansible -y


2. Настройка SSH-доступа к серверам. Ansible использует SSH для подключения к узлам. Настройте безпарольный доступ:


ssh-keygen -t rsa
ssh-copy-id user@remote_server


3. Настройка инвентаря. Ansible использует файл инвентаря для описания узлов. По умолчанию это /etc/ansible/hosts.

Пример файла:


[web_servers]
192.168.1.101
192.168.1.102

[db_servers]
192.168.1.201
192.168.1.202


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

4. Написание Playbook. Playbook - это файл в формате YAML, который описывает, что нужно сделать на целевых узлах.

Пример: Установка Apache на веб-серверах


- name: Установка Apache
hosts: web_servers
become: true # Повышение привилегий до root
tasks:
- name: Убедиться, что Apache установлен
apt:
name: apache2
state: present
- name: Запустить и включить Apache
service:
name: apache2
state: started
enabled: true


Запуск Playbook:


ansible-playbook install_apache.yml


---

Автоматизация задач
1. Обновление пакетов на всех серверах


- name: Обновление всех пакетов
hosts: all
become: true
tasks:
- name: Обновить пакеты
apt:
update_cache: yes
upgrade: dist


2. Создание пользователей


- name: Создание пользователя devops
hosts: all
become: true
tasks:
- name: Создать пользователя
user:
name: devops
state: present
groups: sudo


3. Копирование конфигурационных файлов


- name: Копирование файла конфигурации
hosts: web_servers
become: true
tasks:
- name: Копировать конфигурацию Nginx
copy:
src: /path/to/nginx.conf
dest: /etc/nginx/nginx.conf
mode: '0644'


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


ansible all -m ping


Пример выполнения команды uptime на всех узлах:


ansible all -m command -a "uptime"


---

Дополнительные советы

Используйте переменные:
Вы можете задавать переменные в Playbook, инвентаре или через командную строку.


vars:
nginx_port: 8080


Шифруйте секреты: Ansible Vault позволяет хранить конфиденциальные данные.


ansible-vault encrypt secret.yml


Интеграция с CI/CD: Ansible легко интегрируется с Jenkins, GitLab CI и другими системами.

Используйте Ansible для настройки серверов, развертывания приложений, управления конфигурациями и многого другого. Овладев этим инструментом, вы сможете автоматизировать рутинные задачи.

BashTex 📱 #linux #utils
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11
Стресс-тестирование сервера с помощью stress-ng

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

Что такое stress-ng?

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


Установка stress-ng

Для Ubuntu/Debian:


sudo apt update
sudo apt install stress-ng -y


Для CentOS/RHEL:


sudo yum install epel-release -y
sudo yum install stress-ng -y


Примеры использования

Стресс-тест CPU. Задействуем 4 ядра процессора на 60 секунд:


stress-ng --cpu 4 --timeout 60s


Вывод:


stress-ng: info: [1002] stress-ng: dispatching hogs: 4 cpu
stress-ng: info: [1002] stress-ng: successful run completed in 60.01s


Нагрузка на память. Тестируем систему, выделяя 2 ГБ памяти:


stress-ng --vm 1 --vm-bytes 2G --timeout 60s


Вывод:


stress-ng: info: [1003] stress-ng: dispatching hogs: 1 vm
stress-ng: info: [1003] stress-ng: memory allocated: 2048 MB


Одновременная нагрузка на CPU и диск. Смешанный тест, нагружающий процессор и создающий 2 потока записи на диск:


stress-ng --cpu 4 --hdd 2 --timeout 90s


Нагрузка на файловую систему. Тест создания файлов и директорий:


stress-ng --temp-path /tmp --timeout 30s --touch 1000


Проверьте /tmp для созданных файлов.

Имитация пикового использования системы. Задействуем все ресурсы:


stress-ng --cpu 4 --io 4 --vm 2 --vm-bytes 1G --timeout 120s


Анализ результатов. Вместе с утилитой можно использовать мониторинг:

htop - для наблюдения за нагрузкой на CPU и RAM.
iostat - для анализа ввода/вывода.
dstat - для комбинированного мониторинга.

Пример с htop:


stress-ng --cpu 4 --timeout 30s &
htop


---

В проде такое лучше не запускать, балуйтесь на тестовых серверах 🎅

BashTex 📱 #linux #utils
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10
Мониторинг производительности с iostat: углубленный разбор

Что такое iostat?

iostat (Input/Output Statistics) — это утилита из пакета sysstat, которая собирает данные о производительности:

Использование CPU.
Статистика ввода/вывода для устройств и разделов.
Производительность файловой системы.


Примеры использования

1. Базовая статистика. Просто вызовите iostat без параметров, чтобы увидеть общую картину:


iostat


Вывод:


avg-cpu: %user %nice %system %iowait %steal %idle
12.34 0.00 3.21 2.45 0.00 82.00

Device tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 45.00 123.45 678.90 1234567 9876543


%iowait: Время, которое CPU ждёт операций ввода/вывода.
tps: Количество операций ввода/вывода в секунду.
kB_read/s и kB_wrtn/s: Скорость чтения и записи.

2. Обновление в реальном времени. Вывод каждые 2 секунды:


iostat 2


3. Статистика только для дисков. Если интересуют только устройства хранения:


iostat -d


Вывод:


Device tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 45.00 123.45 678.90 1234567 9876543


4. Производительность процессора. Анализ нагрузки на CPU:


iostat -c


Вывод:


avg-cpu: %user %nice %system %iowait %steal %idle
10.00 0.00 5.00 1.00 0.00 84.00


5. Статистика для конкретного устройства. Чтобы проанализировать только диск sda:


iostat -d sda


Переключение на MB для удобства:


iostat -m


6. Детализация загрузки системы. iostat может выводить расширенные данные:


iostat -x


Вывод:


Device rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sda 10.00 20.00 30.00 40.00 123.00 456.00 33.40 0.10 0.50 0.30 0.70 0.40 85.00


%util: Показывает, насколько устройство занято.

Практическое применение.

1. Идентификация узких мест.

Если %iowait высок, это сигнал, что диск не справляется с запросами.
Высокий %util (>90%) на устройстве указывает на перегрузку.

2. Мониторинг в реальном времени. Используйте комбинацию с watch:


watch -n 1 'iostat -x'


3. Сохранение данных для анализа. Чтобы сохранить статистику для последующего анализа:


iostat -x > iostat_log.txt


---

iostat - это незаменимый инструмент для мониторинга ввода/вывода и нагрузки на процессор. Он помогает быстро находить узкие места в работе серверов и принимать меры для их устранения.

BashTex 📱 #linux #utils
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10
Сравнение лог-агрегаторов: ELK vs Loki

Когда речь заходит о лог-агрегаторах, которые помогают управлять огромными объемами журналов, два наиболее популярных решения - это ELK (Elasticsearch, Logstash, Kibana) и Loki от Grafana Labs. Давайте разберёмся, какое из них лучше выбрать для ваших задач.

ELK: Мощь, гибкость и масштабируемость

Что такое ELK? ELK - это стек из трёх инструментов:

Elasticsearch - хранение и поиск по журналам.
Logstash - сбор и обработка данных.
Kibana - визуализация и анализ.

Плюсы:

Мощный поиск. Elasticsearch поддерживает сложные запросы и анализ текста.
Гибкость. Легко интегрируется с разными источниками данных.
Расширяемость. Подходит для больших и сложных инфраструктур.
Визуализация. Kibana предоставляет богатый набор инструментов для графиков и дашбордов.


Минусы:

Требовательность к ресурсам. ELK требует значительных вычислительных мощностей.
Сложность настройки. Развертывание и поддержка требуют опыта.
Высокая стоимость. Для больших кластеров может стать дорого.


Loki: Простота и интеграция с Grafana

Что такое Loki? Loki - это легковесный лог-агрегатор, оптимизированный для работы с метриками. Вместо хранения сырых данных, как ELK, Loki использует метаинформацию (лейблы).

Плюсы:

Лёгкость. Потребляет меньше ресурсов по сравнению с ELK.
Интеграция с Grafana. Loki идеально подходит для тех, кто уже использует Grafana.
Скорость развертывания. Установка и настройка гораздо проще.
Экономия хранилища. Хранит данные в оптимизированном формате.


Минусы:

Ограниченные возможности поиска. Loki не такой мощный, как Elasticsearch.
Нет обработки данных. В отличие от Logstash, Loki не поддерживает сложные трансформации.
Молодой продукт. Функциональность продолжает развиваться.


❗️ Когда выбрать ELK?

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

❗️ Когда выбрать Loki?

Вы уже используете Grafana.
Вам нужен простой инструмент для логирования.
Ресурсы сервера ограничены.
В приоритете экономия на хранилище.

---

Если вы ищете гибкость и мощные аналитические возможности, ELK - ваш выбор. Если важны простота, лёгкость и интеграция с Grafana, то Loki станет отличным решением.

BashTex 📱 #linux #utils
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
Как использовать Netdata для реального времени мониторинга сервера

Если вы ищете удобный и визуально понятный инструмент для мониторинга серверов в реальном времени, то Netdata - отличный выбор. Этот легковесный инструмент позволяет отслеживать состояние системы, процессов, сети и даже приложений, предоставляя мгновенные визуализации.

Преимущества:

Мониторинг в реальном времени. Все данные обновляются с частотой до одной секунды.
Простая установка. Установить и настроить Netdata можно за считанные минуты.
Поддержка множества метрик. CPU, память, диски, сети, базы данных и многое другое.
Визуализация. Графики удобны и хорошо читаются прямо в веб-интерфейсе.


Установка Netdata. На большинстве дистрибутивов Linux достаточно выполнить одну команду:


bash <(curl -Ss https://my-netdata.io/kickstart.sh)


После установки веб-интерфейс будет доступен по адресу: http://<IP-адрес-сервера>:19999

Базовые метрики. Netdata автоматически начинает мониторинг:

CPU: загрузка и частота.
Память: использование и своп.
Диски: I/O операции и латентность.
Сеть: входящий и исходящий трафик.
Сервисы: Apache, Nginx, MySQL, PostgreSQL, Redis и другие.

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

Откройте /etc/netdata/python.d/mysql.conf. Настройте доступ к базе данных:


local:
user: 'root'
pass: 'password'
host: 'localhost'
port: 3306


Перезапустите Netdata:


sudo systemctl restart netdata


Интеграция с другими системами. Netdata поддерживает экспорт метрик в Prometheus, Grafana и другие системы.

Пример настройки интеграции с Prometheus:

Откройте /etc/netdata/netdata.conf и включите Prometheus:


[prometheus]
enabled = yes


Перезапустите Netdata. Теперь данные Netdata доступны для анализа в Grafana.

Преимущества мониторинга в реальном времени

Диагностика проблем: мгновенное выявление узких мест (например, высокий %iowait или перегрузка сети).
Анализ трендов: Netdata сохраняет метрики для последующего анализа.
Простота: доступен даже новичкам в мониторинге.

BashTex 📱 #utils #monitoring
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🔥1
Создание меню в терминале с помощью команды select

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

Синтаксис команды select


select переменная in список_опций; do
команды
done


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


Пример 1: Простое меню. Создадим базовое меню для выбора действий:


#!/bin/bash

echo "Выберите действие:"
select option in "Посмотреть время" "Показать директорию" "Выход"; do
case $REPLY in
1) echo "Текущее время: $(date)" ;;
2) echo "Текущая директория: $(pwd)" ;;
3) echo "Выход..."; break ;;
*) echo "Неверный выбор. Попробуйте снова." ;;
esac
done


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


1) Посмотреть время
2) Показать директорию
3) Выход
#? 1
Текущее время: Tue Dec 19 14:12:45 UTC 2024
#? 3
Выход...


Особенности команды select

$REPLY: Автоматически содержит номер выбранной опции.
Удобство: Если пользователь вводит неправильный номер, меню просто повторяется.
Гибкость: Подходит для интерактивных сценариев, где требуется выбор.


Пример 2: Динамическое меню с файлами. Скрипт для выбора файла из текущей директории:


#!/bin/bash

echo "Выберите файл из списка:"
select file in *; do
if [ -n "$file" ]; then
echo "Вы выбрали: $file"
break
else
echo "Неверный выбор. Попробуйте снова."
fi
done


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


1) file1.txt
2) file2.log
3) noscript.sh
#? 2
Вы выбрали: file2.log


Использование в реальных задачах

Меню управления: Создавайте интерактивные скрипты для настройки окружения.
Обработка файлов: Выбирайте файлы для анализа или обработки.
Автоматизация: Упрощайте выбор действий в автоматизированных системах.


Совет: Используйте команду PS3 для настройки пользовательского приглашения:


PS3="Введите номер действия: "


Пример с использованием PS3:


Введите номер действия:


---

Команда select - простой инструмент для создания интуитивно понятных меню в терминале. Она отлично помогает сделать скрипты более интерактивными и удобными.

BashTex 📱 #linux #utils
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12
Как ускорить Bash-скрипты с помощью xargs и параллельных задач

Когда нужно обработать множество файлов, выполнить команды для каждой строки или справиться с большим объёмом задач, утилита xargs может стать вашим секретным оружием. Её главное преимущество - возможность запускать команды параллельно, экономя время и ресурсы.

Что делает xargs?

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


Параллельная обработка с xargs

Флаг -P позволяет запускать несколько процессов одновременно, значительно ускоряя выполнение задач.

Пример 1: Параллельное сжатие файлов. Представьте, что нужно сжать множество файлов:


find /path/to/files -type f -name "*.log" | xargs -P 4 -I {} gzip {}


-P 4 - запускает 4 процесса одновременно.
-I {} - заменяет {} в команде именами файлов.
gzip - сжимает каждый найденный файл.

Результат: ускоренное сжатие за счёт одновременной обработки файлов.

Пример 2: Проверка доступности множества хостов. Список IP-адресов в файле hosts.txt:


192.168.1.1
192.168.1.2
192.168.1.3
192.168.1.4


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


cat hosts.txt | xargs -P 10 -I {} ping -c 3 {}


-P 10 - запускает до 10 проверок одновременно.
ping -c 3 {} - отправляет 3 пакета на каждый IP.

Результат: мгновенная проверка множества хостов.

Пример 3: Параллельное копирование больших файлов. Список файлов в files.txt:


file1.doc
file2.doc
file3.doc


Копирование файлов в другую директорию:


cat files.txt | xargs -P 3 -I {} cp {} /path/to/destination/


-P 3 - выполняет до 3 копирований одновременно.

Почему это быстрее?

Многозадачность. Вместо обработки задач по очереди, они выполняются параллельно.
Оптимизация ресурсов. Загружаются все ядра процессора.
Гибкость. xargs работает с любыми командами и аргументами.


Полезные флаги xargs

-n N - передаёт по N аргументов в каждую команду.


echo "file1 file2 file3" | xargs -n 2 echo


Вывод:


file1 file2
file3


--max-procs (или -P) - ограничивает количество параллельных процессов.

---

Использование xargs с параллельной обработкой - это простой способ ускорить выполнение рутинных задач. Сжатие, копирование, сканирование - всё это можно делать быстрее и эффективнее.

BashTex 📱 #linux #utils
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11
Как писать эффективные функции в Bash: оптимизация и практические примеры

Функции в Bash помогают организовать код, улучшить читаемость и сократить дублирование. Однако неправильное использование может снизить производительность скриптов. Давайте разберёмся, как писать эффективные функции, избегая ошибок.

Что такое функция в Bash?

Функция - это именованный блок кода, который можно вызывать многократно. Она определяет действия, выполняемые скриптом, и упрощает повторяющиеся операции.


Пример базовой функции:


hello_world() {
echo "Hello, World!"
}
hello_world


Принципы написания эффективных функций

1. Используйте параметры вместо глобальных переменных. Глобальные переменные могут вызывать неожиданные ошибки. Передавайте данные в функции через параметры:


calculate_sum() {
echo $(( $1 + $2 ))
}
calculate_sum 5 10 # Вывод: 15


2. Проверяйте входные данные. Защитите функции от некорректного ввода:


safe_division() {
if [ "$2" -eq 0 ]; then
echo "Ошибка: деление на ноль!"
return 1
fi
echo $(( $1 / $2 ))
}
safe_division 10 0 # Вывод: Ошибка: деление на ноль!


3. Возвращайте значения через echo или return. Используйте echo для вывода данных, return для статусов завершения.

Практические примеры

1. Подсчёт количества файлов в директории


count_files() {
local dir=$1
if [ -d "$dir" ]; then
echo "$(ls "$dir" | wc -l)"
else
echo "Директория $dir не существует."
return 1
fi
}
count_files /etc


2. Кеширование результатов для оптимизации. При повторных вычислениях можно сохранить результат в переменной:


cached_command() {
local cache_file="/tmp/command_output"
if [ -f "$cache_file" ]; then
cat "$cache_file"
else
echo "Выполняется команда..."
ls /etc > "$cache_file"
cat "$cache_file"
fi
}
cached_command


3. Параллельная обработка с помощью функций


process_file() {
echo "Обработка файла $1"
sleep 2 # Эмуляция длительной задачи
}
export -f process_file
find . -type f -name "*.log" | xargs -n 1 -P 4 -I {} bash -c 'process_file "$@"' _ {}


Инструменты для отладки функций

1. Добавляйте трассировку.


set -x # Включить трассировку


2. Проверяйте на ошибки.


set -e # Завершить скрипт при ошибке


Советы по оптимизации

1. Минимизируйте вызовы внешних команд. Вместо ls | wc -l используйте встроенные функции Bash:


find . -type f | wc -l


2. Используйте встроенные массивы. Для работы с множеством значений массивы быстрее и удобнее, чем строки:


my_array=(file1 file2 file3)
for file in "${my_array[@]}"; do
echo "Обрабатывается $file"
done


Эффективные функции - залог быстрого и надёжного Bash-скрипта. Соблюдайте лучшие практики, оптимизируйте код, и ваши скрипты станут мощными инструментами автоматизации.

BashTex 📱 #bash
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10
Аудит Linux-системы с Lynis: от установки до анализа отчёта

Lynis - это инструмент командной строки для аудита безопасности, соответствия стандартам и повышения производительности Linux и других UNIX-систем. Он прост в использовании, не требует установки агента и может запускаться на работающей системе.

Установка Lynis

Установите Lynis из официального репозитория:


sudo apt update
sudo apt install lynis


Для систем на базе RHEL:


sudo yum install lynis


Альтернативно, скачайте с GitHub 📱:


git clone https://github.com/CISOfy/lynis.git
cd lynis
sudo ./lynis audit system


Запуск аудита. Для базового аудита системы используйте:


sudo lynis audit system


Команда выполнит:

Проверку конфигурации ядра.
Анализ файлов и папок.
Проверку безопасности сети.
Оценку производительности.


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


[+] Kernel Hardening
- Enable kernel module loading: OK
- Kernel logging level: OK
- Unused kernel modules: Warning

[+] File Integrity
- Check /etc/passwd: OK
- Check /etc/shadow: OK

Hardening index: 78/100
Suggestions: 5


Анализ отчёта. После выполнения аудита, Lynis предоставляет список рекомендаций для улучшения безопасности.

Журнал рекомендаций: Все советы сохраняются в /var/log/lynis.log.


less /var/log/lynis.log


Улучшение индекса безопасности: Улучшите настройки по рекомендациям, например:

Установите обновления ядра.
Убедитесь, что файлы /etc/passwd и /etc/shadow защищены.
Включите SELinux или AppArmor для повышения безопасности.

Проверка конкретных компонентов. Чтобы провести аудит конкретного компонента, например, SSH:


sudo lynis audit system --tests-from-group ssh


Почему Lynis полезен?

Простой и понятный анализ. Lynis показывает текущие проблемы и предлагает их решения.
Гибкость. Подходит для серверов, десктопов и даже встроенных систем.
Автоматизация. Можно интегрировать в CI/CD для регулярного аудита.


BashTex 📱 #linux #security
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11
Продвинутое копирование файлов и каталогов с исключениями

Копирование - одна из самых базовых задач в Linux. Однако, если вам нужно исключить определённые файлы или каталоги при копировании, стандартная команда cp требует небольшой хитрости. Разберём, как это сделать и при чём здесь rsync.

Когда и зачем исключать файлы?

Чтобы пропустить временные файлы (*.tmp, *.swp).
Чтобы избежать копирования тяжёлых или ненужных данных.
Для создания точных копий без избыточной информации.


Исключения с помощью cp и find. Хотя cp сам по себе не поддерживает флаг исключений, можно комбинировать его с другими командами, такими как find.

Пример: исключение файлов *.log:


find source_dir -type f ! -name '*.log' -exec cp --parents {} target_dir \;


Разбор:

find source_dir - ищет файлы в директории.
! -name '*.log' - исключает файлы с расширением .log.
-exec cp --parents {} - копирует файлы с сохранением структуры каталогов.

Использование rsync для исключений. Для более гибкого копирования предпочтительнее использовать rsync, так как он поддерживает исключения через опцию --exclude.

Пример: исключение определённой папки и файлов


rsync -av --exclude 'temp/' --exclude '*.log' source_dir/ target_dir/


Разбор:

-a - архивный режим (сохраняет права, ссылки, структуру).
-v - выводит процесс копирования.
--exclude - исключает указанную папку или файлы.

Вывод команды:


sending incremental file list
./
file1.txt
file2.txt

sent 125 bytes received 40 bytes 330.00 bytes/sec
total size is 245 speedup is 1.41


Исключение на уровне шаблонов. Если нужно исключить файлы по сложному шаблону, используйте файл исключений.

Пример: исключение через файл шаблонов
Создайте файл exclude.txt:


*.log
temp/
backup/


Выполните команду:


rsync -av --exclude-from='exclude.txt' source_dir/ target_dir/


Копирование больших данных с исключениями. Если копируете большие объёмы данных, используйте rsync вместо cp, так как он эффективнее обрабатывает большие деревья файлов и поддерживает докопирование (resume).

Докопирование файлов после прерывания:


rsync -av --exclude '*.tmp' source_dir/ target_dir/


Хотя cp - базовый инструмент, его возможности можно расширить комбинацией с find для сложных задач. Для регулярной работы с исключениями rsync остаётся лидером.

BashTex 📱 #linux #utils
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10
Как защитить ключи SSH с помощью ssh-agent

SSH-ключи - это один из наиболее безопасных способов аутентификации в Linux-системах. Но при частом использовании ключей возникает риск компрометации, особенно если хранить их в незашифрованном виде или вводить пароль каждый раз. Здесь на помощь приходит ssh-agent, который позволяет безопасно управлять ключами и упрощает доступ к серверам.

ssh-agent - это демон, который управляет вашими SSH-ключами в памяти. Он:

Хранит расшифрованные ключи во временном хранилище.
Позволяет подключаться к серверам без повторного ввода пароля.
Устраняет необходимость прямого хранения ключей на диске в незашифрованном виде.


Настройка ssh-agent

1. Запуск ssh-agent. Перед началом работы убедитесь, что ssh-agent запущен:


eval "$(ssh-agent -s)"


Вывод команды:


Agent pid 12345


2. Добавление ключей в ssh-agent. Чтобы добавить ваш приватный ключ:


ssh-add ~/.ssh/id_rsa


Если ключ защищён паролем, вам потребуется ввести его один раз. После этого ключ останется активным в памяти до завершения сессии или перезагрузки.

Просмотр добавленных ключей. Чтобы проверить, какие ключи сейчас управляются агентом:


ssh-add -l


Вывод:


2048 SHA256:abc12345... user@host (RSA)


Удаление ключей из ssh-agent. Чтобы удалить все ключи из агента:


ssh-add -D


Или конкретный ключ:


ssh-add -d ~/.ssh/id_rsa


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


ssh-add -t 3600 ~/.ssh/id_rsa


Здесь 3600 - это время жизни ключа в секундах (1 час).

Автоматизация сессий. Для упрощения работы можно настроить автоматический запуск ssh-agent.

Пример для Bash. Добавьте в файл ~/.bashrc:


if ! pgrep -u "$USER" ssh-agent > /dev/null; then
eval "$(ssh-agent -s)"
fi


Практическое применение. Удобный доступ к удалённым серверам

С запущенным ssh-agent вы можете подключаться к удалённым серверам, не вводя пароль:


ssh user@server


Работа с Git-репозиториями. ssh-agent упрощает работу с приватными Git-репозиториями:


git pull
git push


Советы по безопасности

👍 Шифруйте приватные ключи. Даже с использованием ssh-agent храните ключи в зашифрованном виде.
❗️ Не оставляйте агента активным на публичных машинах. Завершайте сессию с ssh-agent, чтобы предотвратить доступ к памяти.
❗️ Используйте ForwardAgent с осторожностью. Если необходимо перенаправить агент на другой сервер, добавьте в ~/.ssh/config:


Host remote-server
ForwardAgent yes


BashTex 📱 #linux #security
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10
🎅 Новый год: Распакуем 2025 и архивируем 2024!

Вот и подходит к концу наш "рабочий процесс" под названием 2024. Пора сделать tar старого года, чтобы освободить место для нового!


tar -cvf 2024.tar.gz ~/воспоминания/2024
gzip 2024.tar.gz


Теперь мы с уверенностью можем разархивировать 2025:


gunzip -c 2025.tar.gz | tar -xvf -


Что внутри?

🔔 Новые вызовы
🥮 Достижения
📩 Уроки, которые сделают нас сильнее

Пусть ваш 2025 год будет сжат по проблемам и распакован по успехам!
Давайте сохраним только лучшие "файлы" прошлого года, а всё лишнее - rm -rf.

Встретим 2025 с chmod +x на наши мечты! 🎄
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥64👍2🎄2🫡1
Спасибо, именно этого я и ожидал
😁12🔥1🗿1
Повышение надёжности crontab с помощью встроенного логгинга и уведомлений

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

Почему это важно?

Прозрачность: Логирование позволяет отслеживать, что выполняется, и выявлять ошибки.
Своевременность: Уведомления предупреждают о проблемах без необходимости проверки вручную.
Контроль: Вы уверены, что задачи выполняются по расписанию.


Логгирование задач в crontab

Базовый способ: перенаправление вывода. Вывод команды можно перенаправить в файл для последующего анализа:


* * * * * /path/to/command >> /var/log/cron.log 2>&1


>> /var/log/cron.log - записывает стандартный вывод (stdout) в лог-файл.
2>&1 - перенаправляет ошибки (stderr) туда же.

Разделение stdout и stderr. Иногда нужно отдельно анализировать стандартный вывод и ошибки:


* * * * * /path/to/command > /var/log/cron_output.log 2> /var/log/cron_error.log


Уведомления об ошибках

1. Использование переменной MAILTO. Добавьте в crontab строку:


MAILTO="your_email@bashtex"


Теперь весь вывод задач (stdout и stderr) будет отправляться на указанный адрес.

❗️ Примечание: Для этого должен быть настроен почтовый агент, например, Postfix или ssmtp.

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


* * * * * /path/to/command || echo "Error in cron task" | mail -s "Cron Error" your_email@bashtex.com


|| - выполняет команду справа, если слева была ошибка.
mail - отправляет письмо с уведомлением.

Дополнительные советы для повышения надёжности

1. Проверка состояния crontab. Вывод всех задач и возможных ошибок можно проверить командой:


grep CRON /var/log/syslog


2. Логгирование времени выполнения. Для задач с длительным выполнением полезно записывать, сколько времени они занимают:


* * * * * /usr/bin/time -o /var/log/task_time.log -a /path/to/command


-o /var/log/task_time.log - записывает время в файл.
-a - добавляет данные в конец файла.

3. Уведомления в Telegram. С помощью утилиты curl можно отправлять уведомления в Telegram:


* * * * * /path/to/command || curl -s -X POST https://api.telegram.org/bot<TOKEN>/sendMessage -d chat_id=<CHAT_ID> -d text="Error in cron task"


---

Безопасность и удобство

Логи для каждого задания. Для разделения логов создайте директорию /var/log/cron_tasks и используйте её:


* * * * * /path/to/command >> /var/log/cron_tasks/task1.log 2>&1


Используйте скрипты-обёртки. Для сложных задач создайте скрипт с проверкой выполнения:


#!/bin/bash
LOG_FILE="/var/log/cron_tasks/task.log"
ERROR_FILE="/var/log/cron_tasks/task_error.log"

{
echo "Task started: $(date)"
/path/to/command
echo "Task completed: $(date)"
} >> "$LOG_FILE" 2>> "$ERROR_FILE" || mail -s "Task Failed" your_email@example.com < "$ERROR_FILE"


Запустите его через crontab:


* * * * * /path/to/noscript.sh


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

BashTex 📱 #linux #security
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14
Шифрование файлов с помощью GPG: просто и эффективно

Когда возникает необходимость защитить конфиденциальные данные, gpg становится вашим надёжным инструментом. Он позволяет шифровать файлы, расшифровывать их и даже добавлять цифровые подписи для проверки подлинности.

Установка GPG

На большинстве систем Linux gpg уже установлен. Если его нет, добавьте его с помощью:


sudo apt install gnupg # Для систем на базе Debian/Ubuntu
sudo yum install gnupg # Для CentOS/RHEL


Шифрование файла: базовый пример. Чтобы зашифровать файл, выполните:


gpg -c secret.txt


-c указывает использовать симметричное шифрование.

Вас попросят ввести пароль, который будет использоваться для шифрования. После выполнения команды появится файл secret.txt.gpg.

Расшифровка файла. Чтобы вернуть исходный файл:


gpg -d secret.txt.gpg > secret.txt


Вас попросят ввести пароль, использованный при шифровании.

Шифрование с использованием публичного ключа

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

1. Создайте пару ключей


gpg --full-generate-key


Выберите тип ключа, срок действия и задайте пароль.

2. Экспортируйте публичный ключ. Поделитесь своим публичным ключом с другим человеком:


gpg --export -a "Your Name" > public.key


3. Зашифруйте файл с публичным ключом. Используйте публичный ключ получателя:


gpg --encrypt --recipient "Recipient Name" secret.txt


Это создаст файл secret.txt.gpg.

4. Расшифровка полученного файла. Получатель может расшифровать файл с помощью своей пары ключей:


gpg --decrypt secret.txt.gpg > secret.txt


Автоматизация процесса

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


echo "mysecretpassphrase" > passphrase.txt


Укажите его при выполнении команды:


gpg --batch --yes --passphrase-file passphrase.txt -c secret.txt


❗️ Убедитесь, что файл с паролем защищён:


chmod 600 passphrase.txt


Применение GPG в реальной жизни

Резервное копирование: Защитите архивы перед загрузкой в облако.


tar -czf - mydata | gpg -c -o mydata.tar.gz.gpg


Обмен файлами: Убедитесь, что ваши данные безопасно передаются.
Цифровая подпись: Подтвердите подлинность своих файлов.


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

BashTex 📱 #linux #security
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16
Но есть нюанс
😁13
Управление большими текстовыми файлами с помощью sed

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


sed 's/старый/новый/g' bigfile.txt


s/старый/новый/g - заменяет все вхождения слова "старый" на "новый" в каждом строке файла.

Удаление строк по условию. Удалим все строки, содержащие слово "ошибка":


sed '/ошибка/d' bigfile.txt


/ошибка/d - удаляет строки с упоминанием слова "ошибка".

Извлечение строк. Извлечём строки с 10 по 20:


sed -n '10,20p' bigfile.txt


-n отключает автоматический вывод, а 10,20p выводит строки с 10 по 20.

Обработка больших файлов. sed обрабатывает файлы построчно, что делает его идеальным для работы с огромными текстовыми данными.

Пример: Удаление пустых строк.
Если нужно очистить файл от пустых строк:


sed '/^$/d' bigfile.txt > cleaned.txt


/^$/d - удаляет строки, содержащие только перенос строки.

Пример: Добавление текста в начало файла
Добавим текст "Заголовок" в начало большого файла:


sed -i '1i Заголовок' bigfile.txt


1i — вставляет текст перед первой строкой.

Автоматизация с sed. sed отлично подходит для автоматизации задач в скриптах. Например, регулярная замена в логах или данных:


#!/bin/bash
for file in /logs/*.log; do
sed -i 's/DEBUG/INFO/g' "$file"
done


Этот скрипт обновит все лог-файлы, заменив уровень логирования DEBUG на INFO.

Советы по оптимизации

Используйте -i для редактирования файла на месте (встроенное изменение).
При работе с огромными файлами добавьте -e для объединения нескольких команд sed в один проход.


BashTex 📱 #linux #utils
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13
Тонкости использования iptables для фильтрации трафика

iptables - это инструмент для управления сетевой безопасностью в Linux. Он позволяет фильтровать входящий, исходящий и проходящий трафик, обеспечивая гибкость и контроль над сетью. Разберём несколько ключевых моментов и тонкостей его использования.

Основные цепочки iptables

INPUT — фильтрует входящий трафик.
FORWARD — фильтрует трафик, проходящий через сервер.
OUTPUT — фильтрует исходящий трафик.


Примеры использования

1. Блокировка IP-адреса. Чтобы заблокировать доступ с конкретного IP-адреса:


iptables -A INPUT -s 192.168.1.100 -j DROP


-A INPUT - добавляем правило в цепочку INPUT.
-s - указывает источник (source).
-j DROP - блокирует трафик.

2. Разрешение доступа по порту. Разрешить входящий трафик на порт 22 (SSH):


iptables -A INPUT -p tcp --dport 22 -j ACCEPT


-p tcp - указывает, что правило применимо к протоколу TCP.
--dport 22 - указывает порт назначения.

3. Ограничение количества подключений. Ограничение количества новых подключений с одного IP-адреса:


iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 10 -j REJECT


-m connlimit - модуль для ограничения количества соединений.
--connlimit-above 10 - ограничивает до 10 соединений с одного IP.

❗️ Тонкости и советы

1. Логирование заблокированного трафика. Для диагностики полезно логировать заблокированные пакеты:


iptables -A INPUT -j LOG --log-prefix "IPTables-Dropped: "


--log-prefix добавляет префикс к каждому сообщению журнала.

2. Сохранение правил. После настройки важно сохранить правила, чтобы они не сбросились после перезагрузки:


iptables-save > /etc/iptables/rules.v4


iptables-save сохраняет текущие правила в файл.

3. Использование пользовательских цепочек. Создание пользовательской цепочки для упрощения управления правилами:


iptables -N my_custom_chain
iptables -A INPUT -j my_custom_chain
iptables -A my_custom_chain -s 192.168.1.100 -j DROP


-N создаёт новую цепочку. Это позволяет централизовать управление специфическими правилами.

Динамическое изменение правил

Для обеспечения гибкости iptables позволяет добавлять и удалять правила на лету. Например, временное блокирование IP:


iptables -I INPUT -s 192.168.1.101 -j DROP
sleep 300
iptables -D INPUT -s 192.168.1.101 -j DROP


Этот скрипт блокирует IP на 5 минут.

---

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

BashTex 📱 #linux #networks
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16👨‍💻1
jq для обработки JSON: базовые и продвинутые примеры

jq - это легковесный и гибкий инструмент командной строки для обработки и анализа JSON. Если вам нужно вытаскивать данные, фильтровать или преобразовывать JSON-файлы, jq станет незаменимым помощником. Давайте рассмотрим базовые и продвинутые примеры его использования.

1. Чтение и форматирование JSON. Вывести JSON с красивым форматированием:


echo '{"name": "Alice", "age": 30, "city": "Paris"}' | jq .


. - это самый простой фильтр, который просто выводит входной JSON.

2. Извлечение конкретного значения. Извлечь значение поля name:


echo '{"name": "Alice", "age": 30}' | jq '.name'


Вывод:

"Alice"


3. Фильтрация массива. Вывести имена из массива объектов:


echo '[{"name": "Alice"}, {"name": "Bob"}]' | jq '.[].name'


Вывод:

"Alice"
"Bob"


Продвинутые примеры

1. Условная фильтрация. Отфильтруем объекты, где age больше 25:


echo '[{"name": "Alice", "age": 30}, {"name": "Bob", "age": 20}]' | jq '.[] | select(.age > 25)'


Результат:

{"name": "Alice", "age": 30}


2. Преобразование структуры данных. Изменим структуру JSON, преобразовав ключи в массив:


echo '{"name": "Alice", "age": 30}' | jq 'to_entries | map({(.key): .value})'


Результат:

[{"name":"Alice"}, {"age":30}]


3. Группировка данных. Группировка массива по определённому полю:


echo '[{"name": "Alice", "group": "admin"}, {"name": "Bob", "group": "user"}, {"name": "Charlie", "group": "admin"}]' | jq 'group_by(.group) | map({group: .[0].group, members: .})'


Результат:

[{"group":"admin","members":[{"name":"Alice","group":"admin"},{"name":"Charlie","group":"admin"}]}, {"group":"user","members":[{"name":"Bob","group":"user"}]}]


Объединение данных

1. Объединение JSON из двух файлов. Объединим данные из file1.json и file2.json:


jq -s '.[0] * .[1]' file1.json file2.json


-s читает все входные файлы в массив.
* объединяет два JSON-объекта.

👍 Полезные советы

Используйте jq с curl для обработки данных из API:


curl -s https://api.example.com/data | jq '.items[] | {name: .name, id: .id}'


Фильтруйте сложные JSON-файлы:


jq '.store.book[] | select(.price < 10)' books.json


Это выведет все книги с ценой меньше 10.

---

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

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