rm -rf / の悲劇を防ぐ

rm -rf / は恐ろしいので、どうすれば防げるか考えました。ない知恵を絞って考えたネタです。実用性はありません。

rm () {
    local dangerous="no"
    local options=()

    if [ "$1" = "-rf" -o "$1" = "-fr" ]; then
        options[${#options[@]}]="$1"
        shift
        dangerous="yes"
    elif [ "$1" = "-r" -a "$2" = "-f" -o "$1" = "-f" -a "$2" = "-r" ]; then
        options[${#options[@]}]="$1"
        options[${#options[@]}]="$2"
        shift 2
        dangerous="yes"
    fi

    if [ "$dangerous" = "yes" ]; then
        for arg in "$@"; do
            if [ "$arg" = "/" ]; then
                echo "Just kill yourself."
                exit 1
            fi
        done
    fi

    $(which rm) "${options[@]}" "$@"
}

上の関数を source してから以下のようなコマンドを入力すると、”Just kill yourself” と戒めの言葉を表示して何もせずに終了します:

  • rm -rf /
  • rm -fr /
  • rm -f -r /
  • rm -r -f /

-rfv というふうに、r と f 以外にもオプションを渡すと効果がありません。また、rm / -rf のように入力してもアウトです。

※追記

もうちょっとがんばってみました。上の欠点を克服したはず:

rm () {
    local options=()
    local rf=
    local path=

    while [ "$#" -gt 0 ]; do
        if [ "${1:0:1}" != "-" ]; then
            path="$1"
        elif [ "${1:0:1}" = "-" -a "${1:1:1}" != "-" ]; then
            local tmp=()

            for opt in $(echo "${1#-}" | sed -e 's/./& /g'); do
                if [ "$opt" = "r" -o "$opt" = "f" ]; then
                    tmp[${#tmp[@]}]="$opt"
                fi

                options[${#options[@]}]="-$opt"
            done

            if [ "${#tmp[@]}" -eq 2 ]; then
                rf="yes"
            fi
        else
            options[${#options[@]}]="$1"
        fi

        shift
    done

    if [ "$rf" = "yes" -a "$path" = "/" ]; then
        echo "Just kill yourself."
        exit 1
    fi

    $(which rm) "${options[@]}" "$path"
}

※追記 2012-07-10
上のスクリプト、変ですね。ただの冗談なので直す気もないし、真に受けないでくださいね。
(コウヅ)

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中