先日、Webサーバーでいくつかのメンテナンスタスクを実行していました。私は急いで眠くなっていたので、Sudo
コマンドを使用してすべてを行いました。
そして、誤って押した Ctrl+V、このコマンドをWebサーバーに送信します。
Sudo rm -rf /*
上記のコマンドが何をするのか疑問に思う人のために:これは私のwhole web serverを削除しました
幸いなことに、バックアップがありましたが、悲しいことに、このすばらしいエラーを修正するために、さらに2時間目を覚まさなければなりませんでした。しかし、それ以来、私は疑問に思っていました:
特定のコマンドに常にSudoパスワードを適用する方法はありますか?
サーバーからパスワードの入力を求められた場合、多くのトラブルから身を守ることができます。この巨大なエラーの前に約5個のSudo
コマンドを実行したため、そうではありませんでした。
だから、それを行う方法はありますか?常に強制されるrm
コマンドでパスワードが必要です。私が使用している他のコマンドは通常nano
またはcp
で、両方とも(ある程度)復帰可能です。
timestamp_timeout
の特定のコマンドに対して、0
を/etc/sudoers
に設定できます。次の内容のファイルvisudo -f /etc/sudoers.d/pduck
を作成します。
Cmnd_Alias DANGEROUS = /bin/rm
Defaults!DANGEROUS timestamp_timeout=0
pduck ALL = (ALL:ALL) DANGEROUS
これで、ユーザーがpduck
グループおよびSudo
のメンバーであっても、Sudo rm
の実行時に(追加のパラメーターが指定されていても)ユーザーSudo
に常にパスワードが要求されます。他のコマンドのパスワードを記憶しています。
欠点は、ファイルの/bin/rm
行にパラメーターを簡単に追加してこれをさらに制限できないことです。まあ...あなたは、次のようにすることができます:
Cmnd_Alias DANGEROUS = /bin/rm -f
しかし、その後、ちょうど[もう一度] Sudo rm -f
ではなく、正確にSudo rm -rf
のプロンプトが表示されます。
1つの方法は、 safe-rm を使用することです。これは、「rm」の使用を制限し、「rm」の特定のバージョンが実行されるのを防ぐだけです。これにはルートシステムの削除が含まれますが、「/ usr /」や「/ var /」などのシステム関連ディレクトリの削除を防ぐためにも使用できます。リンクから:
重要なファイルの偶発的な削除の発生
Safe-rmは、
/bin/rm
をラッパーで置き換えることにより、重要なファイルを誤って削除することを防ぐための安全ツールです。これらの保護されたファイルまたはディレクトリのいずれかを削除しようとすると、ユーザーは削除できず、代わりに警告メッセージが表示されます。
$ rm -rf /usr Skipping /usr
(保護されたパスは、サイトレベルとユーザーレベルの両方で設定できます。)
誤って削除した重要なファイルを復元するのは非常に困難です。 safe-rmをインストールして今日の自分を守り、データ復旧サービスに連絡する必要性を減らしましょう!
Sudo
はオプション-k, --reset-timestamp
を提供します。 man Sudo
を参照してください:
パスワードを必要とする可能性のあるコマンドまたはオプションと組み合わせて使用すると、このオプションにより、Sudoはユーザーのキャッシュされた資格情報を無視します。その結果、Sudoはパスワードを要求し(セキュリティポリシーでパスワードが必要な場合)、ユーザーのキャッシュされた資格情報を更新しません。
rm -rf /*
をテストして実行するSudo
の簡単なラッパーを書くことができます
Sudo -k rm -rf /*
代わりに、例えばこのような:
Sudo ()
{
[[ "$*" == "rm -rf /*" ]] && opt="-k";
/usr/bin/Sudo $opt "$@"
}
ここでecho a
でテストします。
$ Sudo echo
[Sudo] password for dessert:
$ Sudo echo
$ Sudo echo a
[Sudo] password for dessert:
a
$ Sudo echo a
[Sudo] password for dessert:
a
every一般的にrm
を実行する時間を尋ねる場合は、上記の関数を次のように調整できます。
Sudo ()
{
[[ "$1" == "rm" ]] && opt="-k";
/usr/bin/Sudo $opt "$@"
}
combineにしたい場合は、一般的なコマンドコールと特定のコマンドラインの両方を使用します。たとえば、case
の使用をお勧めします。
Sudo ()
{
case "$*" in
rm*) opt="-k" ;;
"mv /home"*) opt="-k" ;;
"ln -s /usr/bin/fish /bin/sh") opt="-k" && echo "Don't you dare!" ;;
*) opt="" ;;
esac;
/usr/bin/Sudo $opt "$@"
}
オプションを使用してSudo
を実行すると、これらのアプローチは機能しないことに注意してください。スペースで囲まれた文字列「rm」をチェックする[[ "$*" =~ " rm " ]]
または「rm」を含むコマンドラインをキャッチするcase
を使用する*" rm "*)
.
この回答では、質問のSudo
部分は取り上げていませんが、一方で、anyユーザーに対する偶発的なrm
呼び出しの危険性を軽減する方法を扱っています。
rm
をrm -I
にエイリアスできます。
-f
を省く限り以前の-I
オプションを上書きします。--one-file-system
は、rm
エイリアスで使用する意図しない削除に対する別の可能な保護手段です。
このようなエイリアスを作成するには、次のコマンドを使用します。
alias rm='rm -I --one-file-system'
~/.bashrc
または/etc/bash.bashrc
に入れることができます。
$ Sudo rm -r /etc/apt/sources.list.d /*
rm: remove all arguments?
タイプyes
またはロケールへの翻訳またはいずれかのWordの最初の文字を確認して、 Enter。 noneを含む他の入力は、操作を中止します。