Форум русскоязычного сообщества Ubuntu


Автор Тема: Простенький бэкап скрипт для тех, у кого нет BTRFS.  (Прочитано 732 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн AnrDaemon

  • Автор темы
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 26520
    • Просмотр профиля
http://anr-daemon.livejournal.com/26573.html
Код: Bash
  1. #!/bin/sh
  2.  
  3. # Edit these two lines.
  4. # Create the base directory for backups.
  5. _BACKUP="/home/.backup/$(date +%F)"
  6. # Quote section names with special characters.
  7. _SHARES='netlogon work "1S bases"'
  8.  
  9. test -d "$_BACKUP" && exit 0
  10.  
  11. do_backup()
  12. {
  13.   test -f "$1" && {
  14.       echo "The '$1' already exists." >&2
  15.       return 0
  16.     }
  17.   tar -C / -caf "$1" \
  18.     --transform="s#^${2#/}#${3}#x" \
  19.     -- "${2#/}"
  20. }
  21.  
  22. mkdir "$_BACKUP" || {
  23.     echo "Can't create backup directory '$_BACKUP', aborting." >&2
  24.     exit 1
  25.   }
  26.  
  27. getent passwd | grep -ivE "^(root|admin(istrator)?)\>" | while IFS=: read -r _u _ _ _ _ _h _; do
  28.   test "${_h#/home}" = "${_h}" && continue
  29.   _h="$(readlink -fe "$_h")"
  30.  
  31.   test "${_h#/}" || continue
  32.   test -d "$_h" || continue
  33.  
  34.   _name="$_u$(date +"-%F")"
  35.   _file="$_BACKUP/$_name.tar.gz"
  36.  
  37.   do_backup "$_file" "${_h}" "$_name"
  38. done
  39.  
  40. # Pack the shares
  41. eval printf '%s\\n' $_SHARES | while read -r _s; do
  42.   _h="$(readlink -fe "$(testparm --section-name "$_s" --parameter-name path -s)")" 2> /dev/null
  43.  test "${_h#/}" || continue
  44.  
  45.  test -d "$_h" || {
  46.      echo "Unable to find the path for section '$_s'." >&2
  47.      continue
  48.    }
  49.  
  50.  _name="$_s$(date +"-%F")"
  51.  _file="$_BACKUP/s-$_name.tar.gz"
  52.  
  53.  do_backup "$_file" "${_h}" "$_name"
  54. done

Вроде нигде не накосячил. Если у кого есть замечания - велкам.
Хотите получить помощь? Потрудитесь представить запрошенную информацию в полном объёме.

Прежде чем [Отправить], нажми [Просмотр] и прочти собственное сообщение. Сам-то понял, что написал?…

toZen

  • Гость
AnrDaemon, спасибо.
Периодически почитываю Ваш ЖЖ.
Весьма много полезностей.

Оффлайн ALiEN175

  • Старожил
  • *
  • Сообщений: 2900
  • SimbaLeo
    • Просмотр профиля
AnrDaemon, спасибо, не знал что у вас есть блог. Пробежался, подсмотрел много интересного =)
ASUS M5A78L-M LX3 :: AMD FX-4330 :: 16 GB RAM :: AMD Radeon R7 260X :: ZSH
SAMSUNG N150 :: Intel Atom N450 :: 2 GB RAM :: Intel GMA 3150 :: ZSH

Оффлайн gamayun

  • Активист
  • *
  • Сообщений: 823
  • Кто ищет, тот найдёт, может быть...
    • Просмотр профиля
Спасибо.Добавил в закладочки.
Не бери в голову

Оффлайн Azure

  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 5817
  • elementaryOS 0.4 Loki, i3wm on Debian9
    • Просмотр профиля
Код: Bash
  1. getent passwd | cut -d: -f1,6 | grep -ivwE "^(root|admin(istrator)?)"
или
Код: Bash
  1. getent passwd | sed -r '/^(root|admin(istrator)?)\b/d;s/:[^:]*$//;s/:.*:/\t/'
Но это так, лучшее враг хорошего. А вот такой "наворот"
Цитировать
eval printf '%s\\n' $_SHARES | while read -r _s
не совсем понял. Зачем так сложно?
Код: Bash
  1. _SHARES=(netlogon work "1S bases")
  2. for _s in "${_SHARES[@]}"
« Последнее редактирование: 12 Август 2016, 12:49:59 от Azure »
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн AnrDaemon

  • Автор темы
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 26520
    • Просмотр профиля
Код: Bash
  1. getent passwd | cut -d: -f1,6 | grep -ivwE "^(root|admin(istrator)?)"
или
Код: Bash
  1. getent passwd | sed -r '/^(root|admin(istrator)?)\b/d;s/:[^:]*$//;s/:.*:/\t/'
Но это так, лучшее враг хорошего.
А вы не обратили внимание, что я делаю всё то же самое? :) Но без cut. И без sed.
read сам вполне справляется с этой задачей.
Цитировать
А вот такой "наворот"
Цитировать
eval printf '%s\\n' $_SHARES | while read -r _s
не совсем понял. Зачем так сложно?
Код: Bash
  1. _SHARES=(netlogon work "1S bases")
  2. for _s in "${_SHARES[@]}"
Затем, что это не bash.
В стандарте POSIX нет массивов.
Хотите получить помощь? Потрудитесь представить запрошенную информацию в полном объёме.

Прежде чем [Отправить], нажми [Просмотр] и прочти собственное сообщение. Сам-то понял, что написал?…

Оффлайн Tear

  • Старожил
  • *
  • Сообщений: 1291
  • Ubuntu 16.04 LTS
    • Просмотр профиля
