Edited at

CentOSのsudoまとめ

More than 1 year has passed since last update.


設定


設定ファイル

設定ファイルは/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/sudoersalways_set_homeenv_resetenv_keepで設定されている

  • 環境変数の扱いはFreeBSDでは違ったような気がする(少なくとも10年位前のでは)


参考

Sudo - ArchWiki