Лучшие практики для псевдонима команды rm и повышения ее безопасности

21

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

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

Теперь я планирую сделать сценарий в качестве псевдонима для rm.

Есть ли у вас лучшие рекомендации, чтобы предложить?

Спасибо.

Винченцо Пии
источник
7
Не то чтобы у меня не было сочувствия, но я не думаю, что rmэто опасная команда, требующая псевдоним для безопасности. При использовании rи fопции, вы сообщаете оболочку , я знаю , что это опасно, и я тщательно думал об этом, и это _really_ то , что я хочу сделать . Если вы не используете эти параметры, вы не можете удалить всю свою домашнюю папку с ним.
user26512
Охватывает ли этот вопрос ту же информацию, что и stackoverflow.com/questions/373156/… ?
Дэвид Харрис
1
@grossvogel без обид принято :)! Однако использование псевдонимов этой команды является обычной практикой. Многие люди используют опцию -f, чтобы избежать подтверждения каждого удаления.
23
Обратите внимание, что если вы используете псевдоним, rmвы привыкнете к этому псевдониму. И вот однажды вы окажетесь в системе, в которой псевдоним не существует, и вы будете поступать неправильно, когда вы меньше всего этого ожидаете. И это, вероятно, не будет вашей системой.
Стефан Ласевский
2
@puller только на системах , таких как RHEL , что Тупо псевдоним rmк rm -i.
Даниэль Бек

Ответы:

30

Если вы хотите настроить rm, не называть его , rmно имя твое, myrm, deleteили любой другой .

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

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

Быстрая альтернатива, которая защитит вас от случайного удаления или перезаписи файла, - это использование файловой системы, поддерживающей неограниченное количество снимков, таких как ZFS. Если частые снимки делаются автоматически, вы можете восстановить файлы в том состоянии, в котором они находились во время последнего снимка перед инцидентом.  

jlliagre
источник
3
Я слышал эту ужасную историю лично от одного из тех, кто перенес ее.
Дэн Д.
Я согласен, но большинство людей не вправе переключаться на совершенно другую файловую систему.
Пеон
На самом деле, это причина, по которой я сначала предлагаю сделать резервные копии, функция, которую не запрещает ни одна файловая система.
Jlliagre
12

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

alias rm='echo "rm is disabled, use remove or trash or /bin/rm instead."'

Затем вы можете создать свой собственный безопасный псевдоним, например,

alias remove='/bin/rm -irv'

или использовать trashвместо.

Дарио Сеидл
источник
2
Обратите внимание, что (по крайней мере, в некоторых версиях) вы должны определить псевдонимы в другом порядке. Делать это в указанном вами порядке определяет removeкак echo "rm is disabled, use trash or /bin/rm instead." -irv. И, как здравый смысл, разве вы не хотите, чтобы сообщение rmссылалось на вашу безопасную removeкоманду?
Скотт
Вы правы, я обновлю ответ соответственно.
Дарио Сейдл
5

Вы можете попробовать использовать trashвместо этого. Просто не забудьте опустошать его время от времени ...

l0b0
источник
3

Без необходимости изменения профиля anyones вы можете поместить в каталог файл с именем -i.

# touch -- -i
# ll
total 0
-rw-r--r-- 1 root users  0 Jan 26 19:24 files
drwxr-xr-x 2 root users 40 Jan 26 19:24 folder_of_power
-rw-r--r-- 1 root root   0 Jan 26 19:25 -i
-rw-r--r-- 1 root users  0 Jan 26 19:24 important
-rw-r--r-- 1 root users  0 Jan 26 19:24 very
# rm -rf *
rm: remove regular empty file `files'? 
Темное сердце
источник
Не будет работать, если пользователь решит использовать *. * вместо *. Но все же ловкий трюк.
Peon
1
афаик рм -рф. ни rm -rf .. не может быть успешным, потому что вы в данный момент находитесь в каталоге.
Peon
@Peon: я полагаю, что вы имеете в виду .* *, а не * .*(что я считаю более распространенным) или * . *(что вы сказали). …………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………… чтобы эта техника была действительно эффективной во всем мире, вам нужно будет делать это в каждом каталоге, где у вас есть разрешение на запись , Но я согласен, это хитрый трюк.
Скотт
1

Я использую следующий скрипт.

#!/bin/sh

trash=$HOME/tmp
mv "$@" $trash
nohup find "$trash" -type f -atime +7 -exec /bin/rm '{}' \; 2>&1 &

Если вы случайно удалили файл, восстановите его из $HOME/tmp.

Сценарий перемещает удаленные файлы в tmpкаталог и удаляет их при следующем запуске сценария удаления, если время доступа составляет 7 дней (полуавтоматическая очистка $HOME/tmpкаталога).

user580224
источник
-2

В вашем профиле

alias rm="rm -i"

источник
3
Aliasing rm, на мой взгляд, очень плохой совет, и в любом случае это не поможет.
Jlliagre
rm -Iдает лучшее из обоих миров, @jlliagre.
Тамара Вийсман
@ Tom Wijsman, отчасти так и есть. Изменение поведения критической стандартной команды Unix все еще остается потенциальным риском. Если вы хотите, чтобы он был интерактивным, присвойте псевдониму другое имя.
Jlliagre
@jlliagre: Хм, ты имеешь в виду, что скрипты ловят это изменение?
Тамара Вийсман
Пожалуйста, прочитайте мой ответ superuser.com/a/382498/19279, чтобы получить мою точку зрения.
Jlliagre
-2

Сценарий называется dс содержанием mv $* /tmp.

редактировать: это плохая идея; увидеть ниже. Я в настоящее время имею alias d='mv -t /tmp'в моем .profileвместо этого.

beefus
источник
2
Это предложение опасно и может а) переопределить уже уничтоженные файлы с тем же именем или б) удалить совершенно неправильные файлы ( d "foo bar"удалит файлы fooи bar). Возможно, что-то безопаснее #!/bin/bash TRASH="$( mktemp -d -t trashed.XXX )"; echo "Moving to trash $TRASH"; mv -v -- "$@" "$TRASH"( mktempи mvсинтаксис зависит от вашей системы, этот работает для Linux).
Даниэль Бек
2
Спасибо за объяснение. Я в порядке с проблемой а), но проблема б) является большой проблемой. Я изменил свою dкоманду на alias d='mv -t /tmp'мой .profile; Я думаю, что это простое решение, которое я искал.
beefus
-2

Этот код bash добавляет функцию rmв ваш ~/.bash_profileфайл конфигурации. После запуска этого, если вы напишите rm file, вы переместите этот файл в/tmp

cat << EOF >> ~/.bash_profile
rm () {
  mv $1 /tmp
}
EOF
Висенте Гонсалес
источник
1
Что делает этот скрипт / код? Пожалуйста, объясните, чтобы менее технический пользователь мог понять ваш ответ.
Vylix
2
Хотя это может дать ответ на вопрос, было бы лучше, если бы вы могли объяснить, почему это так.
DavidPostill
1
Это дает ответ на вопрос, но он очень плохой. Две лучшие версии этого ответа уже были опубликованы.
Скотт
Этот код bash добавляет функцию rmв ваш ~/.bash_profileфайл конфигурации. После запуска этого файла, если вы напишите rm file, вы переместите этот файл в /tmp.
Висенте Гонсалес
Спасибо за объяснение. Не могли бы вы отредактировать свой ответ, чтобы включить его в само сообщение?
Бен Н