su - 代わりのユーザー ID やグループ ID によってコマンド実行する
su [options] [-] [user [argument...]]
su は、 代わりのユーザー ID やグループ ID を使って、コマンドが実行できるようにする。
実行の際に user の指定がなかった場合、 su はデフォルトで、 root ユーザーにより対話型シェルを実行する。 user の指定があった場合は、 さらに追加の argument の指定が可能となる。 この引数はシェルに受け渡される。
後方互換のため、 su はデフォルトで、 カレントディレクトリの変更は行わず、 設定変更を行う環境変数は、 HOME と SHELL (さらに対象 user が root でなければ、 USER と LOGNAME) だけである。 実行にあたっては、 常に (短い - を用いるのではなく) --login オプションを用いることが推奨される。 これは、 環境が入り混じってきたときの副作用を避けるためである。
su の当バージョンでは、 認証、アカウント、セッションの各管理を行うために、 PAM を利用している。 他の su の実装において見られる設定オプションとして、 たとえば wheel グループへのサポートといったものは、 PAM を通じて設定する必要がある。
su は、 主に非特権ユーザー向けに設計されている。 特権ユーザー (root ユーザーにより実行されるスクリプトなど) の場合は、 set-user-id の設定が不要なコマンド runuser(1) の利用が推奨される。 これであれば、 認証が不要であり、 個別に PAM 設定を提供することができる。 PAM セッションが一切不要であれば、 setpriv(1) コマンドを利用すればよい。
なお su は、 どのような場合であっても、 最終的な環境変数の変更にあっては、 PAM (pam_getenvlist(3)) を利用する。 --login や --preserve-environment のようなコマンドラインオプションは、 環境変数の反映が行われてから、 PAM による環境変数変更が行われる。
バージョン 2.38 から su は、 プロセスのリソース制限 RLIMIT_NICE, RLIMIT_RTPRIO, RLIMIT_FSIZE, RLIMIT_AS, RLIMIT_NOFILE をリセットするようになった。
-c, --command=command
シェルに対して -c オプションをつけて command を受け渡す。
-f, --fast
シェルに -f を受け渡す。 これが役立つものかどうかは、シェル次第である。
-g, --group=group
プライマリグループを設定する。 このオプションは、 root ユーザーのみが利用可能である。
-G, --supp-group=group
補助グループ (supplementary group) を指定する。 このオプションは、 root ユーザーに対してのみ利用可能である。 --group オプションが指定されていない場合は、 最初に指定された補助グループが、 プライマリグループとして用いられる。
-, -l, --login
実際のログインと同様の環境を使って、 ログインシェルとしてシェルを実行する。
·
TERM および --whitelist-environment で指定されたものを除く、 全環境変数をクリアする。
·
環境変数 HOME、 SHELL、 USER、 LOGNAME、 PATH を初期化する。
·
対象ユーザーのホームディレクトリを変更する。
·
シェルの argv[0] に '-' を設定して、 そのシェルをログインシェルとする。
-m, -p, --preserve-environment
環境変数を変更しない。 つまり HOME、 SHELL、 USER、 LOGNAME の設定を行わない。 このオプションは、 --login オプションが指定された場合には無視される。
-P, --pty
セッションに対して疑似端末を生成する。 端末を独立させると、 元々のセッションが利用する端末を、 ユーザーが共有しなくなるため、 セキュリティが高まる。 これを用いれば、 TIOCSTI ioctl 端末インジェクションや、他のセキュリティ攻撃による、 端末ファイルディスクリプターへの攻撃を回避できる。 すべてのセッションは、 バックグラウンド実行することもできる (su --pty - username -c application & のように実行する)。 疑似端末が有効である場合、 su は、 セッション間のプロキシーとして動作する (標準入力と標準出力を同期する)。
この機能の大部分は、 対話型セッションのために設計されている。 標準入力が端末ではない、 つまりたとえばパイプであった場合 (echo "date" | su --pty を実行した場合)、 疑似端末における ECHO フラグは、 不要な出力を抑えるため、 無効化される。
-s, --shell=shell
指定された shell が、 デフォルトの代わりに実行される。 実行されるシェルは、 以下のルールに従って決定する。 決定順は以下のとおり。
·
--shell によって指定されたシェル。
·
--preserve-environment オプションが指定されている場合は、 環境変数 SHELL に指定されたシェル。
·
対象ユーザーの passwd エントリーに記述されたシェル。
·
/bin/sh
対象ユーザーが制限つきシェルを利用している場合 (つまり /etc/shells に含まれていないシェルを利用している場合)、 呼び出しているユーザーが root でない限り、 オプション --shell や環境変数 SHELL は無視される。
--session-command=command
-c と同様。 ただし新規セッションは生成しない (利用は非推奨)。
-w, --whitelist-environment=list
--login の指定によって、 環境変数をクリアする際に、 カンマ区切りの list に指定された環境変数は、 リセットを行わない。 ホワイトリストの指定にあたって、 環境変数 HOME、 SHELL、 USER、 LOGNAME、 PATH の指定は無視される。
-h, --help
ヘルプを表示して終了する。
-V, --version
バージョンを表示して終了する。
SIGINT、 SIGQUIT、 SIGTERM の受信にあたって、 su は子プロセスを終了させた後に、 そのシグナルを使って、 自身を終了させる。 子プロセスは SIGTERM によって終了するが、 それが正常終了しなかった場合は、 2 秒後に SIGKILL によって kill される。
su は、 設定ファイル /etc/default/su と /etc/login.defs を読み込む。 su に関係するのは、 以下の設定項目である。
FAIL_DELAY (数値)
認証に失敗した際の待機時間。 指定数値は、 負でない正数でなければならない。
ENV_PATH (文字列)
通常ユーザーに対しての環境変数 PATH を定義する。 デフォルト値は /usr/local/bin:/bin:/usr/bin である。
ENV_ROOTPATH (文字列), ENV_SUPATH (文字列)
root ユーザーに対しての環境変数 PATH を定義する。 ENV_SUPATH の定義が優先される。 デフォルト設定は、 /usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin である。
ALWAYS_SET_PATH (ブール値)
yse が設定され、 --login と --preserve-environment が指定されていなかった場合、 su は PATH を初期化する。
環境変数 PATH は、 /bin や /sbin が /usr にマージされているシステムでは異なることがある。 またこの変数は、 コマンドラインオプション --login や、 PAM システムの設定(つまり pam_env(8)) にも影響を受ける。
su は通常、 実行したコマンドの終了ステータスを返す。 そのコマンドがシグナルによって kill された場合、 su は、 そのシグナル番号に 128 を加えた値を返す。
su 自体が生成する終了ステータスは以下である。
1
指定されたコマンドを実行する前の一般的なエラー。
126
指定されたコマンドが実行できなかった。
127
指定されたコマンドが存在しなかった。
/etc/pam.d/su
デフォルトの PAM 設定ファイル。
/etc/pam.d/su-l
--login 指定時に用いる PAM 設定ファイル。
/etc/default/su
コマンド固有の logindef 設定ファイル。
/etc/login.defs
システム全体の logindef 設定ファイル。
セキュリティ上の理由から、 su はログイン失敗を必ず btmp ファイルにログ出力するが、 lastlog ファイルへは一切書き出しを行わない。 このような状況は、 PAM 設定を用いて su の動作を制御する際に利用することができる。 pam_lastlog(8) モジュールを使って、 ログイン失敗に関する警告メッセージを表示したい場合は、 pam_lastlog(8) が lastlog ファイルも更新するように設定しておかなければならない。 たとえば以下により、これを実現する。
session required pam_lastlog.so nowtmp
この su コマンドは、 coreutils の su に由来している。 それは、 David MacKenzie の実装に基づいている。 util-linux バージョンは、 Karel Zak により改変されている。
setpriv(1), login.defs(5), shells(5), pam(8), runuser(1)
バグ報告は、 以下にある issue トラッカーを利用すること。 <https://github.com/util-linux/util-linux/issues>.
su コマンドは util-linux パッケージの一部であり、 以下からダウンロードできる。 Linux Kernel Archive <https://www.kernel.org/pub/linux/utils/util-linux/>.