Auf Systemen, die dies unterstützen (GNU und einige andere), können Sie Folgendes tun:
sudo find /path/ -print0 | xargs -r0 process_paths
xargs
wird nicht unter ausgeführt sudo
, hat also immer noch die ursprünglichen Uids / Gids und auch die ursprüngliche Umgebung (im weiteren Sinne), nicht die von modifizierte sudo
.
process_paths
stdin wird jedoch geändert (abhängig von der xargs
Implementierung ist es offen für /dev/null
oder teilt das pipe
from sudo
/ find
.
Um zu verhindern , dass (mit GNU xargs
und Muscheln wie ksh
, zsh
oder bash
dass die Unterstützung Prozess Substitution), könnten Sie tun:
xargs -r0a <(sudo find /path/ -print0) process_paths
Mit zsh
:
sudo zsh -c '
files=(/path/**/*(D))
USERNAME=$SUDO_USER
autoload zargs
zargs $files -- process_paths'
In zsh
einen Benutzernamen auf die Zuweisung von $USERNAME
speziellen Variablen, setzt die uids, gids zu der des entsprechenden Benutzers in der Benutzerdatenbank wie sudo -u "$SUDO_USER"
tun würde.
Du könntest es tun:
sudo sh -c '
exec find /path/ -exec sudo -u "$SUDO_USER" process_paths {} +'
Da sudo
jedoch eine $SUDO_COMMAND
Umgebungsvariable (die die Verkettung der Argumente mit Leerzeichen enthält) an übergeben wird process_paths
, wird die Liste der Dateien zweimal übergeben, process_paths
was bedeutet, dass die Grenze für die maximale Größe von args + env wahrscheinlich erreicht wird, wenn eine große vorhanden ist Anzahl der Dateien.
Bei den meisten su
Implementierungen sollten Sie in der Lage sein:
sudo sh -c '
exec find /path/ -exec su "$SUDO_USER" -c '\''
exec "$0" "$@"'\'' process_paths {} +'
obwohl da su
nicht das gleiche Problem hat.
... -exec sudo -u user process_paths {} \+