suやsudo時のログインシェル、インタラクティブシェル
スクリプトやツールを使用する際、ログインシェルか、インタラクティブシェルかを考慮しないといけないことがあります。
本記事では、suやsudoを実行した際に起動されるシェルがログインシェルかどうか、インタラクティブシェルかどうかについてまとめます。
本記事の目的
suやsudoを実行した際に起動されるシェルがログインシェルかどうか、インタラクティブシェルかどうかを確認する
基本
前提
対象はbash(GNU Bash)、su、sudoあたりのコマンドです。
記載されている動作確認結果はRHEL8系のものです。別のOSやLinuxディストリビューションについては、コマンド自体の違いは無いか、あっても少ないはずですが、関連するStartup Files(profileやbashrc等)の構成が違うことより結果的に異なる動作になる場合があります。
suやsudo時のログインシェル、インタラクティブシェル
以下のようになります。
| コマンド | ログインシェル | インタラクティブシェル |
|---|---|---|
su |
||
su - |
||
sudo -s |
||
sudo -i |
||
sudo (コマンド)(※1) |
||
sudo su |
||
sudo su - |
||
sudo bash |
●:該当
(※1)シェル起動やsu以外のコマンド
上記はサマリです。
詳細については後述します。
詳細
suの各実行方法
-
ユーザを指定しない場合、
suはrootとしてコマンドを実行します。 -
参考:suのman(開発元)
各OSやディストリビューションに実装されているものと多少違いがあるかもしれませんが、本記事のような基本的なオプションに差異は無いと思います。
su
rootとしてインタラクティブシェルを実行します。
ログインシェルではありません。
su -
オプション無しのsuとの違いは、su -では、ログインシェルとしてシェルを実行します。
suの、-と-lと--loginは全て同じ意味のオプションです。
引数0(argv[0])の先頭に”-“が付与されます。
sudoの各実行方法
-
-uでユーザを指定しない場合、sudoはrootとしてコマンドを実行します。 -
sudoのman(開発元)
各OSやディストリビューションに実装されているものと多少違いがあるかもしれませんが、本記事のような基本的なオプションに差異は無いと思います。
sudo -s (--shell)
-s(--shell)オプションを使用すると、sudoを実行したユーザの環境変数SHELLが設定されていればその値のシェルを、設定されていなければそのユーザのpasswdエントリにあるシェルをrootとして起動します。
コマンドを指定せずsudo -sだけを実行すると、インタラクティブシェルが起動します。
ログインシェルではありません。
sudo -i (--login)
-i(--login)オプションを使用すると、rootとしてログインシェルを起動します。
インタラクティブシェルです。
sudo (コマンド)
※ここでは、シェル起動以外のコマンド(bashのようなシェルでなく、cp、dnf、shutdown等)
rootとして、指定したコマンドを実行します。
シェルは起動されません。
sudo su
rootとしてsuを実行します。
rootのパスワードを入力せず、sudoを実行するユーザのパスワードでrootになれます。
sudo su -
rootとしてsu -を実行します。
rootのパスワードを入力せず、sudoを実行するユーザのパスワードでrootになれます。
参考URI
GNU Bash
www.sudo.ws
util-linux(suを含む)
関連記事(シェル、umask等)











