Linuxでのデフォルトシェルの変更
概要
対話型シェルは、tty端末のユーザー入力からコマンドを読み取ります。 ユーザーがログインに成功した後、対話型シェルをデフォルトシェルまたはログインシェルと呼びます。
このチュートリアルでは、ユーザーのデフォルトシェルを変更する方法について説明します。
chshコマンドの概要
chshコマンドは、すべてのLinuxディストリビューションで利用可能な標準パッケージutil-linuxパッケージに同梱されています。
-lオプションを指定したchshコマンドを使用すると、現在のシステムにインストールされているシェルを一覧表示できます:
$ chsh -l/bin/sh/bin/bash/bin/zsh/usr/bin/zsh/usr/bin/git-shell
chshコマンドのより一般的な使用法は、ユーザーのデフォルトシェルを変更することです。
これを行う方法については、後のセクションで説明します。
私は現在どのシェルを使用していますか?
ログインに成功したら、デフォルトのシェルを使用します。
デフォルトのシェルの変更について説明する前に、まず現在使用しているシェルを見つけるためのいくつかの方法を学びましょう。
一つの方法は、現在実行中のシェルコマンドを格納するシステム環境$SHELLを読み取ることです:
kent$ echo $SHELL/bin/zsh
上記の例が示すように、現在のログインユーザーの実行中のシェルはZshです。
あるいは、現在実行中のシェルのプロセス情報を調べることで、現在実行中のシェルを知ることができます。 Linuxは、実行中のシェルのPIDを特別な変数に格納します$$:
kent$ echo $3492
上記の例では、PID153492のプロセスが現在のシェルプロセスになります。 プロセスに関する詳細情報は、-pオプションを指定したpsコマンドを使用して取得できます:
kent$ ps -p $$ PID TTY TIME CMD 153492 pts/2 00:00:00 zsh
出力は、Zshが現在のシェルであることを示します。
現在のユーザーのデフォルトシェルの変更
現在のログインユーザーのデフォルトシェルを変更したい場合は、-s<NEW_SHELL>オプションを指定してchshコマン
現在のユーザーのデフォルトシェルをBashに変更しましょう:
kent$ chsh -s /bin/bashChanging shell for kent.Password: Shell changed.
デフォルトのシェルを正常に変更した後、現在実行中のシェルは変更されないことに言及する価値があります。 たとえば、ユーザー kentのデフォルトシェルとしてBashを設定しましたが、現在のシェルはまだZshです:
kent$ ps -p $$ PID TTY TIME CMD 153492 pts/2 00:00:00 zsh
新しく変更されたデフォルトのシェルは、次回ユーザー kentでログインしたときに有効になります。
デフォルトのシェルコマンドは、ユーザーのログインに不可欠です。 コマンドが無効な場合は、ユーザーとのログインに問題があります。
したがって、デフォルトのシェルを変更しているので、chshコマンドは指定されたシェルコマンドが有効かどうかを確認します。
chshコマンドに無効なパスを渡した場合に何が起こるか見てみましょう:
kent$ chsh -s /bin/bashhhhChanging shell for kent.Password: chsh: "/bin/bashhhh" does not exist
chshコマンドは、システムに現在インストールされているシェルを一覧表示できることを学びました。
指定されたシェルがシステムの有効なシェルのリストにない場合、chshコマンドはデフォルトのシェルの変更を拒否します:
kent$ chsh -s /usr/bin/catChanging shell for kent.Password: chsh: "/usr/bin/cat" is not listed in /etc/shells.Use chsh -l to see list.
上記の例では、ユーザー kentのデフォルトシェルとして/usr/bin/catコマンドを設定しようとしました。
catコマンドパスは有効です。 ただし、シェルリストにはありません。 したがって、chshは対応するエラーメッセージとヒントで中止されました。
他のユーザーのデフォルトシェルの変更
これまで、chshコマンドを使用して現在のログインユーザーのデフォルトシェルを変更する方法を学びました。
また、chshコマンドを使用して他のユーザーのデフォルトのシェルを変更することもできますが、それを行うにはroot権限が必要です。
構文は非常に簡単です:
root# chsh -s NEW_SHELL USERNAME
今回は、rootユーザーとしてログインし、ユーザー kentのデフォルトシェルを/bin/shに変更します:
root# chsh -s /bin/sh kent Changing shell for kent.Shell changed.
次に、ユーザー kentで再度ログインし、デフォルトのシェルが正常に変更されたかどうかを確認しましょう:
sh-5.1$ echo $SHELL/bin/sh
上記の出力が示すように、ユーザー kentのデフォルトシェルは/bin/shになりました。
/etc/passwdファイルの編集
chshコマンドを使用してユーザーのデフォルトシェルを変更する方法を学びました。 または、/etc/passwdファイルを編集してそれを行うこともできます。
Linuxでは、/etc/passwdファイルはプレーンテキストファイルです。 これは、ユーザーログイン時に必要なユーザーアカウント情報を格納します:
-rw-r--r-- 1 root root 2.1K Mar 12 10:27 /etc/passwd
その許可フラグを見ると、すべてのユーザーがそれを読むことができますが、rootユーザーだけが/etc/passwdに書き込むことができます。
/etc/passwdファイルの内容を確認してみましょう:
kent$ cat /etc/passwdroot:x:0:0:root:/root:/bin/zshbin:x:1:1:bin:/bin:/bin/false...kent:x:1000:1000::/home/kent:/bin/zshguest:x:1001:1001::/home/guest:/bin/zsh...cups:x:209:209:cups helper user:/:/sbin/nologin...
ファイル内のすべての行には、ユーザーのアカウント情報が記録されます。 レコード内のフィールドはコロンで区切られています。
レコードには、ユーザー名、UID、GID、ホームディレクトリなどのユーザーのアカウントデータが含まれます。 最後のフィールドは、ユーザーの既定のシェルを示します。
/etc/passwdファイルのデフォルトのシェルフィールドを変更すると、ユーザーが次回システムにログインしたときに有効になります。
/etc/passwdファイルを編集する利点の一つは、複数のユーザーのデフォルトシェルを一度に変更できることです。 時には、これはかなり便利かもしれません。
しかし、/etc/passwdファイルを保存するとき、変更されたデフォルトシェルでは検証や検証は行われないことに注意してください。
したがって、有効なシェルコマンドパスを指定したことを確認する必要があります。 それ以外の場合、ユーザーは次回にシステムにログインする際に問題が発生します。
結論
このクイック記事では、例を通してユーザーのデフォルトシェルを変更する方法を学びました。
chshコマンドはタスクにとって非常に簡単です。 さらに、指定されたシェルがシステム内で有効であるかどうかを確認できます。
現在のログイン以外のユーザーのデフォルトシェルを変更したい場合は、rootユーザー権限でchshコマンドを実行する必要があります。
さらに、rootユーザーとしてログインできれば、/etc/passwdファイルを直接編集することで、複数のユーザーのデフォルトシェルを変更することもできます。