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


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

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

Оффлайн AnrDaemon

  • Автор темы
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 28358
    • Просмотр профиля
http://anr-daemon.livejournal.com/26573.html
Код: (bash) [Выделить]
#!/bin/sh

# Edit these two lines.
# Create the base directory for backups.
_BACKUP="/home/.backup/$(date +%F)"
# Quote section names with special characters.
_SHARES='netlogon work "1S bases"'

test -d "$_BACKUP" && exit 0

do_backup()
{
  test -f "$1" && {
      echo "The '$1' already exists." >&2
      return 0
    }
  tar -C / -caf "$1" \
    --transform="s#^${2#/}#${3}#x" \
    -- "${2#/}"
}

mkdir "$_BACKUP" || {
    echo "Can't create backup directory '$_BACKUP', aborting." >&2
    exit 1
  }

getent passwd | grep -ivE "^(root|admin(istrator)?)\>" | while IFS=: read -r _u _ _ _ _ _h _; do
  test "${_h#/home}" = "${_h}" && continue
  _h="$(readlink -fe "$_h")"

  test "${_h#/}" || continue
  test -d "$_h" || continue

  _name="$_u$(date +"-%F")"
  _file="$_BACKUP/$_name.tar.gz"

  do_backup "$_file" "${_h}" "$_name"
done

# Pack the shares
eval printf '%s\\n' $_SHARES | while read -r _s; do
  _h="$(readlink -fe "$(testparm --section-name "$_s" --parameter-name path -s)")" 2> /dev/null
  test "${_h#/}" || continue

  test -d "$_h" || {
      echo "Unable to find the path for section '$_s'." >&2
      continue
    }

  _name="$_s$(date +"-%F")"
  _file="$_BACKUP/s-$_name.tar.gz"

  do_backup "$_file" "${_h}" "$_name"
done

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

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

toZen

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

Оффлайн ALiEN

  • Администратор
  • Старожил
  • *
  • Сообщений: 6691
  • 20% Cooler
    • Просмотр профиля
AnrDaemon, спасибо, не знал что у вас есть блог. Пробежался, подсмотрел много интересного =)
🖥 AsRock B550M Pro4 :: AMD Ryzen 5 3600 :: 16 GB DDR4 :: AMD Radeon RX 6600 :: XFCE
💻 ACER 5750G :: Intel Core i5-2450M :: 6 GB DDR3 :: GeForce GT 630M :: XFCE

Оффлайн gamayun

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

Оффлайн Azure

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

Оффлайн AnrDaemon

  • Автор темы
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 28358
    • Просмотр профиля
Код: (bash) [Выделить]
getent passwd | cut -d: -f1,6 | grep -ivwE "^(root|admin(istrator)?)"или
Код: (bash) [Выделить]
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) [Выделить]
_SHARES=(netlogon work "1S bases")
for _s in "${_SHARES[@]}"
Затем, что это не bash.
В стандарте POSIX нет массивов.
Хотите получить помощь? Потрудитесь представить запрошенную информацию в полном объёме.

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

Оффлайн Tear

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

Оффлайн AnrDaemon

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

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

Оффлайн Tear

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

Оффлайн alsoijw

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

Оффлайн AnrDaemon

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

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

Оффлайн Tear

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

toZen

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

Оффлайн Azure

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
А вы не обратили внимание, что я делаю всё то же самое? :) Но без cut. И без sed.
read сам вполне справляется с этой задачей.
Так я и не настаивал. Справляется, но чуть медленнее, т.к. читает посимвольно. Всё равно же grep пользуете, тогда и без него обходитесь… ;)
Затем, что это не bash.
В стандарте POSIX нет массивов.
Это ведь изначально не анонсировано… Всё равно сложно.
Код: (bash) [Выделить]
_SHARES='netlogon:work:1S bases'
while read _s ; do

done < <(IFS=: ; printf '%s\n' $_SHARES)
# echo $_SHARES | tr : \\n
или хотя бы попробовать обойтись без evalecho $_SHARES | xargs printf '%s\n'echo $_SHARES | xargs -n1
« Последнее редактирование: 12 Августа 2016, 20:05:37 от Azure »
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн AnrDaemon

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

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

 

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