#!/bin/bash # Проверка аргументов if [ "$#" -ne 5 ]; then echo "Использование: $0 " exit 1 fi NAS_ADDR="$1" REMOTE_USER="$2" NAS_PASS="$3" BACKUP_LIST_FILE="$4" # Файл со списком папок для бэкапа EXCLUDE_LIST_FILE="$5" # Файл с исключениями REMOTE_BASE_DIR="NetBackup/$(hostname)" # Базовая папка на NAS (с именем текущего ПК) # Проверка доступности NAS в локальной сети if ! ping -c 1 -W 2 "$NAS_ADDR" &> /dev/null; then echo "Ошибка: NAS ($NAS_ADDR) недоступен. Возможно, вы не в локальной сети." >&2 exit 1 fi if ! rsync "$NAS_ADDR::" &>/dev/null; then echo "Устройство не является rsync-сервером" >&2 exit 1 fi # Проверка наличия файла со списком папок if [ ! -f "$BACKUP_LIST_FILE" ]; then echo "Файл '$BACKUP_LIST_FILE' не найден!" exit 1 fi # Проверка файла исключений (если есть) RSYNC_EXCLUDE="" if [ -f "$EXCLUDE_LIST_FILE" ]; then RSYNC_EXCLUDE="--exclude-from=$EXCLUDE_LIST_FILE" echo "Используются исключения из '$EXCLUDE_LIST_FILE'" else echo "Файл исключений '$EXCLUDE_LIST_FILE' не найден, копируем всё." fi # Чтение списка папок для бэкапа while IFS= read -r folder; do # Пропускаем пустые строки и комментарии (начинающиеся с #) if [[ -z "$folder" || "$folder" == \#* ]]; then continue fi folder="${folder/#\~/$HOME}" # Проверка наличия файла if [ ! -f "$BACKUP_LIST_FILE" ]; then echo "Файл '$BACKUP_LIST_FILE' не найден!" >&2 exit 1 fi echo "Синхронизация '$folder' на NAS..." # Формируем путь на удалённом сервере remote_path="$REMOTE_USER@$NAS_ADDR::$REMOTE_BASE_DIR" # Выполняем rsync с SSH-паролем (используем sshpass для автоматизации) if ! command -v sshpass &> /dev/null; then echo "Установите 'sshpass' для автоматической передачи пароля (sudo apt install sshpass)" exit 1 fi sshpass -p "$NAS_PASS" rsync -avz --relative $RSYNC_EXCLUDE "$folder" "$remote_path" if [ $? -eq 0 ]; then echo "Успешно: $folder" else echo "Ошибка при синхронизации: $folder" fi done < "$BACKUP_LIST_FILE" echo "Резервное копирование завершено."