web-dev-qa-db-ja.com

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

スクリプトから別のユーザーとしてコマンドを実行する方法を考えていました。

スクリプトの所有者をrootに設定しています。また、スクリプト内で次のコマンドを実行して、hudsonユーザーとしてコマンドを実行しています。

su -c command hudson

これは正しい構文ですか?

86

はい。 --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: -
89
Oli

注:「スクリプトの所有者をrootとして設定しています」は何もしません。 setuidビットを設定しても まだ機能しません


ただし、実際にスクリプトをrootとして実行している場合は、Sudoを使用できます。 suは主にユーザーを切り替えるためのものであり、Sudoは他のユーザーとしてコマンドを実行するためのものです。 -uフラグを使用すると、コマンドを実行するユーザーを次のように指定できます。

Sudo -u hudson command
58
Michael Mrozek