yassy's note

なんかかきます

/bin/bashを削除してしまった場合の復旧方法

職場の人間がうっかり/bin/bashを消したので、調べつつ対処した。
その時のメモ。
というか、/bin/bash消しといて何もしてないけど動かなくなりました!はねえわ

そもそも/bin/bashを削除するとどうなるのか

今回想定する環境としては、

  • CentOS7
  • ユーザのデフォルトシェルは/bin/bash

まずは事象再現のため、/bin/bashを削除してみる。

[root@localhost ~]# ls /bin/bash
/bin/bash
[root@localhost ~]#
[root@localhost ~]# rm -f /bin/bash
[root@localhost ~]#
[root@localhost ~]# ls /bin/bash
ls: cannot access /bin/bash: No such file or directory
[root@localhost ~]#

無事(?)削除できた。
このタイミングで、既にsshでのログインが出来なくなっている。

正確に言うと、sshでの認証処理は出来ているが、デフォルトシェルが存在しないため、シェルの起動に失敗している状態。

この状態で再起動してみる。
ユーザ名・パスワードを入力すると、
f:id:yassy_225:20210612212524j:plain

何事も無かったかのようにログイン画面に戻る。
これは、rootユーザのデフォルトシェルである/bin/bashが存在しないため。

レスキューモードでの起動

こうなってしまうと、通常の起動では復旧が難しいので、レスキューモードで起動する。 f:id:yassy_225:20210612212506j:plain

GRUBメニューにて、[e]キーを押下する。
f:id:yassy_225:20210612212502j:plain

設定編集画面にて「linux16」の項目末尾に、以下の起動オプションを追加する。

systemd.unit=rescue.target init=/bin/sh

initオプションを指定することで、起動時にsystemdの代わりに/bin/shを実行させるよう設定する。
追加後、[Ctrl-x]を押下して起動させる。
f:id:yassy_225:20210612212510j:plain

/bin/bashの復旧

レスキューモードで起動したので、/bin/bashを復旧する。
ファイルシステムは、/sysrootでreadonlyでマウントされている。
/bin/bashを配置する必要があるため、書き込み可能になるよう、マウントし直す。

:/# mount -o remount,rw /sysroot

これで/sysrootに書き込めるようになったので、/bin/bashをコピー。

:/# cp /bin/bash /sysroot/bin/bash
:/# 
:/# ls -l /sysroot/bin/bash
-rwxr-xr-x 1 root 0 964544 Jan 19 08:47 /sysroot/bin/bash
:/# 

再起動後、無事にログインできるようになった。
f:id:yassy_225:20210612212518j:plain