「sudo find」コマンドで「-exec」コマンドが通常のユーザーとして実行されているかどうかを確認するには?

「sudo find」コマンドで「-exec」コマンドが通常のユーザーとして実行されているかどうかを確認するには?

process_pathsスクリプトが昇格された権限で実行されないように、次のコマンドが機能するようにします。これを行う方法はありますか?

sudo find /path/ -exec process_paths '{}' \+

これには、/path/一般ユーザーに読み取り権限がないファイルがあります。スクリプトにはprocess_pathsパスのみが必要です。

答え1

これをサポートするシステム(GNUや他の多くのシステム)では、次のことができます。

sudo find /path/ -print0 | xargs -r0 process_paths

xargsで実行されないため、sudo変更された環境ではなく、元のuids / gidsと元の環境(より大きな意味)をそのままにしてくださいsudo

process_pathsxargsただし、標準入力は最終的に変更されます(実装に応じて開かれ、/dev/null共有されます)。pipesudofind

これを回避するには(GNUxargsやシェルなどを使用するkshか、プロセスの交換をサポートzshするbash)、次のことを実行できます。

xargs -r0a <(sudo find /path/ -print0) process_paths

そしてzsh

sudo zsh -c '
   files=(/path/**/*(D))
   USERNAME=$SUDO_USER
   autoload zargs
   zargs $files -- process_paths'

では、zshユーザー名を$USERNAME特殊変数に割り当て、ユーザーデータベース内のそのユーザーのuid、gidを設定しますsudo -u "$SUDO_USER"

次のことができます。

 sudo sh -c '
   exec find /path/ -exec sudo -u "$SUDO_USER" process_paths {} +'

ただし、環境変数(スペースで連結された引数を含む)を渡すため、ファイルのリストはsudo2回渡されます。つまり、ファイルが非常に大きい場合、最大サイズ制限であるargs + envに達する可能性があります。$SUDO_COMMANDprocess_pathsprocess_paths

ほとんどの実装では、su次のことができるはずです。

 sudo sh -c '
   exec find /path/ -exec su "$SUDO_USER" -c '\''
     exec "$0" "$@"'\'' process_paths {} +'

同じ問題はsuありませんが。

答え2

あなたはそれを使用することができますsudo

sudo find <directory> -exec sudo -u <normal_user> <command> {} \;

しかし、コメントで述べたように、{}がsudoに比べて長すぎると明らかに失敗します。

関連情報