滅びの呪文 rm -rf /* が意図せず発動するケース(初心者&レビュア向け)


rm -rコマンドはディレクトリ配下のサブディレクトリやファイルを一気に削除してくれます。
バッチ処理などで警告を無視して削除したいケースでは-fオプションをつければ可能です。
「潔さ」さえ感じるrmコマンドですが、それを見ただけで滅びの呪文を連想する人も多いはず。

『ルートディレクトリ配下を全て消してしまった』(通称:バルス)

という嘘のような誰かの経験談を耳にしたことはあっても、
自身で経験したことのある人はそう多くないと思います。

経験を積んだエンジニアなら「自分は大丈夫」と思うでしょう、
初心者であっても「まさかそんな間違いはしないだろう」と思うことでしょう。
私もそうでした。

油断しているとそのまさかの事態に陥りかねない、注意すべきケースがあったので共有します。

※以下のサンプルコードは危ないので実行しないでください
(試す場合はDockerコンテナ上などで行ってください)


未定義の環境変数を使用してバルス

sample1.csh
#! /bin/csh
# 変数設定
set HOGE_DIR = "/home/user1/test"
# 対象ディレクトリ配下削除(バルス例)
rm -rf ${HOGE_DIL}/*  
  • rmのところでHOGE_DIR ではなく HOGE_DILとしてしまっている
  • これによりrm -rf /*となりルートからの削除が実行されてしまう
  • 環境変数のタイポには注意が必要

コマンドを引数で渡すときの不正な文字列囲いによるバルス

sample2.csh
#! /bin/csh
# 変数設定
set RHOST = "svr1"
set RUSER = "svr1_user"
set HOGE_DIR = "/home/svr1_user/test"
# 対象ディレクトリ配下削除(バルス例)
rsh ${RHOST} -l ${RUSER} 'rm -rf ${HOGE_DIR}/*' 
  • rshはネットワーク経由で別のコンピュータ上で処理を実行するためのコマンド
  • シングルクォーテーションで囲われた環境変数は文字列としてそのまま解釈される
  • rm -rf ${HOGE_DIR}/*が接続先で実行されるため、接続先に環境変数${HOGE_DIR}が定義されていない場合、rm -rf /*となりルートからの削除が実行されてしまう
  • ダブルクォーテーションで囲った場合は環境変数の読替えがなされ、rm -rf /home/svr1_user/test/*が接続先で実行されるため、この場合はダブルクォーテーションで囲うのが正解
  • rsh以外でも文字列の囲い方には注意が必要

滅びの呪文の犠牲者が増えないことを祈ります。
(safe-rmというrmコマンドをラッピングした安全なコマンドを導入するのも手です)