diff options
| author | vlapa <vlapa@ya.ru> | 2026-06-13 20:33:26 +0300 |
|---|---|---|
| committer | vlapa <vlapa@ya.ru> | 2026-06-13 20:33:26 +0300 |
| commit | e5abc1fe99340b979b18864d978179f71fe8f5c5 (patch) | |
| tree | 98fd0ad7c6d0744894d6e74e446daacd9e6dd1b5 /LINUX/PROGRAMS_bash.md | |
First
Diffstat (limited to 'LINUX/PROGRAMS_bash.md')
| -rw-r--r-- | LINUX/PROGRAMS_bash.md | 311 |
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. + +================================= |
