kazmax - Linux で自宅サーバー

suコマンドでユーザーを切り替える

suコマンドを使うと、一時的に別のユーザーになる事ができます。

といっても、実際には、一時的に別のユーザーになるのではなく、新しくそのユーザーでシェルを起動しているだけです。

一般ユーザーで作業をしていて、root権限が必要な作業をする時や、特定のアカウントの環境になって作業したい時、特定のアカウントの権限でコマンドを使用した時等に使用します。

Last Update : 2013年06月07日

suコマンドでユーザーを切り替える 項目

  1. 書式
  2. 別のユーザーに切り替える
  3. rootユーザーに切り替える
  4. su - と、su の違い (「-」の有無について)
  5. 他のユーザーアカウントの権限を使ってコマンドを実行する

1. 書式

su コマンドの書式

su [-lmp] [-c command] [-s shell] [--login]
   [--fast] [--preserve-environment] [--command=command]
   [--shell=shell] [-] [--help] [--version] [user [arg...]]

オプション

-c COMMAND COMMAND(1行)を実行する
--help 使い方に関するメッセージを標準出力
-, -l, --login 現在のシェルの環境変数をすべて解除し、その上で指定したユーザーとしてシェルを起動し、カレントディレクトリをそのユーザーホームディレクトリとします。
-m, -p, --preserve-environment 環境変数'HOME','USER','LOGNAME','SHELL' を変更しないでシェルを実行
-s, --shell shell 指定したshellで起動する
--version バージョン情報を標準出力に表示

具体的な使い方は下で。

2. 別のユーザーに切り替える

ここでは、user1からtest_userに切り替えています。

[user1@localhost ~]$ id
uid=500(user1) gid=500(user1) 所属グループ=500(user1) 

[user1@localhost ~]$ su - test_user  ← 切り替えるユーザーを指定
パスワード:  ← test_userユーザーのパスワード

[test_user@localhost user1]$ id
uid=501(test_user) gid=501(test_user) 所属グループ=501(test_user)

memo

実行されるシェルは ユーザーのパスワードエントリ(/etc/passwdのシェル)から選択されるので、 /sbin/nologin の様にログインできないシェルが指定されているユーザーにはなれない。 また、どのシェルを使うのか何も書かれていない場合は /bin/sh が実行される。

3. rootユーザーに切り替える

suコマンドの後ろにユーザーを指定しない場合は、rootユーザーを指定した事になります。

[user1@localhost ~]$ id
uid=500(user1) gid=500(user1) 所属グループ=500(user1)

[user1@localhost ~]$ su -  ← ユーザーを指定しない
パスワード: 

[root@localhost user1]# id
uid=0(root) gid=0(root) 所属グループ=0(root),1(bin),・・・

4. su - と、su の違い (「-」の有無について)

su コマンドと、userとの間の「-」ですが、有る場合と無い場合で動作が異なります。

-」をつけた場合は、現在のシェルの環境変数をすべて解除し、その上で指定したユーザーとしてシェルを起動します。そして、カレントディレクトリをそのユーザーホームディレクトリとします。

指定したユーザーで新規にログインする様なイメージですね。

-」をつけない場合は、現在の環境変数が引き継がれます(USER, HOME, LOGNAME以外)。

例)

[user1@localhost ~]$ export TESTENV=foobaa   ← 「TESTENV」という環境変数を作成
[user1@localhost ~]$ env | grep TESTENV
TESTENV=foobaa

[user1@localhost ~]$ su test_user  ← 「-」無しでsu
パスワード: 
[test_user@localhost user1]$ env | grep TESTENV 
TESTENV=foobaa    ← 環境変数が引き継がれている。

[test_user@localhost user1]$ exit

[user1@localhost ~]$ su - test_user  ← 「-」有りでsu
パスワード:
[test_user@localhost ~]$ env | grep TESTENV
↑ 環境変数が引き継がれないので、「TESTENV」という環境変数が無い

5. 他のユーザーアカウントの権限を使ってコマンドを実行する

書式

su -c '[コマンド]' [実行させるユーザーアカウント名]

[user1@localhost ~]$ su -c 'touch /tmp/test.txt' -
パスワード:
[user1@localhost ~]$ ls -l /tmp/test.txt
-rw-r--r-- 1 root root 0  6月  7 23:17 /tmp/test.txt  ← rootでファイルが作成された
Linux 基礎知識 関連記事