シャットダウンコマンドを削除するが、再起動を維持する最良の方法


27

データセンターにraspiタイプのデバイスがありますが、最近、誤って太い指で画面の間違った端末にシャットダウンコマンドを貼り付けました。オプションを保持するshutdown -rが削除する方法はあり#poweroff #shutdown -P -Hますか?

shutdown -r 命令を守りたい。システムをフリーズしたり、IPテーブルルールでロックアウトしたりした場合は、タイマーを設定します。例shutdown -r +10

回答:


39

systemdベースのLinuxディストリビューションを使用する必要があります。この場合、systemdが実行を拒否(および電源オフ)できるように、poweroffターゲットをマスクできる必要があります。例えば:

systemctl mask poweroff.target

これにより、再起動する場合を除き、システムを完全にシャットダウンできなくなります。何も起こらないことを確認してください。

Debian9アニメーションデモ

この場合、このVMの仮想電源スイッチは、システムをシャットダウンすることさえできなくなります。しかし、まだ完全に再起動します。

もちろん、変更を元に戻すには、ターゲットをマスク解除するだけです。その後、システムをシャットダウンできます。

systemctl unmask poweroff.target

2
すべてのサービス/ターゲット/デバイスとその説明を一覧表示するsystemdコマンドはありますか?私は最近これについて読み始めました、そして可能性を探求したいと思います。
hjpotter92

1
@ hjpotter92 systemctl引数なしで実行します。すべてのアクティブなユニット、そのステータス、および説明がリストされます。追加する--allと、アクティブではないユニットもリストされます。
マイケルハンプトン

2
@ hjpotter92をご覧くださいman systemd.special
-TooTea

16

これを実現する方法はいくつかあります。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でエスカレーションすることがベストプラクティスであることに注意してください。


1
これは素晴らしいです。ただし、sudoのデフォルト設定では、最初の呼び出し後しばらくの間、資格情報がキャッシュされます。これはroot、ユーザーセッションで必要なコマンドの繰り返し実行時に便利です。このようなセッションでは(または実際にrootシェルが実行されている場合)、コマンドを処理しshutdown、チェックをバイパスすることは完全に可能です。
コスミックオッシファージュ

入力いただきありがとうございます。ただし、この場合、sudoで実行するときにパスワードの入力を求めないように設定shutdown -rしているため、実行すると資格情報は入力されないためキャッシュされません。上記の例を見てください。実行した後にa が表示され、パスワードの入力を求められました。sudo shutdown -r ...sudo shutdown -H
ジョン・ドウ

3
確かに、それは理解されています。ただし、最後のコマンドにプレフィックスが付いてsudoいて、NOPASSWD操作ではなかったシナリオを考えてください。たとえば、構成ファイルをルートとして編集するための呼び出し。この場合、パスワードはキャッシュされ、次の呼び出しが行われますsudo shutdown -Hsudoこれを回避するには、パスワードのキャッシュを無効にする必要があります。
コスミック

2
この場合、あなたは正しいです、パスワードキャッシングを無効にするための+1。提案で私のコメントを編集しました。ありがとう!
ジョン・ドウ

2
私は実際にはこれが好きではありません。正確には、sudoパスワードプロンプトの存在に依存しているため、ユーザーが行うべきでないことを何もしないようにユーザーに思い出させるのです。しかし、パスワードプロンプトは実際にはこの目的には役立ちません。sudoパスワードを入力して先に進むので、一般的に要求されます。sudoを使用した別のアプローチについては、こちらを参照してください(あまり良くないにもかかわらず、おそらくもっと良い方法です)。
マイケルハンプトン

10

molly-guardと呼ばれるツールがあり、シャットダウンまたは再起動するマシンのホスト名を指定する必要があります。

Debianを使用していない場合、プログラムがかなり原始的であることを考えると、ソースからコンパイルするのは簡単なはずです。


9

事故を防止するためにRHELベースのディストリビューションは、既にのエイリアスを設定しrmcpおよびmvrootユーザーによって実行されるときには、幾分より破壊的であることができます。

たとえば、独自のものを追加できます。

#/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."'

2
shutdown -r無効にする間、これはどのように維持されshutdown -P -Hますか?
–MSalters

3

シャットダウン実行可能ファイルの名前を、誤って呼び出すことのできないものに変更します。

エイリアスshutdown(whatever) -r


1
実行可能ファイルの名前を変更する方法を教えてください。将来的にパッケージのアップグレードが中断される可能性はありますか?
-AL

2
@AL 将来、パッケージのアップグレードが中断される可能性はありますか? はい、できました。また、既にインストールされているものが破損する可能性があります。一般に、OSインストールの一部をいじるのは非常に悪い考えです。
アンドリューヘンレ

1
同意する。これは、別名に十分だshutdown/sbin/shutdown -r。名前を変更する必要はありません。エイリアス展開は絶対パスを参照するため、再帰的なエイリアス展開の対象にはなりません。
MSalters

1つの注意点-「不可能はない」と思うだろう-ありそうもない
-JosephDoggie
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.