名前

su - 代わりのユーザー ID やグループ ID によってコマンド実行する

書式

su [options] [-] [user [argument...]]

説明

su は、 代わりのユーザー ID やグループ ID を使って、コマンドが実行できるようにする。

実行の際に user の指定がなかった場合、 su はデフォルトで、 root ユーザーにより対話型シェルを実行する。 user の指定があった場合は、 さらに追加の argument の指定が可能となる。 この引数はシェルに受け渡される。

後方互換のため、 su はデフォルトで、 カレントディレクトリの変更は行わず、 設定変更を行う環境変数は、 HOMESHELL (さらに対象 user が root でなければ、 USERLOGNAME) だけである。 実行にあたっては、 常に (短い - を用いるのではなく) --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 で指定されたものを除く、 全環境変数をクリアする。

·

環境変数 HOMESHELLUSERLOGNAMEPATH を初期化する。

·

対象ユーザーのホームディレクトリを変更する。

·

シェルの argv[0] に '-' を設定して、 そのシェルをログインシェルとする。

-m, -p, --preserve-environment

環境変数を変更しない。 つまり HOMESHELLUSERLOGNAME の設定を行わない。 このオプションは、 --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 に指定された環境変数は、 リセットを行わない。 ホワイトリストの指定にあたって、 環境変数 HOMESHELLUSERLOGNAMEPATH の指定は無視される。

-h, --help

ヘルプを表示して終了する。

-V, --version

バージョンを表示して終了する。

シグナル

SIGINTSIGQUITSIGTERM の受信にあたって、 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 が指定されていなかった場合、 suPATH を初期化する。

環境変数 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/>.