このエントリーをはてなブックマークに追加


バックグラウンドで実行するスクリプトから別ユーザの権限でコマンドを実行するためにパスワードなしでsudoを利用する

本資料はsudoについて記述してあります。
別ユーザ権限でコマンドを実行させたり、パスワードなしで実行したりする方法を以下に記します。


sudoの一般的な利用法

sudoは一般ユーザが一時的にroot権限(またはその他のユーザ権限)でコマンドを実行するためのコマンドです。
利用方法はsudoコマンドの引数として実行したいコマンドを入力します。
以下がsudoコマンドの実行例です。一般ユーザであるuser1がシステムをシャットダウンしようとしています。

% sudo shutdown -h now
[sudo] password for user1:

実行するとパスワードの入力を求められますので、(rootのパスワードではなく)
実行しているユーザの(この場合はuser1の)パスワードを入力するとroot権限でコマンドが実行されます。

パスワードを入力せずにsudoを利用する

設定によってはこのパスワードの入力も不要となります。
sudoの設定ファイルは/etc/sudoersです。
設定を変更するには通常のエディタから直接行うのではなく、
sudoの設定専用コマンド、visudoを実行して、
この中で起動されるエディタから変更します。
以下のように変更してください。

  • 変更前
    # Members of the admin group may gain root privileges
    %admin ALL=(ALL) NOPASSWD: ALL
  • 変更後
    # Members of the admin group may gain root privileges
    %admin ALL=(ALL) NOPASSWD: ALL

スクリプトからのsudoの利用

さて、パスワード入力なしのsudoを使ってスクリプトを作成したい場合があります。
あるデーモンプログラムの中から他のユーザ権限を必要とするスクリプトを起動したい場合などです。
実行したいコマンドをコマンドラインから実行するのと同様に記述すればいいのですが、
実行に失敗してしまう場合があります。

それはそのスクリプトを端末から直接実行するのではなく、
cronやat、またデーモンプログラムからの実行のような、
バックグラウンドからの起動を行う場合です。

その際には以下のようなエラーメッセージが出力されます。

  • 日本語環境でのメッセージ
    sudo: sudo を実行するには tty がなければいけません。すみません
  • 英語環境でのメッセージ
    sudo: sorry, you must have a tty to run sudo

これが失敗するのは、sudoの実行に端末(tty)が必要とされているためです。

具体的には/etc/sudoersに以下のような設定がなされています。

Defaults    requiretty

これを以下のようにコメントアウトすることで、
端末からだけでなくバックグラウンドでのsudoの実行が可能になります。

#Defaults    requiretty

なお、この設定のデフォルト値はOSによって異なります。
Ubuntu 12.04.2 LTSではrequirettyは設定されていない(設定行がありません)ため、
sudoバックグラウンド実行の失敗はありませんが、
CentOS6.4ではデフォルトで設定されているため、上述の失敗が起こります。

以上、バックグラウンドで実行するスクリプトから別ユーザの権限でコマンドを実行するために、
パスワードなしでsudoを利用する方法でした。



トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2015-03-20 (金) 22:29:50