スクリプト内で他のユーザーにコマンドを実行する方法を知りたいです。
スクリプト所有者をrootに設定しました。また、スクリプトで次のコマンドを実行し、hudsonユーザーとして実行しました。
su -c command hudson
これは正しい構文ですか?
答え1
はい。これは--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
コマンドが引数を受け入れる場合は、それを引用する必要があります。そうでなければ、奇妙なことが起こります。ここでは、rootとして/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: -
答え2
注:「スクリプト所有者をrootに設定しました」は、setuidビットを設定しても何もしません。または
しかし、実際にスクリプトをrootとして実行すると仮定すると、主にユーザーを切り替え、他のユーザーとしてコマンドを実行することができますsudo
。このフラグを使用すると、コマンドを実行するユーザーを指定できます。su
sudo
-u
sudo -u hudson command