自動化のスクリプトで、ユーザ指定でスクリプトを実行したい場合はどうしたらいいだろう?自動化なので、インタラクティブがあってはいけない。
どうやら普通に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からだと、パスワードは不要らしい。じゃあ、完全に自動化できるので、問題なし!