Как я предотвращаю случайную комнату-rf /*?

Это немного странно, но работы:

Вставьте фиктивный столбец как первый столбец Вашей таблицы, затем сохраните таблицу.

Наконец, удалите новый столбец и сохраните таблицу снова.

Теперь Вам, конечно, будут использовать 0 байтов.

Noel Paricollo

164
задан 22 February 2016 в 22:41
31 ответ

Один из приемов, которым я следую, - это поместить # в начало при использовании команды rm .

root@localhost:~# #rm -rf /

Это предотвращает случайное выполнение rm не в том файле / каталоге. После проверки удалите # с самого начала. Этот прием работает, потому что в Bash слово, начинающееся с # , заставляет это слово и все оставшиеся символы в этой строке игнорироваться. Таким образом, команда просто игнорируется.

ИЛИ

Если вы хотите предотвратить любой важный каталог, есть еще одна уловка.

Создайте файл с именем -i в этом каталоге. Как можно создать такой странный файл? Используя touch - -i или touch ./-i[1260 impression, попробуйте rm -rf * :

sachin@sachin-ThinkPad-T420:~$ touch {1..4}
sachin@sachin-ThinkPad-T420:~$ touch -- -i
sachin@sachin-ThinkPad-T420:~$ ls
1  2  3  4  -i
sachin@sachin-ThinkPad-T420:~$ rm -rf *
rm: remove regular empty file `1'? n
rm: remove regular empty file `2'? 

Здесь * будет разверните -i в командную строку, поэтому ваша команда в конечном итоге становится rm -rf -i . Таким образом, команда запросит перед удалением. Вы можете поместить этот файл в свои / , / home / , / etc / и т. Д.

ИЛИ

Используйте - preserve-root в качестве опции для rm . В rm , включенном в новые пакеты coreutils , этот параметр используется по умолчанию.

--preserve-root
              do not remove `/' (default)

ИЛИ

Используйте safe-rm

Выдержка с веб-сайта:

Safe-rm - это инструмент безопасности, предназначенный для предотвращения случайного удаления важных файлов, заменив / bin / rm оболочкой, которая проверяет данные аргументы против настраиваемого черного списка файлов и каталоги, которые нельзя удалять.

Пользователи, которые пытаются удалить один из этих защищенных файлов или каталоги не смогут этого сделать, и будет показано предупреждение вместо этого сообщение:

 $ rm -rf / usr
Пропуск / usr
220
ответ дан 28 November 2019 в 19:17

Кроме того, не в качестве меры предосторожности, а как способ узнать, какие файлы были удалены до того, как вы нажмете ^ C, вы можете использовать базу данных locate (конечно, только если он был установлен и выжил rm )

Я узнал об этом из этого сообщения в блоге

0
ответ дан 28 November 2019 в 19:17

Некоторые псевдонимы безопасности для других команд, чтобы предотвратить подобные катастрофы, можно найти здесь :

# safety features
alias cp='cp -i'
alias mv='mv -i'
alias rm='rm -I'                    # 'rm -i' prompts for every file
alias ln='ln -i'
alias chown='chown --preserve-root'
alias chmod='chmod --preserve-root'
alias chgrp='chgrp --preserve-root'

Обратите внимание на верхний регистр -I , он отличается от -i :

запрашивать один раз перед удалением более трех файлов или при удалении рекурсивно. Менее навязчивый, чем -i, но при этом обеспечивает защиту против большинства ошибок

1
ответ дан 28 November 2019 в 19:17

Если вы сейчас не в настроении приобретать новые привычки, .bashrc / .profile - хорошее место, чтобы добавить тесты, чтобы проверить, не собираетесь ли вы сделать что-то глупое. Я решил, что в функции Bash я могу найти шаблон, который может испортить мне день, и придумал следующее:

alias rm='set -f; myrm' #set -f turns off wildcard expansion need to do it outside of           
                        #the function so that we get the "raw" string.
myrm() {
    ARGV="$*"
    set +f #opposite of set -f
    if echo "$ARGV" | grep -e '-rf /*' \
                           -e 'another scary pattern'
    then
        echo "Do Not Operate Heavy Machinery while under the influence of this medication"
        return 1
    else
        /bin/rm $@
    fi
}

Хорошо, что это всего лишь Bash.

Он явно недостаточно универсален в этой форме, но Я думаю, что у него есть потенциал, поэтому, пожалуйста, оставьте несколько идей или комментариев.

1
ответ дан 28 November 2019 в 19:17

Когда я удаляю каталог рекурсивно я помещаю -r и -f , если применимо, в конец команды, например rm / foo / bar -rf . Таким образом, если я случайно нажму Enter слишком рано, еще не набрав весь путь, команда не будет рекурсивной, поэтому она, вероятно, безвредна. Если я нажимаю Enter при попытке ввести косую черту после / foo , я написал rm / foo , а не rm -rf /foo[1148745 impression.

Это хорошо работает в системах, использующих GNU coreutils, но утилиты в некоторых других Unix-системах не позволяют размещать параметры в конце таким образом. К счастью, я нечасто использую такие системы.

3
ответ дан 28 November 2019 в 19:17

Ваша проблема:

Я только что случайно запустил rm -rf / *, но имел в виду rm -rf ./* (обратите внимание на звездочку после косой черты).

Решение: Не делайте этого! На практике не используйте ./ в начале пути. Косая черта не добавляет значения команде и только вызовет путаницу.

./* означает то же самое, что и * , поэтому приведенную выше команду лучше записать как:

rm - rf *

Вот похожая проблема. Я часто вижу следующее выражение, в котором кто-то предположил, что для FOO установлено что-то вроде / home / puppies . Я видел это только сегодня в документации от крупного поставщика программного обеспечения.

rm -rf $ FOO /

Но если FOO не установлен, это будет оцениваться как rm - rf / , который попытается удалить все файлы в вашей системе. Завершающая косая черта не нужна, поэтому на практике не используйте ее.

Следующее будет делать то же самое и с меньшей вероятностью повредит вашу систему:

rm -rf $ FOO

I я усвоил эти советы на собственном горьком опыте. Когда 14 лет назад у меня была первая учетная запись суперпользователя, я случайно запустил rm -rf $ FOO / из сценария оболочки и уничтожил систему. Остальные 4 системных администратора посмотрели на это и сказали: «Ага. Каждый делает это однажды. Теперь вот ваш установочный носитель (36 дискет). Иди, исправь ».

Другие люди здесь рекомендуют такие решения, как - preserve-root и safe-rm . Однако эти решения доступны не для всех Un * xe-вариантов и могут не работать в Solaris, FreeBSD и MacOSX. К тому же, safe-rm требует, чтобы вы устанавливали дополнительные пакеты в каждой системе Linux, которую вы используете. Если вы полагаетесь на safe-rm , что произойдет, если вы начнете новое задание, а у него не будет установлен safe-rm ? Эти инструменты - костыль, и гораздо лучше полагаться на известные настройки по умолчанию и улучшать свои рабочие привычки.

46
ответ дан 28 November 2019 в 19:17

Вы всегда можете использовать псевдоним, как вы упомянули:

what_the_hell_am_i_thinking() {
   echo "Stop." >&2
   echo "Seriously." >&2
   echo "You almost blew up your computer." >&2
   echo 'WHAT WERE YOU THINKING!?!?!' >&2
   echo "Please provide an excuse for yourself below: " 
   read 
   echo "I'm sorry, that's a pathetic excuse. You're fired."
   sleep 2
   telnet nyancat.dakko.us
}

alias rm -fr /*="what_the_hell_am_i_thinking"

Вы также можете интегрировать его с клиентом Twitter с командной строкой, чтобы предупредить своих друзей о том, как вы чуть не унизили себя, вытирая свой жесткий диск. диск с rm -fr / * как root.

19
ответ дан 28 November 2019 в 19:17

Обычно я использую флаг -v , чтобы увидеть, что удаляется, и имею шанс быстро ^ C , если у меня есть малейшие сомнения. Не совсем способ предотвратить плохие rm , но это может быть полезно для ограничения ущерба в случае, если что-то пойдет не так.

1
ответ дан 28 November 2019 в 19:17

Избегайте использования подстановки . В Bash вы можете установить noglob . Но опять же, когда вы переходите к системе, в которой noglob не установлен, вы можете забыть об этом и действовать, как если бы это было.

Установите noclobber , чтобы предотвратить mv и cp от уничтожения файлов.

Для удаления используйте файловый браузер. Некоторые файловые браузеры предлагают мусорную корзину (например, Konqueror ).

Другой способ избежать подстановки файлов - следующий. В командной строке я echo filenamepattern >> xxx . Затем я редактирую файл с помощью Vim или vi, чтобы проверить, какие файлы должны быть удалены (следите за символами шаблонов имен файлов в файлах), а затем использую % s / ^ / rm -f / , чтобы перевернуть каждую строку в команду удаления. Источник xxx. Таким образом, вы увидите каждый файл, который будет удален, перед тем, как это сделать.

Переместите файлы в "чердачный" каталог или архив. Или используйте контроль версий (как было сказано до меня).

2
ответ дан 28 November 2019 в 19:17

Лучшие решения включают изменение ваших привычек, чтобы не использовать rm напрямую.

Один из подходов - запустить echo rm -rf / stuff / with / wildcards * первый. Убедитесь, что вывод подстановочных знаков выглядит разумно, затем используйте историю оболочки для выполнения предыдущей команды без echo .

Другой подход - ограничить команду echo случаями, когда совершенно очевидно, что вы будете удалять. Вместо того, чтобы удалять все файлы в каталоге, удалите каталог и создайте новый. Хороший метод - переименовать существующий каталог в DELETE-foo , затем создать новый каталог foo с соответствующими разрешениями и, наконец, удалить DELETE-foo . Дополнительным преимуществом этого метода является то, что в вашей истории вводится команда rm -rf DELETE-foo .

cd ..
mv somedir DELETE-somedir
mkdir somedir                 # or rsync -dgop DELETE-somedir somedir to preserve permissions
ls DELETE-somedir             # just to make sure we're deleting the right thing
rm -rf DELETE-somedir

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

mkdir ../DELETE_ME
mv * ../DELETE_ME
ls ../DELETE_ME
rm -rf ../DELETE_ME

(Нажмите Alt + . ключ.)

Удаление каталога изнутри было бы привлекательным, потому что rm -rf. короткий, следовательно, имеет низкий риск опечаток. К сожалению, обычные системы не позволяют этого сделать. Вместо этого вы можете использовать rm -rf - "$ PWD" с более высоким риском опечаток, но большинство из них не приводят к удалению ничего. Помните, что это оставляет опасную команду в истории вашей оболочки.

По возможности используйте контроль версий. У вас нет rm , вы cvs rm или что-то еще, и это невозможно.

У Zsh есть параметры, которые могут предложить вам перед запуском rm с аргументом, перечисляет все файлы в каталоге: rm_star_silent (по умолчанию включено) запрашивает перед выполнением rm независимо / * , а rm_star_wait (по умолчанию выключено) добавляет 10- вторая задержка, в течение которой вы не можете подтвердить. Это имеет ограниченное использование, если вы намеревались удалить все файлы в каком-либо каталоге, потому что вы уже ожидаете приглашения. Это может помочь предотвратить опечатки вроде rm foo * для rm foo * .

Есть еще много решений, которые включают изменение команды rm .

23
ответ дан 28 November 2019 в 19:17

Решение этой проблемы - делать регулярные резервные копии. Каждый раз, когда вы создаете то, что не хотите рисковать потерять, сделайте резервную копию. Если вы считаете, что регулярное резервное копирование слишком болезненно, упростите процесс, чтобы это не было болезненным.

Например, если вы работаете с исходным кодом, используйте инструмент вроде git , чтобы отразить код и сохранить история на другой машине. Если вы работаете с документами, используйте сценарий, который rsync синхронизирует ваши документы с другим компьютером.

9
ответ дан 28 November 2019 в 19:17

За пределами chattr , не существует целого ряда гарантий, позволяющих root запускать такую ​​команду. Вот почему правильные группы и осторожные команды важны при работе с привилегиями.

В следующий раз; выделите файлы, которые вы планируете удалить - опустите 'f' в rm -rf или используйте find и передайте его в xargs rm

1
ответ дан 28 November 2019 в 19:17

Да: не работайте как root и всегда дважды подумайте, прежде чем действовать.

Также посмотрите что-нибудь вроде https://launchpad.net/safe-rm .

15
ответ дан 28 November 2019 в 19:17

Мой процесс удаления на машинах с Unix выглядит следующим образом:

  • Введите ls / path / to / intented / file_or_directory в окне терминала и нажмите верните (или Tab , если хотите), чтобы увидеть список файлов.

Если все в порядке,

  • нажмите кнопку стрелку вверх , чтобы открыть ls / path / to / intented / file_or_directory из истории терминала снова.

  • замените ls на rm или rm -r или rm -rf , если требуется. Я лично не люблю использовать флаг -f .

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

1
ответ дан 28 November 2019 в 19:17

Поскольку это на «Serverfault», я хотел бы сказать следующее:

Если у вас есть десятки или больше серверов, с большой командой администраторов / пользователей, кто-то направляется в rm -rf или chown неправильный каталог.

У вас должен быть план восстановления затронутой службы с наименьшим возможным средним временем восстановления.

30
ответ дан 28 November 2019 в 19:17

Это мой стандарт специально для регулярных выражений в контексте rm, но в этом случае он бы вас спас.

Я всегда делаю echo foo * / [0- 9] * {bar, baz} * сначала, чтобы увидеть, чему будет соответствовать регулярное выражение. Получив результат, я возвращаюсь к редактированию в командной строке и меняю echo на rm -rf . Я никогда, никогда не использую rm -rf для непроверенного регулярного выражения .

11
ответ дан 28 November 2019 в 19:17

Это может быть сложно, но вы можете настроить роли в SELinux, чтобы даже если пользователь становится пользователем root через sudo su - (или простой su), возможность удаления файлы могут быть ограничены (вы должны войти в систему напрямую как root, чтобы удалить файлы). Если вы используете AppArmor, вы можете сделать что-то подобное .

Конечно, другим решением будет убедиться, что у вас есть резервные копии. :)

2
ответ дан 28 November 2019 в 19:17

Одним из важных факторов, позволяющих избежать ошибок такого типа, является отказ от входа в систему с использованием учетной записи root. Когда вы входите в систему с использованием обычного непривилегированного пользователя, вам необходимо использовать sudo для каждой команды. Так что будьте осторожнее.

3
ответ дан 28 November 2019 в 19:17

Хе-хе (непроверено и несколько шутливо!):

$ cat /usr/local/bin/saferm

#! /bin/bash

/bin/ls -- "$@"

echo "Those be the files you're about to delete."
echo "Do you want to proceed (y/N)?"

read userresponse

if [ "$userresponse" -eq "y" ]; then

  echo "Executing...."
  /bin/rm -- "$@"

fi

А затем:

alias rm="/usr/local/bin/saferm"

На самом деле, вы должны сделать мысленную паузу перед выполнением такого рода операции с глобусом, независимо от того, запускается от имени root, добавляя к нему "sudo" и т. д. Вы можете запустить "ls" для того же глобуса и т. д., но мысленно вы должны остановиться на секунду, убедиться, что вы набрали то, что хотели, сделать уверен, что то, что вы хотите, на самом деле то, что вы хотите, и т.д. плита может быть горячей.

И убедитесь, что у вас есть хорошие резервные копии!

0
ответ дан 28 November 2019 в 19:17

Похоже, что лучший способ снизить этот риск - это использовать двухэтапное удаление, как в большинстве графических интерфейсов пользователя. То есть замените rm чем-то, что перемещает вещи в корзину (на том же томе). Затем очистите этот мусор, когда пройдет достаточно времени, чтобы заметить любую ошибку.

Одна такая утилита, trash-cli, обсуждается на Unix StackExchange, здесь .

6
ответ дан 28 November 2019 в 19:17

В этой ветке есть действительно плохие советы, к счастью, большинство из них было отклонено.

Прежде всего, когда вам нужно быть root , станьте root - sudo, и различные уловки с псевдонимами сделают вас слабее. И что еще хуже, они сделают вас неосторожным. Научитесь делать все правильно, перестаньте полагаться на псевдонимы, чтобы защитить вас. Однажды вы получите root-права на коробке, у которой нет ваших тренировочных колес, и что-нибудь взорвете.

Во-вторых, когда у вас есть root-права, представьте себя водителем автобуса, полного школьников. Иногда ты можешь раскачиваться под песню по радио,

14
ответ дан 28 November 2019 в 19:17

Просто используйте ZFS для хранения файлов, которые вам нужны, чтобы противостоять случайному удалению, и иметь демон, который:

  • регулярно делает снимки этой файловой системы.
  • удаляет старые / ненужные снимки.

Если файлы были удалены, перезаписаны, повреждены, что угодно, просто откатите файловую систему до клона последнего удачного снимка, и все готово .

0
ответ дан 28 November 2019 в 19:17

Самый простой способ предотвратить случайное rm -rf / * - это полностью отказаться от использования команды rm ! На самом деле, у меня всегда было искушение запустить rm / bin / rm , чтобы полностью избавиться от команды! Нет, я не шучу.

Вместо этого используйте параметр -delete команды find , но сначала, прежде чем удалять файлы, я рекомендую предварительно просмотреть, какие файлы вы будет удалено:

find | less

Обратите внимание, что в современных версиях find , если вы не укажете имя каталога, он будет неявно использовать текущий каталог, поэтому приведенное выше эквивалентно:

find . | less

Убедившись, что это файлы, которые вы хотите удалить, вы можете добавить параметр -delete :

find path/to/files -delete

Таким образом, не только find безопаснее использовать,

15
ответ дан 28 November 2019 в 19:17

ZSH спрашивает меня (по умолчанию) перед выполнением rm -rf * .

2
ответ дан 28 November 2019 в 19:17

ليس إجابة كثيرًا ولكن نصيحة ، أفعل دائمًا rm (dir) -rf لا rm -rf (dir) أي: لا تذهب نوويًا حتى آخر لحظة ممكنة.

فهي تساعد في التخفيف من المواقف التي تضغط فيها على اسم dir بحيث يظل حذفًا صالحًا ، مثل الانزلاق والضغط على مفتاح الدخول.

0
ответ дан 28 November 2019 в 19:17

للأسف ، لا يمكنني ترك تعليق أعلاه بسبب عدم كفاية الكارما ، لكني أردت تحذير الآخرين من أن Safe-rm ليست دواءً سحريًا لكوابيس الحذف الجماعي العرضي.

تم اختبار ما يلي في جهاز ظاهري Linux Mint 17.1 (تحذير لمن ليسوا على دراية بهذه الأوامر: لا تفعل ذلك! في الواقع ، حتى أولئك الذين يعرفون هذه الأوامر يجب / ربما لن يفعلوا ذلك أبدًا لتجنب فقدان البيانات الكارثي):

نسخة نصية ( مكثف):

$ cd /
$ sudo safe-rm -rf *
$ ls
bash: /bin/ls: No such file or directory

إصدار صورة (ممتلئ):

enter image description here

1
ответ дан 28 November 2019 в 19:17

Мне нравится оконный подход к мусорной корзине.

Обычно я создаю каталог с именем "/tmp/recyclebin" для всего, что мне нужно удалить:

mkdir /tmp/recyclebin

И никогда не использую rm -rf, я всегда использую:

mv target_folder /tmp/recyclebin

Затем позже я опустошаю мусорную корзину с помощью скрипта или вручную

.
1
ответ дан 28 November 2019 в 19:17

Я думаю, что это мощный совет по предотвращению с помощью * ярлыка расширения в оболочке:

Сначала введите rm -rf * или rm -rf your / path / * , НЕ вводите Введите ключ . (конечно, вы должны иметь привычку не нажимать Enter быстро / случайно при использовании rm -rf )

Затем нажмите Alt-Shift-8 (т.е. Alt-Shift - * ) для явного расширения подстановочного знака «*» в bash. Это также позволит избежать повторного ввода команды «rm -rf *» при навигации по истории.

Наконец, после проверки расширения, есть правильные файлы / каталоги, нажмите Enter.

Готово.

0
ответ дан 28 November 2019 в 19:17

В случае, если это поможет кому-то в его собственном случае:

1. Используйте rmsafe:

Он перемещает файлы в "мусорную" папку, и у вас всегда есть возможность вернуть их обратно с помощью простого mv:

$ rmsafe /path/to/important/files

Source: https://github.com/pendashteh/rmsafe

2. Используйте safe:

Вы можете установить псевдоним для rm, используя safe:

$ alias rm="safe rm"

Теперь, если вы запустите rm /*, вы получите это в ответ:

$ rm /*
Are you sure you want to 'rm /bin /boot /data /dev /etc /home /initrd.img /lib /lib64 /mnt /opt /proc /root /run /sbin /srv /sys /tmp /usr /var'? [y/n]

и я полагаю, что вы не наберете y!

Source: https://github.com/pendashteh/safe

0
ответ дан 28 November 2019 в 19:17

Я просто написал свой собственный сценарий, который может просто предупреждать и запрашивать подтверждение для любого типа ситуации, только вам решать, как его улучшить

#!/bin/sh
# just sudo mv /usr/bin/rm to /usr/bin/rm-original

path=${!#}

color_yel="\x1b[1;33m"
color_rst="\x1b[0m"

function get_yn() {
    read i
    if [ "$i" != "y" ]; then echo "aborted."; exit 1; fi
}

if [ -d ${path} ]; then
    echo -e "${color_yel}You are deleting a folder, it's potentially dangerous, are you sure (y/n) ?${col>
    get_yn
    /usr/bin/rm-original $@
fi

Дальнейшая идея по улучшению:

  • проверьте определенные флаги и пути
  • переместите в корзину и удалите
  • пустые старые вещи из корзины через некоторое время

Таким образом, простой настраиваемый скрипт позволяет иметь любое особое поведение и избегать установки дополнительных пакетов.

Обладая некоторыми знаниями о bash, вы можете удалять только определенные вещи.

0
ответ дан 16 December 2019 в 07:48

Теги

Похожие вопросы