Mac上でターミナルのシェルを変更しようとしたらハマった話。
問題発生
- OSX時代にtcshを設定していた
- いまどきtcshはないだろうと、ターミナルをbashに設定した
- bashを設定したのに、新規シェルが常にtcshになる
- macOSでは.plistにログインシェルが書かれているらしい
- plistを編集したらユーザーごと存在しないことにされた(ターミナル起動しない、sshで入れない)
トラブルシュート(失敗)
編集してしまったのは
“/private/var/db/dslocal/nodes/Default/users/.plist” です。
ユーザ編集不可なのですが、tcshをbashに変えるぐらいはいいよね?と安易に編集してしまいました。
編集直後は「新しいターミナルを起動してもプロンプトが帰ってこない」という状態になってしまいました。
そこで再起動をして見たのですが、なんと、ユーザ一覧に自分の名前が出てこない!
どうやら再起動時にplistの中身をチェックされるらしく、「plistが壊れている=ユーザーとして認めない」ということになってしまったようです。
仕方なく別のアカウントで入りなおして見たのですが、そちらはsu権限を付与してなかったので何もできず(そりゃそうだ)。
トラブル原因のファイルを修正どころか閲覧もできなくなってしまったのです。困った。
リカバリーモードでターミナル(操作はできる)
数年ぶりにリカバリーモードで起動してみました
(command”⌘”+”R”)。
リカバリーモードはあまりメンテナンスされていないのか、昔懐かしい「Aqua」なインターフェースです。
ここから「ターミナル」を起動。どうやらwheelグループ権限を付与されているようで、上記ファイルは編集できそう。
しかし、”/private/var/”以下に”db/dslocal”フォルダが見つからない。何故?
どうやらリカバリー時にはマウント状況が変わるらしく、探しているファイルは”/private”ではなく”/Volumes/Macintosh HD/private”に格納されていました。ふぅ。
再編集して再起動(失敗)
vimで.plistを開き、”/bin/bash”となっている箇所を”/bin/tcsh”に戻して保存。
しかし再起動してもログイン画面にユーザーアイコンが現れません。失敗です。
vimに助けられる(成功)
plistファイルはバイナリなので、テキストだけを変更したつもりで他のところを壊してしまったのでしょう。
リカバリーモードではplistエディタも使えず手詰まりです。
しかし僕は、vimでバックアップファイルを作成するように設定しています。念のために”.vim”を見に行くと、オリジナルの”.plist”が残されていました。
再びリカバリーモードに入り、バックアップのplistを”/private/var/db/dslocal/nodes/Default/users/”にコピー。
再起動するとユーザーアイコンが現れてくれたのでした。助かった・・・
結論:
実はこれまでもvimのバックアップに助けられたことが何回かあります。
ターミナルで間違えてrmしてしまった時にバックアップから掘り出すのは、割とよくあります。
また、保存場所を忘れてしまった時にswapファイルのフルパスを参照したりします。
万が一に備えて、vimのバックアップとスワップ設定しておくことをお勧めします。