backup.sh 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  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. echo "*** Резервное копирование начинается. ***"
  28. # Проверка файла исключений (если есть)
  29. RSYNC_EXCLUDE=""
  30. if [ -f "$EXCLUDE_LIST_FILE" ]; then
  31. RSYNC_EXCLUDE="--exclude-from=$EXCLUDE_LIST_FILE"
  32. echo "Используются исключения из '$EXCLUDE_LIST_FILE'"
  33. else
  34. echo "Файл исключений '$EXCLUDE_LIST_FILE' не найден, копируем всё."
  35. fi
  36. # Чтение списка папок для бэкапа
  37. while IFS= read -r folder; do
  38. # Пропускаем пустые строки и комментарии (начинающиеся с #)
  39. if [[ -z "$folder" || "$folder" == \#* ]]; then
  40. continue
  41. fi
  42. folder="${folder/#\~/$HOME}"
  43. # Проверка наличия файла
  44. if [ ! -f "$BACKUP_LIST_FILE" ]; then
  45. echo "Файл '$BACKUP_LIST_FILE' не найден!" >&2
  46. exit 1
  47. fi
  48. echo "Синхронизация '$folder' на NAS..."
  49. # Формируем путь на удалённом сервере
  50. remote_path="$REMOTE_USER@$NAS_ADDR::$REMOTE_BASE_DIR"
  51. # Выполняем rsync с SSH-паролем (используем sshpass для автоматизации)
  52. if ! command -v sshpass &> /dev/null; then
  53. echo "Установите 'sshpass' для автоматической передачи пароля (sudo apt install sshpass)"
  54. exit 1
  55. fi
  56. sshpass -p "$NAS_PASS" rsync -az --relative $RSYNC_EXCLUDE "$folder" "$remote_path"
  57. if [ $? -eq 0 ]; then
  58. echo "Успешно: $folder"
  59. else
  60. echo "Ошибка при синхронизации: $folder"
  61. fi
  62. done < "$BACKUP_LIST_FILE"
  63. echo "*** Резервное копирование завершено. ***"