Как мне убедиться, что команда `sudo find` запускается от имени обычного пользователя?

найти. \ (-name "* Mon-00 *" \) -mtime +6 -exec mv -t weekly {} \;

10
16.02.2017, 11:23
2 ответа

В системах, которые его поддерживают (GNU и многие другие), вы можете сделать:

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

xargs не работает под sudo , поэтому он по-прежнему имеет исходные uids / gids, а также исходную среду (в более широком смысле), а не ту, которая была изменена sudo .

process_paths stdin в конечном итоге изменяется (в зависимости от реализации xargs , он открыт в / dev / null или использует канал из sudo / найти .

Чтобы избежать этого (с GNU xargs и оболочками, такими как ksh , zsh или bash , которые поддерживают подстановку процессов), вы могли do:

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 устанавливает uids, gids на это соответствующего пользователя в базе данных пользователей, например sudo -u "$ SUDO_USER" .

Вы можете сделать:

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

Но поскольку sudo передает переменную среды $ SUDO_COMMAND (которая содержит объединение аргументов с пробелами) в process_paths , список файлов дважды передается в process_paths , что означает, что ограничение на максимальный размер args + env, вероятно, будет достигнуто при большом количестве файлов.

В большинстве реализаций su вы должны уметь:

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

, хотя, как и su , не имеет такой же проблемы.

16
27.01.2020, 20:01

Вы можете использовать sudo :

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

Но, как сказано в комментарии, он может не сработать, если {} слишком длинный для sudo.

1
27.01.2020, 20:01

Теги

Похожие вопросы