Волшебная строчка, которую нужно добавить после `#!/bin/bash`, чтоб скрипт можно было отлаживать по шагам ```bash #!/bin/bash trap 'echo "# $BASH_COMMAND";read' DEBUG echo line1 echo line2 echo line3 ``` **Процесс отладки** Запускаем скрипт, перед выполнением каждой команды выводится то, что будет исполняться, затем интерпретатор начинает ожидать нажатия клавиши ``. Если понимаем, что что-то пошло не так, нажимаем 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. =================================