З тих пір, коли POSIX і GNU rm не видаляти /?


23

Уже кілька років rmутиліта GNU не видаляється, /якщо не буде викликано цю --no-preserve-rootопцію. Однак команда rm -rf /була подана в колективну підсвідомість як небезпечна протягом дуже тривалого часу, і люди все ще часто цитують це як "страшну" команду.

Мені було цікаво, коли вперше з’явилося це правило, яке rmне можна видалити /. Я перевірив специфікації POSIX, і я можу побачити, що, хоча POSIX: 2008 включає цю функцію безпеки, POSIX: 2001 цього не робить. Оскільки онлайнові оновлення специфікацій POSIX періодично оновлюються, з кожним новим підпуском випуску я також перевірив машину зворотного звороту та знайшов відповідну сторінку POSIX: 2008 з 2010 року та зміг підтвердити, що правило, яке rmне можна видалити /був уже перерахований тоді.

Отже, мої запитання:

  • Коли до специфікацій POSIX було додано правило, яке rmне можна видалити /? Чи було це в оригінальній версії 2008 року Єдиної специфікації UNIX, версія 4, або вона була додана в редакції?
  • Коли це обмеження було додано до GNU rm? Я впевнений, що це було до того, як його додали до POSIX, але коли це сталося?


1
Пов'язане: Інтерпретація групи Остіна № 019 (2003), де описано (але не реалізувало) зміни.
Майкл Гомер

Відповіді:


28

Ви можете знайти версію HTML усіх видань POSIX 2008 в Інтернеті:

Це було додано у виданні 2008 року.

Технічні виправлення зазвичай не додають нових функцій.

Ви можете бачити, що в попередній версії ( http://pubs.opengroup.org/onlinepubs/009695399/utilities/rm.html ) (POSIX 2004) не було цього тексту.

Новий текст був прийнятий на конференції австрійської групи 2003-05-09 для включення до подальшої редакції стандарту.

На це звернувся Джон Бек із компанії Sun Microsystems у березні того ж року (посилання вимагає реєстрації для відкриття групи, див. Також Запит №5 на покращення тут ).

Джон Бек писав, у вівторок, 11 березня 2003 року:

@ page 820 line 31681-31683 section rm comment {JTB-1}

Problem:

Defect code :  3. Clarification required

An occasional user mistake, with devastating consequences, is to
write a shell script with a line such as:
      rm -rf $VARIABLE1/$VARIABLE2
or
      rm -rf /$VARIABLE1
without verifying that either variable is set, which can lead to
      rm -rf /
being the resulting command.  Since there is no plausible
circumstance under which this is the desired behavior, it seems
reasonable to disallow this.  Such a safeguard would, however,
violate the current specification.

Action:

Either extend the exceptions for . and .. on the noted lines
to list / as well, or specify that the behavior of rm if an
operand resolves to / is undefined.

GNU rmдодав --preserve-rootта --no-preserve-rootваріанти в цьому комітеті 2003-11-09 , але --preserve-rootстав лише типовим у цьому комітеті 2006-09-03 , тому в coreutils 6.2

FreeBSD зберігає косу рису з цього 2004-10-04 комісії"Дізнайтеся, як справді є моє нижнє білизна" журналом фіксації), але спочатку не під часPOSIXLY_CORRECT , поки вони не згадали перевірити через десятиліття, що POSIX зараз мандат на це, в який момент це було зроблено також у режимі POSIX .

У початковій програмі FreeBSD згадується, що Соляріс вже робив це в той час.

@JdePB (в коментарі нижче) виявив, що посилання на історію інсайдерської історії Sun не підтверджує та надає більше деталей про походження Solaris і припускає, що Solaris вже вступила в захист, перш ніж вони подали запит до групи Остіна.

Це пояснює обґрунтування додавання цього виключення. Хоча можна звинувачувати себе лише в тому випадку, якщо вони це роблять rm -rf /, є випадок, коли сценарій міг би це зробити, якщо це робити, rm -rf -- "$1/$2"не перевіряючи, що $1/ $2були надані. Це те, що погано вражає деяких клієнтів Sun при неправильному застосуванні патчу Solaris (за цим посиланням).

Заборона на видалення .та ..була додана задовго до цього і знову для захисту від можливих випадків. rmвсе ще небезпечна команда. Він робить те, що призначено робити: видаліть те, що вам сказали.

rm -rf /*
cd /tmp &&  rm -rf .*/   # on some systems where rm -rf ../ still removes
                         # the content of ../ and shells that still
                         # may include . and .. in glob expansions.
rm -rf -- "$diretcory"/* # note the misspelled variable name
dir='foo '; rm -rf $dir/*

Також видалить би все. Відомо, що завершення назви файлу оболонки викликає такі проблеми

rm -rf someth<Tab>/*

Розширено до:

rm -rf something /*

Бо somethingтак сталося, що це не каталог.

Оболонки люблять tcshабо zshдодадуть додаткову підказку при спробі зателефонувати rmза допомогою *символу "wildcard" ( tcshне за замовчуванням).



1
Як молодий кооператив SA, я спробував стерти приховані файли в каталозі користувача на SunOS w / rm -rf .*з його домашнього редактора. Незабаром загорілися всі телефонні лінії ...
Аарон Д. Мараско

Б'юсь об заклад, що $ rm -rf. * = Rm -rf / перекрученим способом потрапити туди.
Ескос

@GuruAdrian впевнений, * означає відповідати всім таким чином.
Ескоце

можливо, в сучасних оболонках. Це було не завжди так. Я залишив цю глибину адміністрування та розвитку системи більше 15 років тому
Ескос
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.