LoginSignup
3
1

More than 3 years have passed since last update.

ユーザー指定のコマンド実行

Posted at

自動化のスクリプトで、ユーザ指定でスクリプトを実行したい場合はどうしたらいいだろう?自動化なので、インタラクティブがあってはいけない。

どうやら普通にsudoを使えばよいらしい。

sudo --help
sudo - execute a command as another user

usage: sudo -h | -K | -k | -V
usage: sudo -v [-AknS] [-g group] [-h host] [-p prompt] [-u user]
usage: sudo -l [-AknS] [-g group] [-h host] [-p prompt] [-U user] [-u user] [command]
usage: sudo [-AbEHknPS] [-r role] [-t type] [-C num] [-g group] [-h host] [-p prompt] [-T timeout] [-u user] [VAR=value] [-i|-s] [<command>]
usage: sudo -e [-AknS] [-r role] [-t type] [-C num] [-g group] [-h host] [-p prompt] [-T timeout] [-u user] file ...

Options:
  -A, --askpass                 use a helper program for password prompting
  -b, --background              run command in the background
  -C, --close-from=num          close all file descriptors >= num
  -E, --preserve-env            preserve user environment when running command
      --preserve-env=list       preserve specific environment variables
  -e, --edit                    edit files instead of running a command
  -g, --group=group             run command as the specified group name or ID
  -H, --set-home                set HOME variable to target user's home dir
  -h, --help                    display help message and exit
  -h, --host=host               run command on host (if supported by plugin)
  -i, --login                   run login shell as the target user; a command may also be specified
  -K, --remove-timestamp        remove timestamp file completely
  -k, --reset-timestamp         invalidate timestamp file
  -l, --list                    list user's privileges or check a specific command; use twice for longer format
  -n, --non-interactive         non-interactive mode, no prompts are used
  -P, --preserve-groups         preserve group vector instead of setting to target's
  -p, --prompt=prompt           use the specified password prompt
  -r, --role=role               create SELinux security context with specified role
  -S, --stdin                   read password from standard input
  -s, --shell                   run shell as the target user; a command may also be specified
  -t, --type=type               create SELinux security context with specified type
  -T, --command-timeout=timeout terminate command after the specified time limit
  -U, --other-user=user         in list mode, display privileges for user
  -u, --user=user               run command (or edit file) as specified user name or ID
  -V, --version                 display version information and exit
  -v, --validate                update user's timestamp without running a command
  --                            stop processing command line arguments

確かにそもそもsudo はそのためのコマンドだ。普段は、sudoが使えるユーザが、Root権限がいるときに使っていたが、そうでないケース、今回だと、rootで実行しているスクリプトをazureuserで動かしたい。chmodとかもしてもいいけど、面倒だ。

これに従うと-uのフラグで行けそうだ。

sudo -u hoge cat sample.txt
Password:

そうだ、普段はパスワードを聞かれる。rootから他のユーザに移るときはどうだろう?パスワード必要なのはつらい。

$ sudo su
[sudo] password for ushio: 
# sudo -u ushio ./std_in_out.sh 
stdout
stderr

うむ。rootからだと、パスワードは不要らしい。じゃあ、完全に自動化できるので、問題なし!

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1