機械制御環境に使用するLinuxシステムがあります。運用要件には、再起動またはシャットダウンが専用(紙)ノートブックに文書化され、特定の手順がコンピュータで実行される限り、再起動してもかまいません。
reboot
コマンドは、shutdown
コマンドを実行しているユーザー(通常はルート)にカスタムメッセージを表示したいと思います。メッセージ内のユーザーがEnterキーまたは別のキーを押してメッセージを確認できるようにするのに役立ちます。
Web上のほとんどの文書は、ログインしている他のユーザーに表示するメッセージを定義することに焦点を当てており、今後一定期間終了する予定です。私はほとんど反対が必要です。メッセージはルートの追跡を停止し、ログとともにテーブルに送信する必要があります。 ;-)
どこかに設定できますか?
答え1
次のように関数を作成して、ルートのシェルの先頭にreboot
配置できます。
reboot () {
echo "Did you enter this in the logbook? Type yes if you did."
read answer
case $answer in
(Yes | YES | yes | Y | y) command reboot "$@" ;;
(*) echo "Sorry mate, not going to space today.";;
esac
}
これは(または機能を削除することでcommand reboot
)簡単にバイパスできるため、プライマリ防御線としてのみ使用してください。
少し難しいが不可能ではないのは、バイナリの名前を変更してreboot
callというスクリプトを作成することです(質問に肯定的に答えた場合)。ただし、このアプローチは、他のスクリプトやプログラムが呼び出し/フォークして質問に答える準備ができていない場合に問題になる可能性があります。彼らは電話を切ったり、奇妙な方法で悪い行動をする可能性があります。reboot
the_real_reboot
reboot
答え2
これを達成する方法は、終了機能を公開するインターフェイスによって異なります。ローカルまたはリモートのGUIがなく、webminなどのWebインターフェイスがなく、仮想マシンやコンテナではない物理インスタンスである場合(おそらく)、ACPIのシャットダウン、シャットダウン、再起動、init、telinitについてのみ心配してください。 systemctl終了/再始動コマンド。
ACPIの動作を妨げないことをお勧めします。緊急処置として使用してください(プラグを抜く前)。
他のユーザーの場合は、すべてのユーザーのエイリアスまたは関数を作成します(bashを使用するシステムでは、構成ファイルではなくbashrcに存在する必要があります)。ほとんどのLinuxディストリビューションでは、デフォルトの構成は/ etcに共通の構成ファイルとbashrcがあり、$ HOMEにユーザー固有のファイルがあることです。この場合、パブリックファイルはすべてのユーザーファイルで呼び出されるため、これらの状況がすでに存在するかどうかを確認または実装するのは簡単です。
Jensが示唆したように、bash関数が$ PATH(または組み込み)のコマンドと同じ名前で定義されている場合、シェルにこのコマンドを入力すると、コマンドの代わりに関数がトリガーされます。command
これはコマンドの前にキーワードを付けることで抑制できます。フルパスを指定すると、関数の代わりに保存された実行可能ファイルも実行されます。
エイリアスも同様に動作します。関数とエイリアスの両方がある場合、どちらが実行されるのかわかりませんが、テストするのは簡単です。
Jensのコードに関しては、systemctlはシャットダウンだけでなく他の多くの操作にも使用できるため、いくつかの追加の論理チェックを追加する必要があります。また、それを実装するように求められたら、成功と失敗した試みのいくつかのログを追加します(参考文献を参照man logger
)。