summaryrefslogtreecommitdiff
path: root/LINUX/PROGRAMS_bash.md
diff options
context:
space:
mode:
authorvlapa <vlapa@ya.ru>2026-06-13 20:33:26 +0300
committervlapa <vlapa@ya.ru>2026-06-13 20:33:26 +0300
commite5abc1fe99340b979b18864d978179f71fe8f5c5 (patch)
tree98fd0ad7c6d0744894d6e74e446daacd9e6dd1b5 /LINUX/PROGRAMS_bash.md
First
Diffstat (limited to 'LINUX/PROGRAMS_bash.md')
-rw-r--r--LINUX/PROGRAMS_bash.md311
1 files changed, 311 insertions, 0 deletions
diff --git a/LINUX/PROGRAMS_bash.md b/LINUX/PROGRAMS_bash.md
new file mode 100644
index 0000000..e406fbe
--- /dev/null
+++ b/LINUX/PROGRAMS_bash.md
@@ -0,0 +1,311 @@
+Волшебная строчка, которую нужно добавить после `#!/bin/bash`, чтоб скрипт можно было отлаживать по шагам
+```bash
+#!/bin/bash
+trap 'echo "# $BASH_COMMAND";read' DEBUG
+
+echo line1
+echo line2
+echo line3
+```
+
+**Процесс отладки**
+
+Запускаем скрипт, перед выполнением каждой команды выводится то, что будет исполняться, затем интерпретатор начинает ожидать нажатия клавиши `<ENTER>`.
+
+Если понимаем, что что-то пошло не так, нажимаем Ctrl+C и выходим из отладки.
+
+**Ингредиенты**
+
+команда trap, которая умеет перехватывать разные сигналы и в нашем случае она перехватывает сигнал DEBUG, посылаемый перед выполнением команды
+
+команда read, которая умеет ожидать ввода чего-нибудь с клавиатуры (в данном случае нам нужно только либо ENTER либо Ctrl+C
+
+переменная окружения ==`$BASH_COMMAND`==, валидная внутри обработчика команды trap.
+
+===============================================
+**Автоматическое выключение компьютера при низком заряде батареи**
+
+```bash
+#!/bin/bash
+
+# Порог заряда батареи в процентах
+THRESHOLD=15
+
+# Получение текущего заряда батареи
+BATTERY_LEVEL=$(acpi -b | grep -P -o '[0-9]+(?=%)')
+
+# Проверка уровня заряда и выключение, если ниже порога
+if [ "$BATTERY_LEVEL" -lt "$THRESHOLD" ]; then
+  echo "Низкий уровень заряда батареи: $BATTERY_LEVEL%. Выключение..."
+  shutdown -h now
+fi
+```
+ **Скрипт проверяет уровень заряда батареи и автоматически выключает компьютер, если заряд ниже указанного порога.**
+
+Особого внимания заслуживает использование команды acpi для получения уровня заряда батареи. Скрипт полезен для защиты ноутбуков от аварийного выключения при низком заряде.
+
+===============================================
+### Автоматическое обновление IP-адреса в DNS-записи ###
+```bash
+#!/bin/bash
+
+# Получение текущего внешнего IP-адреса
+CURRENT_IP=$(curl -s http://ifconfig.me)
+
+# Путь к файлу с последним IP-адресом
+IP_FILE="$HOME/current_ip.txt"
+
+# Чтение последнего сохраненного IP-адреса
+if [ -f "$IP_FILE" ]; then
+ LAST_IP=$(cat "$IP_FILE")
+else
+ LAST_IP=""
+fi
+
+# Если IP-адрес изменился, обновить DNS-запись
+if [ "$CURRENT_IP" != "$LAST_IP" ]; then
+ echo "IP изменился на $CURRENT_IP, обновление DNS..."
+
+ # Обновление DNS-записи (пример с использованием Cloudflare API)
+ curl -X PUT "https://api.cloudflare.com/client/v4/zones/your_zone_id/dns_records/your_record_id" \
+ -H "Authorization: Bearer your_api_token" \
+ -H "Content-Type: application/json" \
+ --data "{\"type\":\"A\",\"name\":\"yourdomain.com\",\"content\":\"$CURRENT_IP\",\"ttl\":120,\"proxied\":false}"
+
+ # Сохранение нового IP-адреса
+ echo "$CURRENT_IP" > "$IP_FILE"
+else
+ echo "IP не изменился, обновление не требуется."
+fi
+```
+**Скрипт автоматически проверяет, изменился ли внешний IP-адрес, и при изменении обновляет DNS-запись с использованием Cloudflare API.**
+
+Особого внимания заслуживает логика проверки текущего и предыдущего IP-адреса, что позволяет избежать ненужных запросов к DNS-серверу. В случае изменения IP-адреса, скрипт использует API Cloudflare для обновления DNS-записи. Такой скрипт полезен для пользователей с динамическим IP-адресом, которые хотят поддерживать актуальную DNS-запись для своего домена.
+
+===============================================
+### Автоматическое резервное копирование файлов с указанием даты ###
+```bash
+#!/bin/sh
+cp -r /path/to/source /path/to/backup/backup_$(date +%Y%m%d)
+```
+Скрипт создает резервную копию указанной директории, добавляя текущую дату в имя папки для каждой копии.
+
+===============================================
+### Работа с логами в Linux с помощью journalctl ###
+```bash
+# Вывод всех системных логов
+journalctl
+```
+выводит полный журнал событий системы. Вывод может содержать сообщения ядра, системные службы и другие системные события.
+
+```bash
+# Фильтрация логов по дате:
+# Чтобы отфильтровать логи по дате и времени, можно использовать параметры
+journalctl --since
+journalctl --until
+
+# Логи за определённый промежуток времени
+journalctl --since "2023-08-01 10:00:00" --until "2023-08-01 12:00:00"
+```
+С помощью этих параметров можно просматривать логи за конкретный период, что упрощает поиск информации о системных событиях, произошедших в определённое время.
+```bash
+# Логи службы nginx
+journalctl -u nginx
+```
+С помощью флага -u можно выводить логи, связанные с конкретной системой или службой, например, nginx. Это полезно для диагностики и устранения проблем, связанных с отдельными компонентами системы.
+```bash
+# Отслеживание логов в реальном времени:
+# Функция реального времени позволяет наблюдать за логами по мере их поступления в систему.
+
+journalctl -f
+```
+Команда ==`journalctl -f`== выводит логи в реальном времени, аналогично команде ==`tail -f`== для текстовых файлов. Это особенно полезно при мониторинге работы системы или приложений в режиме реального времени.
+
+Использование `journalctl` позволяет легко анализировать системные логи, отфильтровывать нужную информацию и отслеживать проблемы в работе системы или сервисов.
+
+================================================
+## Отчет о системной информации и отправка его по электронной почте ##
+```bash
+#!/bin/bash
+
+# Создание файла отчета
+report_file="$HOME/system_report.txt"
+
+# Запись заголовка в файл отчета
+echo "Отчет о системной информации - $(date)" > "$report_file"
+echo "========================================" >> "$report_file"
+
+# Системная информация
+echo -e "\nСистемная информация:" >> "$report_file"
+uname -a >> "$report_file"
+
+# Информация о загрузке системы
+echo -e "\nИнформация о загрузке системы:" >> "$report_file"
+uptime >> "$report_file"
+
+# Использование дискового пространства
+echo -e "\nИспользование дискового пространства:" >> "$report_file"
+df -h >> "$report_file"
+
+# Использование памяти
+echo -e "\nИспользование памяти:" >> "$report_file"
+free -h >> "$report_file"
+
+# Список работающих процессов
+echo -e "\nСписок работающих процессов:" >> "$report_file"
+ps aux --sort=-%mem | head -n 10 >> "$report_file"
+
+# Сетевые подключения
+echo -e "\nСетевые подключения:" >> "$report_file"
+ss -tuln >> "$report_file"
+
+# Отправка отчета по электронной почте
+recipient="user@example.com"
+mail -s "Отчет о системной информации" "$recipient" < "$report_file"
+
+echo "Отчет о системной информации создан и отправлен на $recipient"
+```
+Этот скрипт полезен для системных администраторов и может быть настроен для автоматического выполнения с помощью cron, чтобы регулярно получать отчеты о состоянии системы.
+
+=================================
+### Найдите все неработающие симлинки (символьные ссылки) в вашей системе с помощью команды: ###
+
+```bash
+find . -xtype l
+```
+=================================
+### Обновление и очистка системы ###
+```bash
+#!/bin/bash
+
+# Обновление списка пакетов и установка обновлений
+sudo apt-get update
+sudo apt-get upgrade -y
+
+# Автоматическое удаление ненужных пакетов и очистка кэша
+sudo apt-get autoremove -y
+sudo apt-get autoclean -y
+sudo apt-get clean
+
+# Вывод сообщения о завершении
+echo "Система обновлена и очищена."
+```
+=================================
+### Синхронизация директорий с помощью rsync ###
+```bash
+#!/bin/bash
+
+# Исходная и целевая директории
+source_directory="$HOME/source_directory"
+target_directory="$HOME/target_directory"
+
+# Лог-файл
+log_file="$HOME/rsync_log.txt"
+
+# Запуск синхронизации
+rsync -av --delete "$source_directory/" "$target_directory/" >> "$log_file" 2>&1
+
+# Проверка результата синхронизации
+if [ $? -eq 0 ]; then
+ echo "Синхронизация завершена успешно: $(date)" >> "$log_file"
+else
+ echo "Ошибка синхронизации: $(date)" >> "$log_file"
+fi
+
+echo "Синхронизация завершена. Подробности в лог-файле $log_file"
+```
+Скрипт синхронизирует содержимое исходной директории с целевой директорией, создавая резервную копию и записывая результаты в лог-файл.
+
+=================================
+### Функция для создания резервной копии ###
+```bash
+#!/bin/bash
+
+# Путь к отслеживаемому каталогу
+WATCHED_DIR="/path/to/watched/directory"
+
+# Путь для сохранения резервных копий
+BACKUP_DIR="/path/to/backup/directory"
+
+# Функция для создания резервной копии
+backup() {
+ TIMESTAMP=$(date +%Y%m%d_%H%M%S)
+ tar -czf "$BACKUP_DIR/backup_$TIMESTAMP.tar.gz" -C "$WATCHED_DIR" .
+ echo "Backup created at $BACKUP_DIR/backup_$TIMESTAMP.tar.gz"
+}
+
+# Использование inotifywait для мониторинга изменений в каталоге
+inotifywait -m -r -e modify -e move -e create -e delete "$WATCHED_DIR" --format '%T %w %f %e' --timefmt '%Y-%m-%d %H:%M:%S' |
+while read date time dir file event
+do
+ echo "Detected $event on $file at $date $time"
+ backup
+done
+```
+=================================
+### Создание резервной копии базы данных ###
+```bash
+#!/bin/bash
+
+# Параметры базы данных
+db_name="mydatabase"
+db_user="myuser"
+db_password="mypassword"
+backup_dir="$HOME/db_backups"
+backup_file="$backup_dir/${db_name}_$(date +%Y%m%d%H%M%S).sql"
+
+# Создание каталога для резервных копий, если он не существует
+mkdir -p "$backup_dir"
+
+# Создание резервной копии базы данных
+mysqldump -u "$db_user" -p"$db_password" "$db_name" > "$backup_file"
+
+# Проверка результата резервного копирования
+if [ $? -eq 0 ]; then
+ echo "Резервное копирование базы данных завершено успешно: $(date)" >> "$backup_dir/backup_log.txt"
+else
+ echo "Ошибка резервного копирования базы данных: $(date)" >> "$backup_dir/backup_log.txt"
+fi
+
+echo "Резервная копия базы данных создана: $backup_file"
+```
+=================================
+### Создание резервной копии базы данных 2 ###
+```bash
+#!/bin/bash
+# Установите желаемую длину пароля
+password_length=12
+# Генерация пароля
+password=$(tr -dc 'A-Za-z0-9_!@#$%^&*' < /dev/urandom | head -c $password_length)
+------
+echo "Сгенерированный пароль: $password
+------
+#!/bin/bash
+# Настройки для подключения к базе данных
+DB_USER="yourusername"
+DB_PASSWORD="yourpassword"
+DB_NAME="yourdbname"
+BACKUP_PATH="/path/to/your/backup/directory"
+DATE=$(date +%Y%m%d%H%M)
+
+# Создание дампа базы данных
+mysqldump -u $DB_USER -p$DB_PASSWORD $DB_NAME > $BACKUP_PATH/${DB_NAME}_$DATE.sql
+
+# Опционально: удаление старых резервных копий старше 30 дней
+find $BACKUP_PATH -name "*.sql" -type f -mtime +30 -exec rm {} \;
+
+echo "✔️ Резервная копия базы данных $DB_NAME создана успешно."
+```
+Скрипт создает резервную копию указанной MySQL базы данных и сохраняет её в заданный каталог с меткой текущей даты и времени в имени файла.
+
+=================================
+### Архив tar.gz текущего каталога ###
+```bash
+#!/bin/sh
+tar -czf "../${PWD##*/}.tar.gz" .
+```
+Скрипт создает архив tar.gz текущего каталога.
+
+Особого внимания здесь заслуживает конструкция ==`${PWD##*/}`==, которая берет полный путь до текущего каталога (переменная $PWD) и удаляет из него первую часть вплоть до последнего слеша, оставляя, таким образом, только имя самого каталога. Далее к нему добавляется расширение tar.gz.
+
+=================================