スクリプトから別のユーザーとしてコマンドを実行する方法を考えていました。
スクリプトの所有者をrootに設定しています。また、スクリプト内で次のコマンドを実行して、hudsonユーザーとしてコマンドを実行しています。
su -c command hudson
これは正しい構文ですか?
はい。 --help
は次のとおりです:
$ su --help
Usage: su [options] [LOGIN]
Options:
-c, --command COMMAND pass COMMAND to the invoked Shell
-h, --help display this help message and exit
-, -l, --login make the Shell a login Shell
-m, -p,
--preserve-environment do not reset environment variables, and
keep the same Shell
-s, --Shell SHELL use Shell instead of the default in passwd
いくつかのテスト(Sudo
アカウントのパスワードがわからないため、nobody
を使用しました)
$ Sudo su -c whoami nobody
[Sudo] password for oli:
nobody
コマンドが引数を取る場合、引用符で囲む必要があります。そうしないと、奇妙なことが起こります。ここでは、ルートとして/ home/oliにディレクトリを作成しようとしています(oliとして)なしコマンド全体を引用しています。
# su -c mkdir /home/oli/Java oli
No passwd entry for user '/home/oli/Java'
これは、mkdir
を-c
フラグの値として読み取るだけで、/home/oli/Java
をユーザー名として使用しようとしています。引用すると、うまくいきます。
# su -c "mkdir /home/oli/Java" oli
# stat /home/oli/Java
File: ‘/home/oli/Java’
Size: 4096 Blocks: 8 IO Block: 4096 directory
Device: 811h/2065d Inode: 5817025 Links: 2
Access: (0775/drwxrwxr-x) Uid: ( 1000/ oli) Gid: ( 1000/ oli)
Access: 2016-02-16 10:49:15.467375905 +0000
Modify: 2016-02-16 10:49:15.467375905 +0000
Change: 2016-02-16 10:49:15.467375905 +0000
Birth: -
注:「スクリプトの所有者をrootとして設定しています」は何もしません。 setuidビットを設定しても まだ機能しません
ただし、実際にスクリプトをrootとして実行している場合は、Sudo
を使用できます。 su
は主にユーザーを切り替えるためのものであり、Sudo
は他のユーザーとしてコマンドを実行するためのものです。 -u
フラグを使用すると、コマンドを実行するユーザーを次のように指定できます。
Sudo -u hudson command