Защитить от случайного удаления - PullRequest
1 голос
/ 12 июня 2009

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

В его случае файл с именем '~' каким-то образом попал в тестовую папку, которую он после удаления удалил с помощью rm -rf ... когда rm прибыл в файл, bash развернул его в своей домашней папке (ему удалось CTRL-C). почти вовремя). Подобная проблема может возникнуть, если у вас есть файл с именем '*'.

Моей первой мыслью было предотвратить создание файлов с «опасными именами», но это все равно не решило бы проблему, так как mv или другие ситуации могут привести к опасной ситуации.

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

  1. принять все непараметрические аргументы (чтобы получить файлы, которые нужно удалить)
  2. цикл на этих предметах
  3. проверить, равен ли текущий элемент опасному элементу (например, '~' или '*'), не знаю, работает ли он, на данный момент элемент уже расширен или нет?
  4. если это так, эхо сообщения, ничего не делать с файлом
  5. продолжить итерацию

Третья мысль: кто-нибудь уже сделал или имел дело с этим? :]

Ответы [ 10 ]

7 голосов
/ 12 июня 2009

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

2 голосов
/ 12 июня 2009

Аварии случаются. Вы можете только уменьшить их влияние.

И контроль версий (регулярные проверки), и резервные копии имеют жизненно важное значение.

Если я не могу зарегистрироваться (потому что он еще не работает), я делаю резервную копию на USB-накопитель.

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

2 голосов
/ 12 июня 2009

Так как оболочка, вероятно, расширяет параметр, вы не можете действительно поймать такие «опасные» имена.

Вы можете использовать псевдоним «rm -rf» для «rm -rfi» (интерактивный), но это может быть довольно утомительно, если вы на самом деле имеете в виду «rm -rf *».

Вы можете использовать псевдоним 'rm' для 'mv $ @ $ HOME / .thrash' и использовать отдельную команду для очистки трэша, но это может вызвать проблемы, если вы действительно хотите удалить файлы из-за дисковых квот или аналогичных ,

Или вы можете просто сохранить надлежащие резервные копии или использовать файловую систему, которая допускает "восстановление".

1 голос
/ 12 июня 2009

Одна вещь, которую я делаю, всегда имеет файл с именем "-i" в моем $ HOME.

Мой другой совет - всегда использовать "./*" или find вместо простого "*".

0 голосов
/ 15 июня 2009

Я использую это в моем ~ / .basrc

псевдоним rm = "rm -i"

rm запрашивает перед удалением чего-либо, и псевдоним можно обойти либо с помощью флага -f, либо путем экранирования, например \ rm файл

Ухудшает проблему да; решает это нет.

0 голосов
/ 12 июня 2009

Вы можете отключить генерацию имени файла (globbing):

set -f 

Экранирование специальных символов в путях к файлам может быть сделано с помощью встроенных команд Bash:

filepath='/abc*?~def' 
filepath="$(printf "%q" "${filepath}")" 
filepath="${filepath//\~/\\~}" 
printf "%s\n" "${filepath}" 
0 голосов
/ 12 июня 2009

Это довольно странное поведение - почему bash расширяется вдвое?

Один раз * расширился до

old~
this~
~

тогда никакой замены не должно быть!

Я смело проверил это на своем Mac, и он просто удалил ~, а не мой домашний каталог.

Возможно ли, что ваш коллега как-то написал код, который расширил его дважды?

например.

ls | xargs | rm  -rf
0 голосов
/ 12 июня 2009

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

Это не помешает фактическому удалению, но минимизирует потерю работы в ряде случаев.

0 голосов
/ 12 июня 2009

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

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

0 голосов
/ 12 июня 2009

Предложение по управлению версиями получает от меня отклик. Я бы рекомендовал это для всего, а не только для источника.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...