suコマンドでユーザーを切り替える
suコマンドを使うと、一時的に別のユーザーになる事ができます。
といっても、実際には、一時的に別のユーザーになるのではなく、新しくそのユーザーでシェルを起動しているだけです。
一般ユーザーで作業をしていて、root権限が必要な作業をする時や、特定のアカウントの環境になって作業したい時、特定のアカウントの権限でコマンドを使用した時等に使用します。
Last Update : 2013年06月07日
suコマンドでユーザーを切り替える 項目
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でファイルが作成された