su オプション - 他のユーザーとしてコマンドを実行する

su オプション - 他のユーザーとしてコマンドを実行する

スクリプト内で他のユーザーにコマンドを実行する方法を知りたいです。

スクリプト所有者を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。このフラグを使用すると、コマンドを実行するユーザーを指定できます。susudo-u

sudo -u hudson command

関連情報