Ubuntu(14.04)にzshをインストールしてみました。 zshに切り替えたとき、スーパーユーザーモードに入ることができませんでした。
私がsuを実行すると、passwdが要求され、正しいパスワードを入力すると、次のように表示されます。
Cannot execute which zsh: No such file or directory
しかし、間違ったパスワードを入力してEnterキーを4〜5回押すと、何も表示されません。
/etc/passwd
ファイルを確認すると、次のように表示されました。
root:x:0:0:root:/root:which zsh
ファイルを編集して保存しようとしましたが、表示されます
Unable to save /etc/passwd
Grubを介してランレベルを1に変更しようとしましたが、エラーが発生します。
APCI PCC probe failed
VirtualBoxでUbuntuを実行しています。
Grubプロンプトからファイルを編集することはできません(Grubはファイルの読み取りのみが可能で、書き込みはサポートされていません)。 Linux¹を起動する必要があります。
正常にログインできない場合は、通常の起動プロセスを完全にバイパスして、カーネルとシェルだけを起動できます。グラブプロンプトで、を押します e 起動シーケンスを編集するには、init=/bin/bash
行の末尾にlinux=…
を追加し、を押します。 Ctrl+X 起動します。ルートシェルだけを取得します。実行
mount -t proc proc /proc
mount -o remount,rw /
次に、chsh -s /bin/zsh root
を実行して、ユーザーデータベースを修復します。
次に、で再起動します Alt+SysRq+U に続く Alt+SysRq+B、または通常どおりに起動します
mount -o remount,ro /
umount /proc
exec /sbin/init
ヒント:user引数なしでchsh
を実行します。このようにして、シェルを検証します。
ヒント:一部の構成を変更する場合は、常にシェルを開いたままにして、構成をテストしてください。間違えた場合でも、修復するためのコマンドラインがあります。
ヒント:次のことができます toor
アカウントを作成 UID 0(ルートのまま)、ルートと同じパスワード、シェルは/bin/sh
のままで、次のようになります。問題が発生した場合は、別の方法でログインできます。さらに良いことに、静的にリンクされたシェル(busybox-static
またはzsh-static
)をインストールし、それをtoorのログインシェルとして使用します。
¹ または、ホストがLinuxの場合は、 guestfs を使用できます。
パスワードファイルからwhich
Wordを削除する必要があります...次のようになります:
root:x:0:0:root:/root:/bin/zsh
ここで、/ bin/zshはZシェルバイナリへのパスです。
現在の構成では、ログインプロセスがwhich zsh
を実行しようとしていますが、そのコマンドは失敗しています。
また、ファイルはルートでのみ書き込み可能なファイルであるため、たとえばSudo vim /etc/passwd
を使用してファイルをルートとして編集します。
Sudo
またはsu
ができない場合は、リカバリモードで起動します(GRUBブートローダーでUbuntuの詳細オプションを選択してから、Ubuntu .. .. (リカバリモード)、root/Drop to root Shell Promptを選択します。その後、/
ファイルシステムを読み取り/書き込み(mount -o remount,rw /
)として再マウントし、/etc/passwd
ファイルのコンテンツを編集できます。これをUbuntu16.04でテストしました。
ルートパスワードがわかっている場合は、su -s /bin/bash
を実行してルートbashシェルを取得できます。
Sudo -s /bin/bash
も機能するはずです。また、Sudo
の構成方法に応じて、自分のパスワードのみを知っているか、パスワードを知らない必要があります。
次に、chsh -s /bin/bash
を使用して、ルートのシェルをbashに戻すことができます。
ところで、UNIXシステムでrootのシェルを変更するのは一般的に悪い考えです。多くのcronジョブなどは、ルートのシェルがそのOSのデフォルトのルートシェルであることに依存しており、変更すると[〜#〜] will [〜#〜]壊れます。