ユーザーが引数(スペースを含む)を使用してコマンドを実行できるようにする

ユーザーが引数(スペースを含む)を使用してコマンドを実行できるようにする

ユーザーが特定のファイルの特定の文字列に対して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

  1. スクリプトの作成(ルートとしてのみ作成可能)
  2. そのスクリプトでgrep必要な操作を実行します。
  3. sudoers設定はスクリプトへのアクセスのみを許可します。
  4. ツールを設定するか、ユーザーに 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素晴らしいですが、時には最も適していない場合もあります。このために私は高められた権限を許可するsupersuper

super.tabは次のとおりです。

grepcmd "grep 'string I want (' /var/log/thefilename.log" user

として呼び出されますsuper grepcmd

関連情報