На днях я выполнял некоторые задачи по обслуживанию своего веб-сервера. Я спешил и спал, поэтому все делал по sudo
команде.
И затем я случайно нажал Ctrl+ V, отправив эту команду на мой веб-сервер:
sudo rm -rf /*
Для тех, кто интересуется, что делает команда выше: Это удалило весь мой веб-сервер
К счастью, у меня были резервные копии, и, к сожалению, мне пришлось потратить еще два часа на то, чтобы проснуться, чтобы исправить эту удивительную ошибку. Но с тех пор мне стало интересно:
Есть ли способ всегда применять пароль sudo для конкретной команды?
Если сервер попросит у меня пароль, я избавлю себя от многих неприятностей. Это не так, потому что я выполнил около 5 sudo
команд до этой величественной ошибки.
Итак, есть ли способ сделать это? Мне просто нужен пароль, чтобы rm
команда всегда применялась. Другие команды, которые я использую, обычно nano
или cp
которые (до некоторой степени) являются обратимыми.
источник
/*
раскрывается перед передачей в команду rm. Таким образом, команда не видит ни одного аргумента, но список аргументов (/bin /boot /cdrom /dev /etc /home
...)rm
требуется, чтобы команда имела пароль. Они просто хотятsudo
запрашивать один раз каждый раз, когда используется команда rm. Решение вопроса, который вы связали, станет немного раздражающим, когда ваша первая команда будетsudo rm
. Как он попросит вас два пароля, один дляsudo
одного дляrm
.Ответы:
Вы можете установить
timestamp_timeout
To0
для определенных команд/etc/sudoers
. Создайте файлvisudo -f /etc/sudoers.d/pduck
со следующим содержанием:Теперь у пользователя
pduck
всегда запрашивается пароль при запускеsudo rm
(независимо от того, какие дополнительные параметры заданы), даже если пользователь является членомsudo
группы иsudo
запоминает свой пароль для других команд.Недостатком является то, что вы не можете легко добавить параметры в
/bin/rm
строку в файле, чтобы еще больше ограничить это. Ну ... вы можете, как:но тогда вас просто попросят точно,
sudo rm -f
а не (снова)sudo rm -rf
, например.источник
Одним из методов будет использование safe-rm . Это ТОЛЬКО адресует использование «rm» и предотвращает запуск определенных версий «rm». Это включает удаление вашей корневой системы, но также может использоваться для предотвращения удаления системных каталогов, таких как "/ usr /" или "/ var /". По ссылке:
источник
sudo
предоставляет опцию-k, --reset-timestamp
, см .man sudo
:Вы можете написать простую оболочку для
sudo
тестированияrm -rf /*
и запускавместо этого, например, вот так:
Пример использования
Тестирование
echo a
здесь.Если вы хотите, чтобы вас спрашивали при каждом запуске
rm
в целом, вы можете адаптировать вышеуказанную функцию следующим образом:Если вы хотите объединить как общие вызовы команд, так и конкретные командные строки, я рекомендую использовать
case
, например:Обратите внимание, что эти подходы не будут работать, если вы будете работать
sudo
с опциями - возможные решения -[[ "$*" =~ " rm " ]]
проверить строку «rm», заключенную в пробелы, или*" rm "*)
с помощью командыcase
перехватить любую командную строку, содержащую «rm».источник
[[ "$1" == "rm" ]] && opt="-k";
а как насчет/bin/rm
?case
подход.Этот ответ не затрагивает
sudo
часть вашего вопроса, но, с другой стороны, он рассматривает способ уменьшения опасности случайныхrm
вызовов для любого пользователя.Вы можете псевдоним,
rm
кrm -I
которому-f
что отменяет предыдущие-I
параметры.--one-file-system
это еще одна возможная защита от непреднамеренного удаления, которое я использую в своемrm
псевдониме.Настроить
Чтобы создать такой псевдоним, используйте команду:
Вы можете положить его в свой
~/.bashrc
или даже/etc/bash.bashrc
.использование
Чтобы подтвердить ввод
yes
или его перевод на ваш язык или первую букву слова или нажмите Enter. Любой другой ввод, включая ни одного, не прерывает операцию.источник