7
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

コマンドによる事故をこの世からなくしたい

Last updated at Posted at 2017-03-28

2017/8/24
@taramさんからスクリプトがDRYとの指摘や、shutdownコマンドのオプションをフックする方法を教えていただいたので内容を修正しました。

概要

ターミナルをたくさん開いてて対象サーバと別のサーバをうっかりリブートしてしまい泣きながら報告書を書いたことがある人向けです。事故防止にお役立てください。

rebootpoweroffコマンドを実行した際にいきなりプロセスが開始されるのではなく、サーバのホスト名を確認するよう促します。

スクリプトを作ってコマンドのエイリアスにするだけです。

スクリプト

reboot/poweroffコマンド用

confirm_shutdown.sh
#!/bin/bash

confirm_shutdown() {
    COMMAND=$1      #yesの場合に実行されるコマンド。
    ACTION=${2:-$1} #メッセージに出力する動作の名前。省略すると$COMMANDと同じ

    echo "You will $ACTION << `hostname` >>, Are you sure? (yes or no)"
    read ANS1

    if [ "${ANS1}" = 'y' -o "${ANS1}" = 'yes' ]; then
        echo 'Really? (yes or no)'
        read ANS2
        if [ "${ANS2}" = 'y' -o "${ANS2}" = 'yes' ]; then
            echo "${ACTION^} `hostname`."
            exec $COMMAND
        fi
    fi
    echo "${ACTION^} cancelled."
}

shutdownコマンド用

shutdownコマンドはオプションを使うことがほとんどなのでそれをフックします。

shutdown.sh
#!/bin/bash

source /<PATH>/confirm_shutdown.sh

while getopts :rhHP OPT; do
    case $OPT in
        r)
            ACTION="reboot"
            ;;
        h|H|P)
            ACTION="shutdown"
            ;;
        *)
            ;;
    esac
done

if [ -n "$ACTION" ]; then
    confirm_shutdown "shutdown $*" $ACTION
else
    shutdown "$@" #shutdown -cなどは普通に実行
fi
  • while getopts :rhHP OPTはオプションに'r' 'h' 'H' 'P'いずれかの文字列があればOPTに代入します。
  • オプションが'r'の場合は再起動、'h' 'H' 'P'はシャットダウン、それ以外は最後のelseのところでそのまま実行。
  • $*$@は引数全部。前者は引数すべての1つの文字列として扱い、後者は変数ごとに区切られた文字列として扱います。shutdown -r nowなど複数のオプションをフックするためですね。

.bashrcへaliasを記載

.bashrc
(中略)
source /<PATH>/confirm_shutdown.sh
alias reboot="confirm_shutdown reboot"
alias poweroff="confirm_shutdown poweroff shutdown"
alias shutdown='/<PATH>/shutdown.sh'

<PATH>は自分の環境にあわせて修正しましょう。
sourceコマンドで.bashrcを読み込んで有効にすること。

試してみる

poweroff

を実行すると

You will shutdown <ホスト名>, Are you sure? (yes or no)

と表示されるのでyes(またはy)

Really? (yes or no)

yes(またはy)を入力しEnterを実行するとpoweroffが実行されます。rebootも同じ流れです。
この世から事故がなくなりますように。

7
2
5

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?