バックグラウンドで実行するスクリプトから別ユーザの権限でコマンドを実行するためにパスワードなしで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を実行して、
この中で起動されるエディタから変更します。
以下のように変更してください。
スクリプトからのsudoの利用 †
さて、パスワード入力なしのsudoを使ってスクリプトを作成したい場合があります。
あるデーモンプログラムの中から他のユーザ権限を必要とするスクリプトを起動したい場合などです。
実行したいコマンドをコマンドラインから実行するのと同様に記述すればいいのですが、
実行に失敗してしまう場合があります。
それはそのスクリプトを端末から直接実行するのではなく、
cronやat、またデーモンプログラムからの実行のような、
バックグラウンドからの起動を行う場合です。
その際には以下のようなエラーメッセージが出力されます。
これが失敗するのは、sudoの実行に端末(tty)が必要とされているためです。
具体的には/etc/sudoersに以下のような設定がなされています。
Defaults requiretty
これを以下のようにコメントアウトすることで、
端末からだけでなくバックグラウンドでのsudoの実行が可能になります。
#Defaults requiretty
なお、この設定のデフォルト値はOSによって異なります。
Ubuntu 12.04.2 LTSではrequirettyは設定されていない(設定行がありません)ため、
sudoバックグラウンド実行の失敗はありませんが、
CentOS6.4ではデフォルトで設定されているため、上述の失敗が起こります。
以上、バックグラウンドで実行するスクリプトから別ユーザの権限でコマンドを実行するために、
パスワードなしでsudoを利用する方法でした。