backup.sh 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. #!/bin/bash
  2. # Проверка аргументов
  3. if [ "$#" -ne 5 ]; then
  4. echo "Использование: $0 <NAS_IP_OR_HOSTNAME> <NAS_USER> <NAS_PASSWORD> <BACKUP_LIST_FILE> <EXCLUDE_LIST_FILE>"
  5. exit 1
  6. fi
  7. NAS_ADDR="$1"
  8. REMOTE_USER="$2"
  9. NAS_PASS="$3"
  10. BACKUP_LIST_FILE="$4" # Файл со списком папок для бэкапа
  11. EXCLUDE_LIST_FILE="$5" # Файл с исключениями
  12. REMOTE_BASE_DIR="NetBackup/$(hostname)" # Базовая папка на NAS (с именем текущего ПК)
  13. # Проверка доступности NAS в локальной сети
  14. if ! ping -c 1 -W 2 "$NAS_ADDR" &> /dev/null; then
  15. echo "Ошибка: NAS ($NAS_ADDR) недоступен. Возможно, вы не в локальной сети." >&2
  16. exit 1
  17. fi
  18. if ! rsync "$NAS_ADDR::" &>/dev/null; then
  19. echo "Устройство не является rsync-сервером" >&2
  20. exit 1
  21. fi
  22. # Проверка наличия файла со списком папок
  23. if [ ! -f "$BACKUP_LIST_FILE" ]; then
  24. echo "Файл '$BACKUP_LIST_FILE' не найден!"
  25. exit 1
  26. fi
  27. # Проверка файла исключений (если есть)
  28. RSYNC_EXCLUDE=""
  29. if [ -f "$EXCLUDE_LIST_FILE" ]; then
  30. RSYNC_EXCLUDE="--exclude-from=$EXCLUDE_LIST_FILE"
  31. echo "Используются исключения из '$EXCLUDE_LIST_FILE'"
  32. else
  33. echo "Файл исключений '$EXCLUDE_LIST_FILE' не найден, копируем всё."
  34. fi
  35. # Чтение списка папок для бэкапа
  36. while IFS= read -r folder; do
  37. # Пропускаем пустые строки и комментарии (начинающиеся с #)
  38. if [[ -z "$folder" || "$folder" == \#* ]]; then
  39. continue
  40. fi
  41. folder="${folder/#\~/$HOME}"
  42. # Проверка наличия файла
  43. if [ ! -f "$BACKUP_LIST_FILE" ]; then
  44. echo "Файл '$BACKUP_LIST_FILE' не найден!" >&2
  45. exit 1
  46. fi
  47. echo "Синхронизация '$folder' на NAS..."
  48. # Формируем путь на удалённом сервере
  49. remote_path="$REMOTE_USER@$NAS_ADDR::$REMOTE_BASE_DIR"
  50. # Выполняем rsync с SSH-паролем (используем sshpass для автоматизации)
  51. if ! command -v sshpass &> /dev/null; then
  52. echo "Установите 'sshpass' для автоматической передачи пароля (sudo apt install sshpass)"
  53. exit 1
  54. fi
  55. sshpass -p "$NAS_PASS" rsync -avz --relative $RSYNC_EXCLUDE "$folder" "$remote_path"
  56. if [ $? -eq 0 ]; then
  57. echo "Успешно: $folder"
  58. else
  59. echo "Ошибка при синхронизации: $folder"
  60. fi
  61. done < "$BACKUP_LIST_FILE"
  62. echo "Резервное копирование завершено."