The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

Ошибка в bash-скрипте привела к полной очистке всех серверов хостинг-провайдера

14.04.2016 21:13

Опубликована поучительная история, призывающая к осторожному использованию систем централизованного управления конфигурацией и показывающая необходимость жесткой изоляции резервных копий. Для автоматизации проведения работ на всех серверах одного хостинг-провайдера использовалась система Ansible. В один прекрасный момент в bash-скрипте для резервного копирования, содержащем команду вида "rm -rf {foo}/{bar}" ("rm -rf ${backup_dir}/${old_arc}/*" ?), была допущена ошибка, которая привела к незаполнению переменных. После того как скрипт был растиражирован и выполнен на всех серверах произошла катастрофа - было удалено содержимое всех серверов, включая данные сайтов 1535 клиентов и бэкапы, хранилище которых было примонтировано к одному из серверов.

Дополнение 1: Новость скрыта, так как судя по последним ответам пострадавшего в обсуждении его проблемы, он ввёл в заблуждение издание Independent и выдумал эту историю.

Дополнение 2: Автор сообщения заявил одному из итальянских изданий, что это была шутка. Представители Stack Overflow также указали, что это мистификация.

  1. Главная ссылка к новости (http://www.independent.co.uk/l...)
  2. OpenNews: Выпуск системы управления конфигурацией Ansible 2.0
  3. OpenNews: Эксперименты с системой после выполнения rm -rf /
  4. OpenNews: Выполнение rm -rf / может привести к неработоспособности UEFI-прошивки ноутбука
Лицензия: CC-BY
Тип: Тема для размышления
Короткая ссылка: https://opennet.ru/44247-bug
Ключевые слова: bug
При перепечатке указание ссылки на opennet.ru обязательно
Обсуждение (65) Ajax | 1 уровень | Линейный | +/- | Раскрыть всё | RSS
  • 1.1, Аноним (-), 21:15, 14/04/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • +15 +/
    Вот костыления достойные плоды !
     
  • 1.2, grec (?), 21:16, 14/04/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • +9 +/
    На всяких sh кодить дело не благодарное.
     
     
  • 2.69, Andrey Mitrofanov (?), 09:31, 15/04/2016 [^] [^^] [^^^] [ответить]  
  • +1 +/
    > На всяких sh кодить дело не благодарное.

    Ога-ога. Зато теперь bash.exe точно готов для майкрософта-виста!

     

  • 1.3, Аноним (-), 21:16, 14/04/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    lol
     
  • 1.4, A.Stahl (ok), 21:18, 14/04/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • +32 +/
    >foo и bar

    И потом админы вздохнули: "foo" и пошли в bar заливать горе...

     
  • 1.5, Аноним (-), 21:19, 14/04/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • –2 +/
    Вот вам и мнимая простота Ansible.
     
     
  • 2.6, о6какатрон (?), 21:30, 14/04/2016 [^] [^^] [^^^] [ответить]  
  • +4 +/
    человечиский фактор жэ
     
     
  • 3.60, Поуист (?), 05:52, 15/04/2016 [^] [^^] [^^^] [ответить]  
  • +/
    Тут скорее поработали специально обученные обезьяны.
     
  • 2.76, Аноним (-), 10:13, 16/04/2016 [^] [^^] [^^^] [ответить]  
  • +/
    Ты придурок? Если нет, то объясни, почему так мало фигурных скобок и кто использует "shell: rm" и "file: state=absent".
     

  • 1.7, Anonplus (?), 21:36, 14/04/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • +2 +/
    Если пользователь хочет выстрелить себе в ногу, программа должна это позволять. Но она должна уметь и отменять любое действие. Иначе, это просчёт программистов.
     
     
  • 2.12, РРР (?), 21:58, 14/04/2016 [^] [^^] [^^^] [ответить]  
  • +9 +/
    Продолжим ваши рассуждения о выстреле. Пользователь спустил курок, пуля пролетела сквозь череп. Каким образом господин Калашников должен вас восстановить из мёртвых?
     
     
  • 3.26, Аноним (-), 22:29, 14/04/2016 [^] [^^] [^^^] [ответить]  
  • +5 +/
    Подать в суд на Калашникова, очевидно же.
     
     
  • 4.53, . (?), 02:13, 15/04/2016 [^] [^^] [^^^] [ответить]  
  • +/
    В суд на человека с калашниковым :)
    "Я делал автомат чтобы Родину защищать!"(С)Калашников, а если всяким еб***нам захотелось себе череп прострелить, ни автомат ни Конструктор ни при чём.
     
     
  • 5.57, 8203 (?), 04:10, 15/04/2016 [^] [^^] [^^^] [ответить]  
  • +/
    Не хватает только DRM.
     

  • 1.8, tagezi (ok), 21:37, 14/04/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • +6 +/
    Причем тут костыли, причем тут простата? :D
    Просто нужно тестить свой говнокод, перед тем как юзать :)))
     
     
  • 2.31, Васёк (?), 22:35, 14/04/2016 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Вот простáта тут однозначно не причем…
     
  • 2.40, foobar (??), 23:56, 14/04/2016 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Так он и протестил, в проде...
     
  • 2.63, _KUL (ok), 06:55, 15/04/2016 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Они забыли в команде указать последним главный ключ из man'а!

    -i, --interactive
    Выдавать запрос на удаление каждого файла. Если ответ не утвердителен, то файл пропускается.

     

  • 1.9, Аноним (-), 21:39, 14/04/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • +9 +/
    Во всём нужно искать положительные стороны. Например, рассадников червей и спамоботов стало на полторы тыщи меньше.
     
  • 1.10, Аноним (-), 21:40, 14/04/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • +8 +/
    хм. --no-preserve-root?
     
  • 1.11, Аноним (-), 21:42, 14/04/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • +6 +/
    Все уже разобрались, что это троллинг.
     
  • 1.13, Аноним (-), 21:59, 14/04/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Почтим памятью безвременно ушедшего раба божия того админа...
     
  • 1.14, Аноним (-), 21:59, 14/04/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • +5 +/
    Патч имени Бармина накатили
     
  • 1.15, Аноним (-), 22:00, 14/04/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • +4 +/
    Какой-то хипстер обжегся и решил запилить прохладную историю про якобы хостинг-провайдера. Знаем, проходили. Очередное напоминание, мол, "аккуратнее, ребзя! линух, оказывается, кусается!"
     
  • 1.16, Аноним (16), 22:05, 14/04/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    Ansible - мощь!
     
  • 1.17, Пользователь Debian (?), 22:07, 14/04/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • +5 +/
    Удалите эту ерунду.  Человек на SO набросил потому что заняться нечем было, а вы тут репостите.

    Атата.

     
  • 1.18, Аноним (-), 22:13, 14/04/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Ну, это... Что делать-то будете? testdisk? photorec? R-Studio for Linux ($80)? А лучше в платный центр восстановления данных с повреждённых носителей. Вот уж они озолотятся с 1535 серверов!
     
  • 1.19, Аноним (-), 22:13, 14/04/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    когда я был сисадмином - мне не раз приходилось похерить пользовательские данные... это были и базы 1С, домены, пользовательские фотки, документы... я думал только я один такой дuбuл на свете...
     
     
  • 2.22, Аноним (-), 22:20, 14/04/2016 [^] [^^] [^^^] [ответить]  
  • +2 +/
    И долго вы были сисадмином позвольте спросить ?
     
     
  • 3.28, Led (ok), 22:32, 14/04/2016 [^] [^^] [^^^] [ответить]  
  • +7 +/
    > И долго вы были сисадмином позвольте спросить ?

    По резальтатам "работы" насильно переквалифицировали в "модного дизайнера".

     
  • 3.29, Аноним (-), 22:32, 14/04/2016 [^] [^^] [^^^] [ответить]  
  • +1 +/
    лет 8
     
  • 2.27, Led (ok), 22:31, 14/04/2016 [^] [^^] [^^^] [ответить]  
  • +2 +/
    > я думал только я один такой дuбuл на свете...

    Да нет же, дохрена вас...


     

  • 1.20, Аноним (-), 22:18, 14/04/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • +3 +/
    Вообще-то Ansible по умолчанию падает с ошибкой при попытке обратиться к неопределенной переменной.
     
     
  • 2.35, mickvav (?), 23:06, 14/04/2016 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Дык, их, видать, пустыми строками определили :)
     
     
  • 3.44, Аноним (-), 00:07, 15/04/2016 [^] [^^] [^^^] [ответить]  
  • +9 +/
    > Дык, их, видать, пустыми строками определили :)

    Так! Человек вновь победил бездушную машину!

     

  • 1.21, Megabit (ok), 22:19, 14/04/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    >>...мне не раз приходилось похерить пользовательские данные...

    Наверное ты таки ОДИН...

     
  • 1.23, rshadow (ok), 22:21, 14/04/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • +6 +/
    1 апреля давно закончилось.

    $ sudo rm -fr /
    rm: опасно рекурсивно обрабатывать «/»
    rm: используйте --no-preserve-root, чтобы отменить предупреждение об опасности

     
     
  • 2.58, Аноним (-), 04:11, 15/04/2016 [^] [^^] [^^^] [ответить]  
  • +/
    Не bashем единым.
     
     
  • 3.62, Сиромант (?), 06:50, 15/04/2016 [^] [^^] [^^^] [ответить]  
  • +1 +/
    При чем здесь bash? Это GNU coreutils.
     

  • 1.24, Аноним (-), 22:26, 14/04/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Это был тонкий троллинг, закончившийся полнейшей жирнотой. Новость можно удалять.
    http://serverfault.com/questions/769357/recovering-from-a-rm-rf
     
  • 1.25, commiethebeastie (ok), 22:27, 14/04/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    А /usr оно удалило?
     
     
  • 2.43, Аноним (-), 00:05, 15/04/2016 [^] [^^] [^^^] [ответить]  
  • +/
    > А /usr оно удалило?

    Всё удалило. Даже /dev/null.

     

  • 1.30, Аноним (-), 22:34, 14/04/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    я тоже так сделал, правда, с фотками, не я один такой значит...
     
  • 1.32, ALex_hha (ok), 22:36, 14/04/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • +4 +/
    > Вот вам и мнимая простота Ansible.

    т.е. этот же злосчастный bash скрипт на salt, chef, puppet отработал бы по другому? :D

    > На всяких sh кодить дело не благодарное.

    set -u нее, не слышал? Ну дак кто вам виноват.

    #!/bin/bash

    set -u
    set -e

    dir1="foo"
    #dir2="bar"

    rm -fr ${dir1}/${dir2}

    # test.sh
    ./test.sh: line 11: dir2: unbound variable

    P.S.
    правда если будет dir1="" и dir2="", то сработает :)

     
     
  • 2.34, Аноним (-), 23:03, 14/04/2016 [^] [^^] [^^^] [ответить]  
  • +/
    О, я так другу в детстве программу написал и дал потестить. Только не сказал, что для того чтобы в ней появилось меню нужно нажать M, а до этого F10. В итоге он сказал, что программа ему очень понравилась, но впоследствии я выяснил, что дальше пустого чёрного экрана в её использовании он так и не продвинулся. Правда мне тогда было лет 12, а сколько лет было тому, кто придумал необходимость в "set -u" и сделал пробел значимым символом при присваивании значения переменной?
     
     
  • 3.73, Led (ok), 21:19, 15/04/2016 [^] [^^] [^^^] [ответить]  
  • +/
    > Правда мне тогда было лет 12

    Ну и зачем здесь эта прошлогодняя история?

     
  • 2.42, Аноним (-), 00:00, 15/04/2016 [^] [^^] [^^^] [ответить]  
  • –1 +/
    # set -u бесполезен когда переменная объявлена, но пуста, пример: dir1=""
    # Поэтому единственный выход проверить значения переменных непосредственно перед деструктивными операциями:


    #!/usr/bin/env bash

    err () {
       echo "Error: $1"
       exit 1
    }

    #dir1="1"
    dir2="2"

    [ "$dir1" == ""  ] && err "Undefined variable 'dir1'"
    [ "$dir2" == ""  ] && err "Undefined variable 'dir2'"

    cd ${dir1} && rm -R ${dir2}

    # EOF


    Кстати, -f в rm намекает на его кустарность оригинального скрипта.

     
  • 2.51, Аноним (-), 01:29, 15/04/2016 [^] [^^] [^^^] [ответить]  
  • –2 +/
    Использование -u и -e для чего-либо кроме отладки - дурной тон.
     
     
  • 3.67, Andrey (??), 07:49, 15/04/2016 [^] [^^] [^^^] [ответить]  
  • +2 +/
    > Использование -u и -e для чего-либо кроме отладки - дурной тон.

    И чем они помешают в production? Пускай лучше упадет, чем некорректно работать будет.

    Небольшая иструкция по работе с ошибками в скриптах: http://users.livejournal.com/_winnie/277041.html

     
     
  • 4.74, Аноним (-), 21:30, 15/04/2016 [^] [^^] [^^^] [ответить]  
  • –1 +/
    >> Использование -u и -e для чего-либо кроме отладки - дурной тон.
    > И чем они помешают в production? Пускай лучше упадет, чем некорректно работать
    > будет.

    Тем что их поведение не очевидно во многих случаях, всё это описано подробно в bash FAQ.

     

  • 1.33, QuAzI (ok), 22:38, 14/04/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    Снапшоты ФС не удаляются через rm, но почему-то народ считает что снапшоты не комильфо для бекапов
     
     
  • 2.36, Аноним (-), 23:28, 14/04/2016 [^] [^^] [^^^] [ответить]  
  • +/
    Открой для себя бездну гугль: консистентное состояния и snapshot.
     
     
  • 3.54, . (?), 02:17, 15/04/2016 [^] [^^] [^^^] [ответить]  
  • +/
    В нормальных FS - снапшоты нормальные. :-р
     
  • 2.56, Elhana (ok), 03:14, 15/04/2016 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Снапшоты не комильфо для бекапов, потому что если диск накернится, то даже 100 снапшотов вам не помогут. Но по своему они полезны.
     
     
  • 3.64, Аноним (-), 07:00, 15/04/2016 [^] [^^] [^^^] [ответить]  
  • +/
    Помогут, если их хранить на другом накопителе.
     
  • 3.70, JL2001 (ok), 15:09, 15/04/2016 [^] [^^] [^^^] [ответить]  
  • +/
    > Снапшоты не комильфо для бекапов, потому что если диск накернится, то даже
    > 100 снапшотов вам не помогут. Но по своему они полезны.

    снапшоты комильфо для бэкапов, а вот нераспределённое хранение бэкапов (которые могут быть в любом виде) - некомильфо
    (хотя в терминалогии я не силён, что там называют бэкапами, что версионированием, а что резервным копированием - не в курсе)

     

  • 1.37, Аноним (-), 23:40, 14/04/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • +2 +/
    Один разгильдяй не умеет писать скрипты на bash-е, не имеет системы контроля версий, не умеет настроить бекап. Второй держит этого "специалиста" на работе. А виноват ansible.
     
     
  • 2.39, Anonymous1 (?), 23:54, 14/04/2016 [^] [^^] [^^^] [ответить]  
  • –1 +/
    > Один разгильдяй не умеет писать скрипты на bash-е, не имеет системы контроля
    > версий, не умеет настроить бекап. Второй держит этого "специалиста" на работе.
    > А виноват ansible.

    Да блин, вот и выросло поколение гуевых админов, которые ждут везде подтверждений типа "А Вы уверены?", причем раз по 10 на каждую сомнительную операцию.
    Спасет таких админов только следующая метода:
    QR-код, создаваемый спец. приложением на Айфоне, которым команды в баш-е на "управляемых" ими серверах будут через сервис Гугла писать, с предварительной проверкой их искусственным интеллектом от Майкрософт. Потому что собственный интеллект задропан в ноль и заменен креативностью еще в школе, что и удостоверено высоким баллом ЕГЭ.

     
  • 2.52, Анином (?), 01:45, 15/04/2016 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Всетаки bash как язык программирования крайне неудобен, что повышает вероятность ошибок.
     
     
  • 3.75, Аноним (-), 21:36, 15/04/2016 [^] [^^] [^^^] [ответить]  
  • +/
    > Всетаки bash как язык программирования крайне неудобен, что повышает вероятность ошибок.

    Точно такая ошибка с удалением всего содержимого диска есть например в Samsung kies, а он явно не на bash.

     

  • 1.38, IMHO (?), 23:48, 14/04/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    код покажите, может он еще там и dd if=/dev/zero of=/dev/hdd$inc
     
     
  • 2.46, Аноним (-), 00:25, 15/04/2016 [^] [^^] [^^^] [ответить]  
  • +/
    Он там уже написал, что перепутал if и of, а потом — что почти всё удалось восстановить.
     
  • 2.49, Эль (?), 00:47, 15/04/2016 [^] [^^] [^^^] [ответить]  
  • +/
    Он в комментариях дальше пишет, что if и of перепутал, когда один из дисков восстанавливал, так что да.
     

  • 1.41, Аноним (-), 23:58, 14/04/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    > бэкапы, хранилище которых было примонтировано к одному из серверов

    Правильная архитектура не должна позволять выстрелить себе в ногу. Надо монтировать read-only, или вообще отдавать данные с коиента на сервер.

     
     
  • 2.71, JL2001 (ok), 15:14, 15/04/2016 [^] [^^] [^^^] [ответить]  
  • +/
    >> бэкапы, хранилище которых было примонтировано к одному из серверов
    > Правильная архитектура не должна позволять выстрелить себе в ногу. Надо монтировать read-only

    проблема в том что это ошибка в скрипте который:
    1) и должен работать с пользовательскими данными, тоесть они при его работе будут в w
    2) распределяется к работе на все сервера

    даже если бы ВЕСЬ диск не поврайтился - пользовательские данные потёрлись бы (даже забывая что сама новость похоже фейковая)
    тоесть тут поможет только правильное бэкапирование с версионированием (ну и распределённостью)

     

  • 1.45, Аноним (-), 00:19, 15/04/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    О, да. Так им и надо! Это все от того, что все боятся сишки.
     
     
  • 2.72, JL2001 (ok), 15:15, 15/04/2016 [^] [^^] [^^^] [ответить]  
  • +1 +/
    > О, да. Так им и надо! Это все от того, что все боятся сишки.

    как будто rm-rf написан не на сишке
    правильно делают что боятся !!! сишка убила винт а баш тока отдал преступный приказ !!!!!1112

     

  • 1.47, Аноним (-), 00:27, 15/04/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    "rm -rf {foo}/{bar}"?  Что значит вообще значит?  В шелл скриптах для интерполяции используется символ доллара, а в Jinja2 и YAML, которые используются в Ansible, -- две пары фигурных скобок.
     
  • 1.48, Аноним (-), 00:29, 15/04/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    rm - rf / не удаляет данные уже лет пять как, удалите этот фейк
     
  • 1.59, Аноним (-), 04:13, 15/04/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    ай красаучик админ, четко ошибся, от души код
     
  • 1.61, eRIC (ok), 06:10, 15/04/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    rm -rf всегда считалась опасной командой, LOL
     
  • 1.66, Аноним (-), 07:40, 15/04/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    я всегда удаляю данные через mv: mv /tmp/trash.txt /dev/null
     
  • 1.68, Че (?), 09:11, 15/04/2016 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    Как ща помню. Перепутал как-то "./", написав, вместо этого "/." Когда понял, что что-то пошло не так, большая часть файлов в каталоге /dev была удалена. 8-[=====]X
    В общем-то, к утру SCO был починен и бодро жужжал ораклом. 8-)

    После этого инцидента, правильная команда была засунута в крон, чтобы уже ни какие очумелые ручки не мешались. И костыли эти работали уже до самого конца.
    Предыдущий админ сказал, что у него на это ушло двое суток, при поддержке саппорта разработчика.

    А вся эта беда была нужна потому, что у софта был какой-то глюк, когда он начинал в великом множестве плодить пустые файлы, что приводило к остановке дисковой системы, по причине занятости всех i-node.

     
     
  • 2.77, ALex_hha (ok), 13:59, 18/04/2016 [^] [^^] [^^^] [ответить]  
  • +/
    > Тем что их поведение не очевидно во многих случаях, всё это описано подробно в bash FAQ.

    а какое может быть не очевидное поведение у set -u?

     

     Добавить комментарий
    Имя:
    E-Mail:
    Текст:



    Спонсоры:
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2020 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру