シェルエラーのためログインに失敗しました。

シェルエラーのためログインに失敗しました。

私は頻繁に最新バージョンのログインシェル(zsh)を実行します。昨日、最新バージョンがバグになってすぐにダウンになりました。バグがあるシェルへのリンクを修正できるように、安定したバージョンを実行している他の端末が開いているため、端末で実行することは大きな問題ではありません。しかし、愚かなことに、/etc/passwdにある不良シェルを再起動して有効にしましたが、ログインプロンプトが出たときに不良シェルのためにログインできませんでした。この問題を解決する方法があるのか​​、代替シェルを設定する方法があるのか​​、またはデフォルトに欠陥がある場合は、ログイン時に他のシェルを求めるメッセージが表示されるかどうか疑問に思います。実際にバックアップインストールまで再起動してそのように回復したのですが、ちょっと苦手ですね。

答え1

シェルが完全にバグがあり、呼び出し時にエラーで終了する場合は、シェルおよび/または終了コードを実行し、それ自体を代替手段として使用するPOSIXシェルスクリプトである偽シェルを作成できます。

#!/bin/sh

# this is usually some incredibly limited shell like dash
fallback_shell=/bin/sh
primary_shell="$(getent passwd `whoami` | cut -d: -f7)"

"$primary_shell" || "$fallback_shell"

答え2

rootとしてログインできることを確認してください。一部のディストリビューションでは、ルートとして直接ログインすることを禁止していますが、ルートアカウントにパスワードを割り当てるだけで有効にすることができます。安全ではありません(少なくともアカウントのパスワードと同じように強力なパスワードを選択してください)。もちろん、ルートアカウントでは実験的なシェルを使用しないでください。とにかく、そのアカウントで複雑な作業を行わないでください。

セキュリティを強化するために、ユーザーデータベースに同じユーザーの追加エントリを作成できます。/etc/passwd同じユーザーID(つまり同じユーザー)を使用しますが、異なるユーザー名(ログインプロンプトから区別できるように)、異なるホームディレクトリ、および異なるログインシェルを使用して複数のエントリを作成できます。これらのエントリを作成するには、/etc/passwdコマンドを実行して編集し、アカウントのエントリをコピーしてから、vipw2番目のエントリのユーザー名とログインシェルを変更します。その後、vipw -sパスワードファイルの変更()を実行すると、アカウントエントリをコピーして/etc/shadowユーザー名を変更しますが、パスワードは保持します。

/etc/passwdたとえば、以下は、my(sashシステムの回復に役立ついくつかの追加の組み込みコマンドを含む静的にリンクされたシェル)の最初の2行です。

root:x:0:0:root:/root:/not/bin/sh
sashroot:x:0:0:root:/root:/bin/sash

関連情報