それをサポートするシステム(GNUおよび他のかなりの数)では、次のことができます。
sudo find /path/ -print0 | xargs -r0 process_paths
xargs
sudo
はで実行されないため、元のuid / gidsと元の環境(より広い意味で)があり、によって変更された環境ではありませんsudo
。
process_paths
stdinは最終的には変更されます(xargs
実装によっては/dev/null
、pipe
from 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 {} \+