su options-別のユーザーとしてコマンドを実行する


75

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

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

su -c command hudson

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


他のグーグルの場合:一部のユーザーは、この機能を意図的に無効にしている場合があります。実行できますsudo cat /etc/passwd | grep user-abc。次のようなものが表示された場合user-abc:x:994:994::/home/user-abc:/bin/false、機能しません。これは、最後の部分「/bin/false」がそのユーザー用のシェルがないことを意味するためです。
アレクサンダーバード

回答:


78

はい。ここにあり--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: -

52

注:「スクリプトの所有者をルートとして設定しています」は何もしません。setuidビットが設定されていも動作しません


ただし、実際にルートとしてスクリプトを実行していると仮定すると、を使用できますsudosu主にユーザーを切り替えるためのものですが、sudo他のユーザーとしてコマンドを実行するためのものです。-u旗はあなたのようにコマンドを実行するユーザーを指定できます:

sudo -u hudson command

1
何度も私が使用しようとしていること(sudoersのはよく投与されているシステム上の)直面しているsudoあなたは、単にこれを取得することができますroot is not in the sudoers file。どの作るsu - <username> -c "command to run"唯一のオプションを。
RAM237

重要なコマンドを実行するときに引用符は不要です。(例:sudo -u kilgore mv this that
toraritte
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.