Запретить пользователю вводить случайное пространство между rm и wildcard

Намерение:

rm -rf string* 

Проблема:

 rm -rf string * 

Первый случай – это законное и распространенное использование rm, небольшая опечатка может вызвать множество проблем во втором случае. Есть ли простой способ надежно защитить от случайного трейлинг-кода или главного шаблона?

  • Как далеко вы получите команду «rm -rf /»?
  • Как удалить все файлы, кроме одного в Unix?
  • Удалите все файлы, кроме одного с rm
  • Linux - не может удалить принадлежащий ему файл с 777 правами доступа
  • Mac-клавиатура для rm-файла
  • Как ограничить использование процессора и диска rm, чтобы другие программы оставались функциональными
  • Отменить команду «rm -rf ~»?
  • Отменить Linux rm?
  • 11 Solutions collect form web for “Запретить пользователю вводить случайное пространство между rm и wildcard”

    DEBUG можно записать, чтобы отменить команды, которые выглядят подозрительными. В ваш ~/.bashrc можно добавить следующий код или код, похожий на него:

     shopt -s extdebug checkcommand() { if [[ $BASH_COMMAND = 'rm -r'*' *' ]]; then echo "Suppressing rm -r command ending in a wildcard" >&2 return 1 fi # check for other commands here, if you like return 0 } trap checkcommand DEBUG 

    Откорректируйте логику по вкусу.

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

    Нет никакого способа полностью пуленепробиваемой системы. И добавив: «Вы уверены?» Подсказки к чему-то также контрпродуктивны и приводят к «Конечно, я уверен». Коленейные реакции.

    Трюк, который я взял из книги в прошлые годы, – это сначала сделать ls -R blah* тогда rm -fr blah* если и только если список, который появился, попал в то, что я хотел получить.

    Достаточно легко выполнить команду ls , затем , удалить ls -R и заменить на rm -fr .

    Последний вопрос: «Если информация была ценна для вас, где ваша резервная копия?»

    Можете ли вы rmrf использовать, скажем, rmrf вместо rm -rf ?

    Если это так, эта функция bash предоставит вам возможность увидеть, что на самом деле произошло до подтверждения команды:

     rmrf() { echo rm -rf "$@"; read -p "Proceed (y/N)? "; [ "${REPLY,,}" = y ] && rm -rf "$@"; } 

    Чтобы сделать эту функцию постоянной, добавьте эту строку в файл ~/.bashrc на каждом компьютере, который вы используете.

    Сравнение с общим псевдонимом rm

    Обычно определяется псевдоним:

     alias rm='rm -i' 

    Это имеет два ограничения:

    1. Если вы зависете от этого псевдонима, тогда вы окажетесь в шоке, когда находитесь на машине или в среде, в которой ее нет. Напротив, попытка запустить rmrf на машине без этой функции вернет безобидную command not found .

    2. Этот псевдоним не поможет в вашем случае, потому что параметр -f который вы поставляете в командной строке, переопределяет параметр -i в псевдониме.

    Если я нахожусь в ситуации, когда удаление неправильных файлов – это действительно большое дело, одна из вещей, которые я сделал, это сделать папку trashcan, например mkdir trashcan , а затем у меня есть сценарий rmTrashcan который имеет rm -rf trashcan/* Или rm -rf * или аналогичный, написанный очень тщательно и проверенный несколько раз.

    Таким образом, если я ошибаюсь, ошибка заключается в команде mv , а не в команде rm . Как только я сделаю ls и уверен , что именно я rmTrashcan , rmTrashcan действительно делает грязную работу безопасно.

    Это было также чрезвычайно удобно для ситуации, когда мне приходилось удалять резервные копии. Я мог mv целый месяц резервных копий в trashcan, mv те немногие, что я хотел сохранить (1-й месяц, 15-й месяц) обратно в резервные копии, а затем rmTranshcan остальные. Выполнение подобной команды трудно сделать с помощью rm самостоятельно, и таким образом позвольте мне сделать резервные копии уверенными в том, какие файлы я оставляю (вместо того, чтобы просто перечислять файлы, которые я намерен удалить)

    Вместо того, чтобы беспокоиться о двух командах ( ls и rm ), я считаю, что проще и проще использовать find :

     find . -maxdepth 1 -name "string*" -delete 

    Если вы случайно наберете "string *" он удалит файлы с именами string chars и string letters (это то, что вы хотели в любом случае), но он не будет захватывать каждый файл, как * в оболочке.

    Кроме того, вы можете оставить файл -delete чтобы посмотреть, какие файлы он собирается удалить, затем нажмите стрелку вверх и введите -delete проще, чем наберите ^ls -R^rm -rf или другую бессмысленность.

    Есть ли простой способ надежно защитить от случайного трейлинг-кода или главного шаблона?

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

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

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

    Если вы работаете в системе, в которой вы только один, доступ к ней, у вас может возникнуть соблазн просто chmod 777 , но это не так, как настроена рациональная система. Вместо этого разрешения должны быть примерно 755 для всех каталогов и 644 для всех неисполняемых файлов. Исполняемые файлы должны быть как минимум 755 , но, возможно, даже 744 если вы хотите, чтобы другие читали, но не запускали файлы.

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

    Rm имеет -i и -I флаги для подтверждения перед каждым удалением. В прошлом некоторые дистрибутивы включили их по умолчанию. Это ужасная идея. Дайте пользователю слишком много диалоговых окон подтверждения для обычных операций, и они начнут их обычно подтверждать. Это просто смещает требование «быть осторожным» (всегда красным флагом) в новый и более раздражающий диалог. Да, да. Да, да! Да, черт возьми, глупый компьютер просто удаляет файлы. YESYESYESYESYES – CRAP Я НЕ НУЖДАЮ! NOOOOOOO! Это диалогическая проблема «Да, но я не имею в виду». Этот ответ дает наглядное объяснение того, почему диалоги подтверждения происходят не в то время.

    Ошибочная ошибка, которую вы описываете, – это промах , «исполнение действия, которое не было тем, что предназначалось». Пользователь обычно сразу распознает ошибку и точно знает, как ее исправить. К сожалению, Unix не дает пользователю возможности, rm немедленно удаляет файл. Каждая другая операционная система решает эту проблему, позволяя удалять исключения, по крайней мере на некоторое время, с помощью Trash.

    Для Unix существуют различные системы мусора, и этот ответ полон предложений .

    Вопрос заключается в псевдониме rm или не в alias rm. Плюсы к aliasing rm …

    1. Вы не можете заставить забыть использовать альтернативу rm.

    Недостатки в aliasing rm …

    1. Вы можете рассчитывать на это на системах, у которых их нет.
    2. Может возникнуть проблема, когда диск почти заполнен.
    3. Нужна инфраструктура для периодического опорожнения мусора.
    4. Обязательно не вмешиваться в ожидаемое поведение rm в программах.
    5. Может не полностью эмулировать rm.

    Если вы следуете за первым аргументом слишком далеко, вы завершаете использование vi (не vim, vi), csh (not tcsh, csh) и других устаревших утилит, потому что они универсально доступны. Тем не менее, существует опасность перенастройки вашей среды. Я предпочитаю взять с собой мои утилиты и сделать это как можно проще. YMMV.

    Два и три являются техническими проблемами. Их можно решить с помощью умной работы с жнецами, которая проверяет размер мусора и периодически очищает вещи, похожие на tmpreaper . Это может быть задание cron, или более умная версия может использовать различные инфраструктурные события файловой системы, доступные на многих настольных Linux-дистрибутивах. Это непросто и еще сложнее сделать эффективно. Лучше найти существующую систему, чем пытаться сделать свой собственный.

    Четвертый может быть рассмотрен, сделав ваш новый rm псевдонимом оболочки, alias rm='trash' , тогда это не повлияет на программы.

    Пятый – проблема, которую я оставляю читателю для решения. У rm нет много переключателей.

    Я учу всех о !$ Последнем аргументе в последнем командном трюке:

     % ls job[XYZ].* jobX.out1 jobX.out2 [rest of the matches] % rm !$ 

    Это позволяет проверять расширение подстановочного знака, а затем использовать тот же шаблон шара без возможности вставки пробела перед * .

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

    Технология в моей лаборатории только что совершила эту ошибку на прошлой неделе (3 месяца работы) – и да, у нас была резервная копия (на 1 день).

    Кажется, все говорят: «Будьте осторожны», «Не делайте подсказки псевдонимов / подтверждения, потому что вы привыкнете не уделять должного внимания».

    Круто, и все. Я имею в виду, я не думаю, что вы должны сделать псевдоним для rm (или rmrf , поскольку вы можете легко ввернуть это и ввести настоящую команду).

    Но почему вы не можете создать псевдоним / скрипт и называть его, скажем, remove и подавать только один аргумент (например, 1 доллар США)? Подстановочный знак должен быть $ 2 из-за непреднамеренного пространства (amiright?), И, таким образом, ваш скрипт / обертка / псевдоним не будет передаваться второй. Да, вы можете сделать только один набор исключений (с подстановочным знаком) за раз, но это цена, которую вы заплатили.

    Если бы я писал что-то хорошее, я мог бы сказать ему количество файлов и каталогов, которые он планирует удалить, и общий размер материала, который я удаляю, а затем попросить подтверждение, но это может помешать вашему потоку. Может быть, сделать этот флаг опцией для remove ? (-я). Вы также можете выполнить проверку $ 1, чтобы увидеть, является ли это всего лишь одним шаблоном и запросить подтверждение, и укажите, в каком каталоге вы находитесь.


    В стороне есть ряд замен rm . Многие пытаются быть совместимыми с деревом пользовательского интерфейса. Некоторые из них, возможно, стоит посмотреть.

    Очень простой трюк – положить -rf в конец: rm whatever* -rf
    Это уменьшает вероятность ошибки, потому что вы вводите больше символов после * , поэтому у вас больше времени, чтобы увидеть опечатки.
    Это не решает все. Просто простой трюк.

    Interesting Posts

    Какие свойства / функции следует искать в хорошем SSD-накопителе?

    Использование 32-разрядного приложения на 64-битной

    Как отключить колесо прокрутки мыши в Windows Vista

    Причина «Журнала контекстного ядра сеанса» не удалось запустить ошибку в журнале событий?

    Как записать DMG на ПК с ОС Windows?

    Восстановить данные на жестком диске?

    Почему OS X Lion запрашивает мой пароль всякий раз, когда я удаляю файл в своем домашнем каталоге?

    Размытое / нечеткое / удвоенное изображение

    Запустить повышенную командную строку в% UserProfile% по умолчанию?

    Экран мерцает на Windows 8.1 HP laptop

    Включение удаленных рабочих станций Список последних подключений (список переходов)

    Что случилось с моим пользовательским кабелем LAN?

    Где мое дисковое пространство?

    Как добавить новые приложения в список «Установить программы по умолчанию» в Windows Vista / 7?

    Каковы мои лучшие возможности для восстановления данных с неисправной микрокарты SD (используемой на сотовом телефоне Android)?

    Давайте будем гением компьютера.