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


Считаете, что Ubuntu недостаточно дружелюбна к новичкам?
Помогите создать новое Руководство для новичков!

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

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

Оффлайн AnrDaemon

  • Автор темы
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 26096
    • Просмотр профиля
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

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

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

Оффлайн τοΖεη

  • Заслуженный пользователь
  • Администратор
  • Старожил
  • *
  • Сообщений: 8615
    • Просмотр профиля
AnrDaemon, спасибо.
Периодически почитываю Ваш ЖЖ.
Весьма много полезностей.
# find / -iname '*τοΖεη*'
# /God's_Universe/Book_Of_Life_aka_LordJC_protected/τοΖεη
Subject description -->> Not an ideal but s@ved 4eVer. Final destination -->> Kingdom Of Heaven

Оффлайн ALiEN175

  • Старожил
  • *
  • Сообщений: 2223
  • X-9000SC
    • Просмотр профиля
AnrDaemon, спасибо, не знал что у вас есть блог. Пробежался, подсмотрел много интересного =)
Благодарности на Yandex 41001488642430. Cпасибо.

Оффлайн gamayun

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

Оффлайн Azure

  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 5665
  • 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

  • Автор темы
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 26096
    • Просмотр профиля
Код: 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

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

Оффлайн AnrDaemon

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

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

Оффлайн Tear

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

Оффлайн alsoijw

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

Оффлайн AnrDaemon

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

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

Оффлайн Tear

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

Оффлайн τοΖεη

  • Заслуженный пользователь
  • Администратор
  • Старожил
  • *
  • Сообщений: 8615
    • Просмотр профиля
Последующий флуд, не относящийся к топику, ака "зачем мне это?", "есть хороший гуй"...etc, будет премирован процентами.
« Последнее редактирование: 12 Август 2016, 13:52:33 от τοΖεη »
# find / -iname '*τοΖεη*'
# /God's_Universe/Book_Of_Life_aka_LordJC_protected/τοΖεη
Subject description -->> Not an ideal but s@ved 4eVer. Final destination -->> Kingdom Of Heaven

Оффлайн Azure

  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 5665
  • 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

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

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

 

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