Если есть желание, то можно, но нинужно. На btrfs свет клином не сошёлся, для бэкапа есть готовые решения с возможностью инкрементного копирования.

Оффлайн AnrDaemon

  • Автор темы
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 26520
    • Просмотр профиля
Для всего есть готовые решения. Что делать, если функциональность этих решений не устраивает?
Что делать, если надо отвлечься от целой ночи, убитой на попытки поднять AD на стоковой самбе, и наконец понять, что это в принципе невозможно?
Хотите получить помощь? Потрудитесь представить запрошенную информацию в полном объёме.

Прежде чем [Отправить], нажми [Просмотр] и прочти собственное сообщение. Сам-то понял, что написал?…

Оффлайн Tear

  • Старожил
  • *
  • Сообщений: 1291
  • Ubuntu 16.04 LTS
    • Просмотр профиля
Что делать, если надо отвлечься от целой ночи, убитой на попытки поднять AD на стоковой самбе, и наконец понять, что это в принципе невозможно?
Не упарываться, а использовать тот продукт, который отвечает требованиям. В серьёзном продакшене так и делают, это очевидно.
Для всего есть готовые решения. Что делать, если функциональность этих решений не устраивает?
И для какого применения используется Ваш скипт? Для домашнего юзера проще и понятнее будет даже DejaDup. А в серьёзном продакшене такие шкрипты не используются вообще. Это так, джастфорфанство. В принципе, почему бы и нет, если очень хочется.

Оффлайн alsoijw

  • Старожил
  • *
  • Сообщений: 4073
  • Fedora 25 GNOME 3 amd64
    • Просмотр профиля
И для какого применения используется Ваш скипт? Для домашнего юзера проще и понятнее будет даже DejaDup. А в серьёзном продакшене такие шкрипты не используются вообще. Это так, джастфорфанство. В принципе, почему бы и нет, если очень хочется.
А ты видел ЧТО там используют? Некоторые вообще НИЧЕГО не используют. А потом появляются новости (больница|полиция) платит выкуп за зашифрованные данные. На $имя_ресурса пропали все данные, ведь админ случайно rm -rf !!!111
Мало видеть нам начало - надо видеть и конец. Если видишь ты создание - значит где-то есть ТВОРЕЦ
Многие жалуются: геометрия в жизни не пригодилась. Ямб от хорея им приходится отличать ежедневно?

Оффлайн AnrDaemon

  • Автор темы
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 26520
    • Просмотр профиля
Не упарываться, а использовать тот продукт, который отвечает требованиям. В серьёзном продакшене так и делают, это очевидно.
Спасибо, посмешил. И, да, что по-твоему серьёзный продукт?…
Хотите получить помощь? Потрудитесь представить запрошенную информацию в полном объёме.

Прежде чем [Отправить], нажми [Просмотр] и прочти собственное сообщение. Сам-то понял, что написал?…

Оффлайн Tear

  • Старожил
  • *
  • Сообщений: 1291
  • Ubuntu 16.04 LTS
    • Просмотр профиля
А ты видел ЧТО там используют?
Представь себе, да!  ;)
А потом появляются новости (больница|полиция) платит выкуп за зашифрованные данные. На $имя_ресурса пропали все данные, ведь админ случайно rm -rf !!!111
Наверное, линуксоид был.  Со шкриптами с форумов!  8)
« Последнее редактирование: 12 Август 2016, 13:35:58 от Tear »

toZen

  • Гость
Последующий флуд, не относящийся к топику, ака "зачем мне это?", "есть хороший гуй"...etc, будет премирован процентами.
« Последнее редактирование: 12 Август 2016, 13:52:33 от τοΖεη »

Оффлайн Azure

  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 5817
  • elementaryOS 0.4 Loki, i3wm on Debian9
    • Просмотр профиля
А вы не обратили внимание, что я делаю всё то же самое? :) Но без cut. И без sed.
read сам вполне справляется с этой задачей.
Так я и не настаивал. Справляется, но чуть медленнее, т.к. читает посимвольно. Всё равно же grep пользуете, тогда и без него обходитесь… ;)
Затем, что это не bash.
В стандарте POSIX нет массивов.
Это ведь изначально не анонсировано… Всё равно сложно.
Код: Bash
  1. _SHARES='netlogon:work:1S bases'
  2. while read _s ; do
  3. done < <(IFS=: ; printf '%s\n' $_SHARES)
  4. # echo $_SHARES | tr : \\n
или хотя бы попробовать обойтись без evalecho $_SHARES | xargs printf '%s\n'echo $_SHARES | xargs -n1
« Последнее редактирование: 12 Август 2016, 20:05:37 от Azure »
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн AnrDaemon

  • Автор темы
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 26520
    • Просмотр профиля
Не вижу смысла обходиться без eval :)
Это в вас, вероятно, перлово-PHP'шные страхи играют.
В шелле eval это вполне легитимный, а зачастую и единственный, способ добиться конкретно нужного результата.
Например, eval echo "~$username/" для получения домашнего каталога пользователя по его имени.
А посимвольное чтение - так cut и sed тоже будут читать посимвольно.
И один лишний редирект в любом случае не ускорит работы скрипта.
« Последнее редактирование: 12 Август 2016, 19:59:43 от AnrDaemon »
Хотите получить помощь? Потрудитесь представить запрошенную информацию в полном объёме.

Прежде чем [Отправить], нажми [Просмотр] и прочти собственное сообщение. Сам-то понял, что написал?…

 

Страница сгенерирована за 0.102 секунд. Запросов: 24.