chownコマンドの悲劇
初めましてMTOKです。
サーバを扱う技術者としていかに多くの失敗を経験したかが、エンジニアとしての成熟度を表す指針になると思っています。
私も数多くの失敗を経験しましたが、その中でも格段に”やばい“失敗を
自戒の念を込めて書かせていただきます。
Linuxコマンドについて
Linuxのコマンドはワンライナー(1行のプログラム)で多くの処理を実現できることが魅力の1つです。
しかしながら、便利なワンライナーコマンドであるが故に
1文字のミスで悲劇を生んでしまうこともあります。
今回は私が実際に体験した悲劇をご紹介いたします。
誤ったコマンドを実行
私は日頃から個人検証用のサーバを構築しており、いつものように色々とコマンドを実行していたのですが、
ふと現在のディレクトリ配下の権限を一括で変更しようと以下のコマンドを実行しようと思いました。
# chown -R root:root .
そして、実際に実行したコマンドがこちら
# chown -R root:root /
※非常に危険なコマンドなので全角スペースを入れてコピペできないようにしています。
※絶対に実行しないでください
上2つのコマンドの違いは1文字だけです。しかしながらコマンドによる処理の範囲が全然違います。
chownコマンドについて
ひとまずchownコマンドについて解説していきます。
# chown [オプション] 所有者:所有グループ 変更先
chownコマンドはファイル/ディレクトリの所有者や所有グループを指定したものに変更します。
今回は所有者はroot、所有グループもrootを指定しています。
chownコマンドによる変更対象は通常1ファイルのみですが、
「-R」オプションを加えることで配下のファイルやディレクトリもまとめて変更できます。
そして変更先に指定したかったのは現在のディレクトリ「.」
実際に指定したのはLinuxにおいて1番上の階層を指す「/」
実行コマンドを日本語訳すると、
chown -R root:root .
→現在のディレクトリ配下すべてのファイル/ディレクトリの所有者をroot、所有グループをrootに変更する。
chown -R root:root /
→存在するすべてのファイル/ディレクトリの所有者をroot、所有グループをrootに変更する。
という処理内容です。
起きてしまった悲劇
誤ったコマンドを実行した直後、すぐに気づいてCtrl+Cで処理を中断させたのですが
時すでに遅し。
各サービスにてエラー、再起動も不可に。
今からでも遅くない!バックアップを取ろう!
MySQLは…応答しない。
ではせめて今あるファイルだけでも別サーバへ!
FTPは…接続できない。
scpコマンドは…実行できない。
つまりSSHも…接続できない。
サーバ再起動で戻る見込みもないので
現在つながっているSSHのセッションのみが最後の希望であり、
幸いrootユーザで作業していたので、ひたすらcatコマンドで重要なファイルの中身を手元に控えることで
悲劇を乗り越えました。
(一般ユーザのsudoで今回のchownコマンドを実行していたら何もできなかったと思います)
キーボード上で隣り合った「.」「/」の打ち間違いで
まさかサーバがぶっ壊れるとは思いませんでした…。
同じ過ちを繰り返さないために
・-Rのオプションは変更先の後に記述する (# chown root:root 変更先 -R)
→ファイル名を入力してすぐにEnterを押したのがよくなかった
・「.」や「./」で指定せず、絶対パスで指定する
→変更先の再確認してから実行できる
・定期的にバックアップを取得しておく
→悲劇が起きてしまっても被害は最小限で済む
くれぐれも再帰的なオプションをつける際は注意して頂ければと思います。
皆様が同じ轍を踏まないよう祈っております。