ログインシェルを変更する最短手順は、chsh -s にシェルのパスを渡すだけです。一般ユーザーが自分のシェルを切り替える場合は chsh -s /bin/zsh、管理者が他ユーザーを変更する場合は sudo chsh -s /bin/zsh username または sudo usermod -s /bin/zsh username を使います。変更は次回ログイン時から有効になります。
利用可能なシェルをシステムから確認する
変更前に、このシステムで許可されているシェルの一覧を確認します。/etc/shells に記載されているパスのみが、一般ユーザーに設定可能なシェルです。
cat /etc/shells
Ubuntu 24.04 での出力例:
# /etc/shells: valid login shells
/bin/sh
/bin/bash
/usr/bin/bash
/bin/rbash
/usr/bin/rbash
/usr/bin/sh
/bin/dash
/usr/bin/dash
/usr/bin/zsh
/bin/zsh
zsh や fish をパッケージからインストールした場合、インストール時に /etc/shells へのエントリ追加まで自動で行われます。手動でビルドしたシェルや非標準パスにインストールしたシェルは追記が必要です(後述)。
一般ユーザーが自分のシェルを変更する
自分のシェルを変更するには、切り替え先のフルパスを -s オプションで指定します。実行するとログインパスワードの入力を求められます。
chsh -s /usr/bin/zsh
実行後の出力例:
Password:
パスワードを入力してエラーが出なければ変更完了です。/etc/shells に登録されていないパスを指定すると chsh: /usr/local/bin/fish is an invalid shell のようなエラーになります。この場合の対処は後述します。
なお、-s を省略して chsh とだけ入力すると対話モードになり、現在のシェルを表示したうえで新しいシェルのパスを入力するプロンプトが出ます。どちらの方法でも結果は同じです。
管理者が別ユーザーのシェルを変更する
管理者権限で他ユーザーのシェルを変更する方法は2つあります。どちらも /etc/passwd の該当行を書き換えるため、効果は同じです。
chsh でユーザー名を指定する
sudo chsh -s /bin/bash alice
root 権限があれば対象ユーザーのパスワード入力は不要です。複数ユーザーを順に変更する場合は、このコマンドをループさせるだけで済みます。
usermod -s で変更する
sudo usermod -s /bin/bash alice
usermod はユーザーアカウントのプロパティを一括管理するコマンドで、シェル変更以外にもホームディレクトリや所属グループの変更に使えます。Ansible や自作プロビジョニングスクリプトの中ではこちらが使われることが多く、ある運用現場では新規サーバー構築時に全ユーザーのシェルを統一するためにこのコマンドをプレイブックに組み込んでいます。
変更内容を確認する
変更後は getent passwd でシェルが書き換わったことを確認します。getent は LDAP や NIS 連携環境でも正しい情報を返すため、/etc/passwd を直接 grep するより確実です。
getent passwd alice
alice:x:1001:1001::/home/alice:/usr/bin/zsh
コロン区切りの最後のフィールドが変更後のシェルパスになっていれば設定は完了です。変更を有効にするには一度ログアウトして再ログインしてください。
運用上のよくある落とし穴
nologin を誤って管理者アカウントに設定してしまう
サービスアカウント(www-data や postgres など)を非対話化するために /usr/sbin/nologin を設定することがあります。誤って管理者アカウントにこれを設定すると、SSH でも su でもログインできなくなります。変更対象のユーザー名を必ず二重確認してから実行してください。
zsh や fish をインストールしていない場合
多くのディストリビューションで zsh や fish はデフォルト非搭載です。先にインストールしておきます。
# Ubuntu / Debian
sudo apt install zsh fish
# Rocky Linux / AlmaLinux / RHEL 系
sudo dnf install zsh fish
/etc/shells 未登録のシェルを使いたい場合
インストール先が非標準パスだったり、ソースからビルドしたシェルは /etc/shells に自動登録されません。一般ユーザーが chsh で設定しようとすると invalid shell エラーになります。管理者がパスを追記してから変更してください。
which fish
/usr/local/bin/fish
echo '/usr/local/bin/fish' | sudo tee -a /etc/shells
追記後、改めて chsh -s /usr/local/bin/fish を実行すれば設定できます。なお root は /etc/shells 未登録のパスでも強制設定できますが、意図しない値の設定ミスを防ぐために追記してから変更する習慣を付けておくほうが安全です。
現在のセッションへの即時反映が必要な場合
ログインシェルの変更は次回ログイン時から有効です。テスト目的で現在のセッションだけ切り替えたい場合は exec zsh のように exec コマンドで現在のシェルプロセスを置き換えられますが、ログインシェルとして起動した場合と非ログインシェルとして起動した場合とで読み込まれる設定ファイル(.zprofile と .zshrc など)が異なります。設定の反映状況を正確に確認したいときは、ログアウトして再ログインする方法が確実です。
「コマンドは打てる。次は”現場で通用する型”を最短で身につけたい」——そんなあなたへ。
ネットの断片的なTipsをコピペするだけでは、体系的な運用スキルはなかなか積み上がりません。リナックスマスター.JPの無料メルマガ「リナマガ」では、現場で実際に使うLinuxサーバー運用の考え方を、順を追って実務目線でお届けしています。いま登録された方には、安全なサーバー構築の「型」をまとめた『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼント中です。
>> 図解60P『Linux入門マニュアル』を無料で受け取る
(メルマガ登録は10秒・いつでも解除OK)
※ 「独学の時間がもったいない」「プロから現場の技術を最短で学びたい」という本気の方には、2日で実務レベルが身につく初心者向けハンズオンセミナーもご用意しています。
