概要
スクリプトやツールを使用する際、ログインシェルか、インタラクティブシェルかを考慮しないといけないことがあります。
本記事では、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等)