【Linux】add-shellコマンド完全入門:/etc/shellsへの登録手順とchsh連携・安全な運用管理

概要

Linux環境において新規シェルを導入した際や、運用制約用の自作スクリプトをユーザーログインシェルとして割り当てる場面で必須となるのが add-shell コマンドです。本記事では、ホワイトリストとして機能する /etc/shells の仕組みを紐解きながら、chsh との連動メカニズム、アカウントへのシェル割り当て、そして不要になった際に行う remove-shell を用いたクリーンアップまで、一連の実務手順を実践形式で解説します。

1. /etc/shellsの役割と登録済みシェルの確認手順

システム上で正当なログインシェルとして認識されている一覧を確かめるため、まずは cat /etc/shells で対象ファイルを参照します。
この /etc/shells に登録されている実行パスのみが、一般ユーザーによる chsh コマンドでのシェル変更を許可され、FTPなどの各種デーモンにおける認証制御の安全基準としても機能します。

/etc/shellsの内容を確認

続いて、環境に配備されている標準シェルの実行ファイル配置先を特定するため、which bash sh を実行します。
ここで出力される /usr/bin/bash および /usr/bin/sh のパスが、先ほど閲覧した /etc/shells のリストに含まれていることを確認できれば、正常なログインシェルとして定義されていると判断できます。

whichコマンドによるbashとshのパス確認

2. 新規シェル(Zsh)のインストールとadd-shellによる登録検証

add-shell の挙動を確認するため、検証対象となる新しいシェルとして zsh パッケージをシステムへ導入します。

APT経由でのzshパッケージインストール

インストールされた zsh バイナリのフルパスを取得するため、which zsh を実行します。
実行結果でパスが返されない場合、パッケージの導入処理が未完了であるか、実行パスが正しく通っていない状態であることを示唆しています。

whichコマンドによるzshのパス探索

通常、sudo add-shell $(which zsh) を実行するとコマンド置換によって得られたシェルの絶対パスが /etc/shells に追記されます。
しかし、パスの解決に失敗した場合は引数なしで実行される形となるため、ターミナル上には add-shell shellname という構文ヘルプが表示されます。

add-shell実行時の構文案内表示

/etc/shells 内に zsh のエントリが存在しているかを確かめるには、grep -E 'zsh$' /etc/shells で該当パターンを検索します。
この段階の実行ログでは一致する行が出力されないため、まだファイル内へ zsh が登録されていない状態であることが分かります。

grepコマンドによるzsh登録状況の確認

3. 制限付きカスタムシェルの作成とadd-shell登録の実践

ユーザーの操作範囲を特定メニューに制限する運用を想定し、起動時に通知メッセージを表示する簡易シェルスクリプトを /usr/local/bin/custom-menu.sh に作成します。

カスタムシェルの作成スクリプト実行

作成したスクリプトを独立した実行可能プログラムとして稼働させるため、sudo chmod +x /usr/local/bin/custom-menu.sh で実行パーミッションを付与します。

実行権限の付与

このカスタムスクリプトをシステム公認のログインシェルへと昇格させるため、sudo add-shell /usr/local/bin/custom-menu.sh を実行して /etc/shells へ登録します。直接エディタで編集するのと異なり、重複を避けつつ安全にエントリを管理できます。

add-shellによるカスタムスクリプトの登録

登録結果を確かめるため、tail -n 3 /etc/shells を実行してファイルの末尾3行を抽出します。
出力の最後尾に /usr/local/bin/custom-menu.sh が追加されていることから、OS公認の有効なシェルとして承認されたことが確認できます。

tailコマンドによる登録結果の確認

4. アカウントへの適用検証とremove-shellによる事後処理

登録を完了したカスタムシェルを初期ログインシェルに設定した検証用アカウント(testuser)を作成します。エラーを防ぎつつ冪等性を保つため、sudo id -u testuser >/dev/null 2>&1 || sudo useradd -m -s /usr/local/bin/custom-menu.sh testuser を実行します。

検証用アカウントの作成とシェル指定

作成されたアカウントに意図通りのシェルが割り当てられているかを検証するため、grep '^testuser:' /etc/passwd でアカウント情報を照会します。
行末のログインシェル指定項目に /usr/local/bin/custom-menu.sh が設定されていれば、割り当ては成功です。

/etc/passwdによるユーザー設定確認

動作確認を終えた後は、sudo userdel -r testuser 2>/dev/null || true を実行し、検証用アカウントおよび関連するホームディレクトリをシステムから安全に削除します。

テストアカウントのクリーンアップ

次に、公認シェル一覧からカスタムシェルを除外するため、sudo remove-shell /usr/local/bin/custom-menu.sh を実行して /etc/shells から該当エントリを取り除きます。

remove-shellによる登録解除

ファイルシステム上に残存するスクリプト本体も、sudo rm -f /usr/local/bin/custom-menu.sh を用いて完全に消去します。

カスタムスクリプト本体の削除

最後に、/etc/shells から対象パスが確実に抹消されたかを検証するため、grep 'custom-menu.sh' /etc/shells || echo '등록 해제 완료' を実行します。
ファイル内に該当パスが存在しないため grep が終了ステータス1を返し、後続の 등록 해제 완료(登録解除完了)メッセージが出力されることで、完全なクリーンアップが証明されます。

登録解除完了の最終検証

本記事では、add-shell を介した /etc/shells の適正な更新手順から、ユーザーアカウントへの適用、さらに remove-shell を用いた安全な登録解除までを網羅しました。
設定ファイルを直接手動編集するリスクを避け、専用の標準コマンドを活用した安全かつ堅牢なシステム管理をぜひ導入してみてください。