Кращі практики для псевдоніму команди rm та зробити його більш безпечним


21

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

Я б хотів, щоб у мене був псевдонім для rmкоманди, але це було не так.

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

Чи є у вас якісь найкращі практики, які можна запропонувати?

Спасибі.


7
Не те, що я не співчуваю, але я не думаю rm, що це небезпечна команда, яка вимагає псевдоніму для безпеки. Використовуючи параметри rта fпараметри, ви говорите оболонці, я знаю, що це небезпечно, і я ретельно продумав це, і це справді те, що я хочу зробити . Якщо ви не користуєтесь цими параметрами, ви не можете видалити всю свою домашню папку.
користувач26512

Чи охоплює це запитання та сама інформація, що і 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. Якщо часті знімки робляться автоматично, ви можете відновити файли у стані, який вони були під час останнього знімка перед інцидентом.  


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натомість. Просто пам’ятайте, що час від часу спорожнювати його ...


3

Без необхідності змінювати профіль кожного, що ви можете зробити, це розмістити файл у файлі під назвою -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'? 

Не працює, якщо користувач вирішить використовувати *. * замість просто *. Але все ж акуратний трюк.
Піон

1
afaik rm -rf. ні rm -rf .. не може досягти успіху, оскільки ви зараз перебуваєте в каталозі.
Піон

@ Peeon: Я вважаю, що ви маєте на увазі .* *, а не * .*(що я вважаю більш поширеним) або * . *(що ви сказали). ……………………………………………………………………… Щоб ця методика була справді глобально ефективною, вам потрібно це робити у кожному каталозі, де у вас є дозвіл на запис. . Але я згоден, це акуратний трюк.
Скотт

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каталогу).


-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замість цього.


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

Цей баш-код додає функцію rmу ваш ~/.bash_profileфайл конфігурації. Після запуску цього rm fileфайлу , якщо ви пишете , ви перемістите цей файл у/tmp

cat << EOF >> ~/.bash_profile
rm () {
  mv $1 /tmp
}
EOF

1
Що робить цей скрипт / код? Поясніть, будь ласка, так що менш технічні користувачі можуть зрозуміти вашу відповідь.
Вилікс

2
Хоча це може відповісти на питання, було б кращою відповіддю, якщо ви могли б дати пояснення, чому це так.
DavidPostill

1
Це дійсно дає відповідь на питання, але це дуже бідне. Дві кращі версії цієї відповіді вже опубліковані.
Скотт

Цей баш-код додає функцію rmу ваш ~/.bash_profileфайл конфігурації. Після запуску цього файлу, якщо ви пишете rm file, ви перемістите цей файл у /tmp.
Вісенте Гонсалес

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