それをサポートするシステム(GNUおよび他のかなりの数)では、次のことができます。
sudo find /path/ -print0 | xargs -r0 process_paths
xargssudoはで実行されないため、元のuid / gidsと元の環境(より広い意味で)があり、によって変更された環境ではありませんsudo。
process_pathsstdinは最終的には変更されます(xargs実装によっては/dev/null、pipefrom sudo/で開いているか共有しfindます。
これを回避するには(GNU xargsおよびのようなシェル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が、ユーザーデータベースの対応するユーザーのuidに設定されsudo -u "$SUDO_USER"ます。
あなたがすることができます:
sudo sh -c '
exec find /path/ -exec sudo -u "$SUDO_USER" process_paths {} +'
ただしsudo、$SUDO_COMMAND環境変数(引数とスペースの連結を含む)をprocess_pathsに渡すため、ファイルのリストが2回渡さprocess_pathsれることになり、大きな場合はargs + envの最大サイズの制限に達する可能性が高くなります。ファイルの数。
ほとんどのsu実装では、次のことができるはずです。
sudo sh -c '
exec find /path/ -exec su "$SUDO_USER" -c '\''
exec "$0" "$@"'\'' process_paths {} +'
あたかもsu同じ問題を持っていません。
... -exec sudo -u user process_paths {} \+