設定
設定ファイル
設定ファイルは/etc/sudoers
。設定を変更するにはvisudo
コマンドを使うべき。シンタックスエラーなどをチェックしてくれる。/etc/sudoers.d
にファイルをおいてもインクルードされる。
基本的な書き方は
ユーザー名 ホスト名=なれるユーザー 許可するコマンド
実際にはかなり複雑な文法があり、詳しくはman sudoers
に多くの例付きで書いてある。
また、主にDefaults
で始まる行でオプションを設定でき、それもman sudoers
に書いてある。
よく使うであろうオプション:
requiretty 端末が必要
timestamp_timeout パスワードのキャッシュ時間(分単位)
wheelグループに入っているユーザーのsudoを許可する
%wheel ALL=(ALL) ALL
この状態だとsudoしたときにパスワードを聞かれる(rootでなくsudoを実行したユーザーのパスワード)。
入力したパスワードは5分間キャッシュされ、その間は再度sudoしても聞かれなくなる。
このキャッシュ(というかcredential)が保存される場所は/var/db/sudo
。
パスワードなしで実行できるようにしたければ
%wheel ALL=(ALL) NOPASSWD: ALL
sshからのsudo
CentOSのデフォルトでは、制御端末を持たないプロセスからのsudoが禁止されている。つまり、
$ ssh ホスト名 "sudo whoami"
sudo: sorry, you must have a tty to run sudo
のように怒られてしまう。対策としては下記のようにssh -t
として端末を割りつけるか、
$ ssh -t ホスト名 "sudo whoami"
root
またはサーバの/etc/sudoers
に
Defaults !requiretty
と書いておく。
sudoコマンド
基本的な使い方
$ sudo -u ユーザー名 コマンド
$ sudo -u yamada ls /var/www/html
コマンドをクォートで囲って1個の引数として渡す
$ sudo sh -c "ls /"
### -Eをつけると現在の環境変数を引続
$ sudo -E sh -c 'echo $HOME'
複数のコマンドを実行する
$ sudo sh -c 'whoami; whoami'
ログインシェルの状態で実行するには-i
$ sudo -i pwd
-i
をつけると/etc/passwd
からログインシェルを取得してそれをシミュレートするので、~/.bash_profileなども読み込まれる。
バッチ処理でsudoするときは-n (non-interactive)
がオススメ
パスワードが必要な場合、入力を待つことなしにすぐにエラーになる。
環境変数について
CentOSのデフォルトでは
- 環境変数はリセットされる(実効ユーザーのHOMEになる)
- ただしHOSTNAMEなど一部の環境変数は変わらない
- その辺は
/etc/sudoers
のalways_set_home
、env_reset
、env_keep
で設定されている - 環境変数の扱いはFreeBSDでは違ったような気がする(少なくとも10年位前のでは)