回答:
systemdベースのLinuxディストリビューションを使用する必要があります。この場合、systemdが実行を拒否(および電源オフ)できるように、poweroffターゲットをマスクできる必要があります。例えば:
systemctl mask poweroff.target
これにより、再起動する場合を除き、システムを完全にシャットダウンできなくなります。何も起こらないことを確認してください。
この場合、このVMの仮想電源スイッチは、システムをシャットダウンすることさえできなくなります。しかし、まだ完全に再起動します。
もちろん、変更を元に戻すには、ターゲットをマスク解除するだけです。その後、システムをシャットダウンできます。
systemctl unmask poweroff.target
systemctl
引数なしで実行します。すべてのアクティブなユニット、そのステータス、および説明がリストされます。追加する--all
と、アクティブではないユニットもリストされます。
man systemd.special
。
これを実現する方法はいくつかあります。1つは、sudoを使用してコマンドを実行し、パスワードを入力する必要がある通常の非特権アカウントで作業することです。次に、次の行を/ etc / sudoersに追加します(visudoを実行)。
## user is allowed to execute reboot -r only
jdoe ALL=NOPASSWD: /sbin/shutdown -r *
また、sudo認証情報のキャッシュを無効にするには、次も追加します。
Defaults timestamp_timeout=0
これにより、以前にsudoを使用してコマンドを呼び出した場合の資格情報のキャッシュが防止されます。
例:
[root@ops ~]# su - jdoe
[jdoe@ops ~]$ sudo shutdown -c
[sudo] password for jdoe:
[jdoe@ops ~]$ sudo shutdown -r +10
Shutdown scheduled for Mon 2018-09-03 18:51:13 IDT, use 'shutdown -c' to cancel.
[jdoe@ops ~]$ sudo shutdown -H
[sudo] password for jdoe:
^[[A[jdoe@ops ~]$ sudo shutdown -c
[sudo] password for jdoe:
上記の例では、実行時にパスワードを入力する必要はありませんでしsudo shutdown -r +10
たが、残りはパスワードを入力する必要がありました。コマンド(sudo shutdown -r +10
)の前にsudoと入力する必要をなくしたい場合は、.bash_profileまたは.bashrcに次を追加します。
alias shutdown="sudo shutdown"
例:
[jdoe@ops ~]$ source ~/.bash_profile
[jdoe@ops ~]$ shutdown -r +10
Shutdown scheduled for Mon 2018-09-03 19:03:14 IDT, use 'shutdown -c' to cancel.
[jdoe@ops ~]$ shutdown -c
[sudo] password for jdoe:
必要に応じて、非特権アカウントで作業し、sudoでエスカレーションすることがベストプラクティスであることに注意してください。
sudo
のデフォルト設定では、最初の呼び出し後しばらくの間、資格情報がキャッシュされます。これはroot
、ユーザーセッションで必要なコマンドの繰り返し実行時に便利です。このようなセッションでは(または実際にroot
シェルが実行されている場合)、コマンドを処理しshutdown
、チェックをバイパスすることは完全に可能です。
shutdown -r
しているため、実行すると資格情報は入力されないためキャッシュされません。上記の例を見てください。実行した後にa が表示され、パスワードの入力を求められました。sudo shutdown -r ...
sudo shutdown -H
sudo
いて、NOPASSWD
操作ではなかったシナリオを考えてください。たとえば、構成ファイルをルートとして編集するための呼び出し。この場合、パスワードはキャッシュされ、次の呼び出しが行われますsudo shutdown -H
。sudo
これを回避するには、パスワードのキャッシュを無効にする必要があります。
molly-guardと呼ばれるツールがあり、シャットダウンまたは再起動するマシンのホスト名を指定する必要があります。
Debianを使用していない場合、プログラムがかなり原始的であることを考えると、ソースからコンパイルするのは簡単なはずです。
事故を防止するためにRHELベースのディストリビューションは、既にのエイリアスを設定しrm
、cp
およびmv
rootユーザーによって実行されるときには、幾分より破壊的であることができます。
たとえば、独自のものを追加できます。
#/root/.bashrc
alias poweroff='echo "poweroff: Command disabled - THINK before you type.
Use /usr/sbin/poweroff if you really want to drive to the DC to restore power."'
shutdown -r
無効にする間、これはどのように維持されshutdown -P -H
ますか?
シャットダウン実行可能ファイルの名前を、誤って呼び出すことのできないものに変更します。
エイリアスshutdown
は(whatever) -r
shutdown
と/sbin/shutdown -r
。名前を変更する必要はありません。エイリアス展開は絶対パスを参照するため、再帰的なエイリアス展開の対象にはなりません。