実務シチュエーション4 択難易度 応用

状況

古いリリースを削除する本番作業のダブルチェック中。前の手順で、削除対象のパスを /tmp/old_release_path に書き出してある。作業者は次のスクリプトを実行しようとしている。

このスクリプトで最も危ない点は?

OLD_DIR=$(cat /tmp/old_release_path)sudo rm -rf "$OLD_DIR"/*

正答

  1. sudo を付けると、削除後のディレクトリの所有者が root に変わる
  2. /tmp は再起動で消えるため、パスの保存場所として不適切である
  3. rm -rf ではなく rm -r にすれば、確認が出るので安全になる
  4. ファイルが空だと OLD_DIR が空になり、rm -rf /* が実行される

解説

ファイルが空だったり存在しなかったりすると OLD_DIR は空文字になり、"$OLD_DIR"/* は /* に展開されて、root 権限でサーバ全体を削除しようとする。実行前に中身を表示して確かめるか、${OLD_DIR:?} のように空なら止まる書き方にする。/tmp の保存場所は気になる点だが、消えた場合こそ空変数の危険が現れる。rm -r でも書き込み可能なファイルは確認なしで消える。sudo で所有者は変わらない。

double-checkproductionshell

この問題を含む 実務シチュエーション のテストを制限時間つきで解く

実務シチュエーションクイズへ