ユーザーが特定のファイルの特定の文字列に対してgrep(sudo経由)とgrepを実行できるようにしたいと思います。このユーザーがすべてのファイルに対してgrepを実行できるようにしたくありません。ユーザーにファイルに対する読み取り権限がないため、sudoを使用する必要があります。私のコンピュータ上の他のサービスのログファイルをgrepするためにnagiosチェックを作成しようとしています。
しかし、うまくいきません。 sudoは引き続きパスワードを要求します。
sudo grep "string I want (" /var/log/thefilename.log
私のコマンドは次のとおりです。 (はい、文字列に生といくつかの空白が含まれるようにgrepしたいと思います。)(
/etc/sudoers.d/user-can-grep
次のようなものがあります。
user ALL=(root) NOPASSWD: /bin/grep "string I want (" /var/log/thefilename.log
sudoersファイルは所有者が所有し、root:root
権限があります。-r--r-----
サーバーはUbuntu Trusted 14.04.3 LTSです。
どうすればいいですか?
答え1
- スクリプトの作成(ルートとしてのみ作成可能)
- そのスクリプトで
grep
必要な操作を実行します。 - sudoers設定はスクリプトへのアクセスのみを許可します。
- ツールを設定するか、ユーザーに sudo を介してスクリプトを実行することをお勧めします
デバッグがより簡単で、特定のファイルへの特定のアクセスをロックするのが簡単で、悪用が難しくなります。
答え2
明らかに、sudoはコマンドをsudoersファイルの仕様と比較する前に文字列にマージします。したがって、あなたの場合は、引用符や他の形式のエスケープを使用する必要はありません。
user ALL=(root) NOPASSWD: /bin/grep string I want ( /var/log/thefilename.log
編集する:@user23013がコメントで指摘したように、これはすべてのファイルから「私が望む文字列」をgrepするために悪用される可能性があります。 (そして拡張に応じて、「文字列I」と「文字列」にも使用できます。)sudoのパラメータチェックを検討してください。使用前に慎重に!
また、次の呼び出しは同じです。つまり、ユーザーを特定の表現に制限することはできません。
sudo grep "string I want (" /var/log/thefilename.log
sudo grep 'string I want (' /var/log/thefilename.log
sudo grep string\ I\ want\ \( /var/log/thefilename.log
これは、引用符とエスケープがシェルによって処理され、決して到達しないためですsudo
。
答え3
ファイルにアクセスするにはルートのみが必要なので、同様のものを使用してcat
実行する必要があるプログラムtee
にパイプすることを検討してください。grep
たとえば、sudo cat /file/path | grep …
この方法では、必要な場所にルートを制限することができます。
答え4
sudo
素晴らしいですが、時には最も適していない場合もあります。このために私は高められた権限を許可するsuper
。super
super.tabは次のとおりです。
grepcmd "grep 'string I want (' /var/log/thefilename.log" user
として呼び出されますsuper grepcmd
。