Я пытаюсь заставить следующую команду работать так, чтобы process_paths
скрипт не выполнялся с повышенными привилегиями. Есть ли способ сделать это?
sudo find /path/ -exec process_paths '{}' \+
Здесь /path/
есть некоторые файлы, которые не имеют разрешения на чтение для обычного пользователя. Скрипту process_paths
нужны только пути.
... -exec sudo -u user process_paths {} \+
sudo: unable to execute /usr/bin/perl: Argument list too long
: /SUDO_COMMAND
переменной в find. . [^.] * -типа f -print0 | xargs -0 sudo chmod 664; не работает-exec
команды , которые будут вызываться в качестве пользователя, почему вы работаете ,find
используяsudo
в первую очередь?Ответы:
На системах, которые его поддерживают (GNU и многие другие), вы можете сделать:
xargs
не запускаетсяsudo
, поэтому он все еще имеет исходные uids / gids, а также исходную среду (в более широком смысле), а не ту, которая была измененаsudo
.process_paths
Тем не менее, stdin изменяется (в зависимости отxargs
реализации он открыт/dev/null
или разделяетpipe
fromsudo
/find
.Чтобы избежать этого (с GNU
xargs
и ракушек , какksh
,zsh
илиbash
что замена процесса поддержки), вы можете сделать:С
zsh
:В
zsh
, назначая имя пользователя$USERNAME
специальной переменной, устанавливает идентификаторы uid и gids для соответствующего пользователя в базе данных пользователей, какsudo -u "$SUDO_USER"
было бы.Вы могли бы сделать:
Но поскольку
sudo
передает$SUDO_COMMAND
переменную среды (которая содержит конкатенацию аргументов с пробелами) вprocess_paths
, список файлов заканчивается передачей дважды,process_paths
что означает, что ограничение максимального размера args + env, вероятно, будет достигнуто, если имеется большой количество файлов.С большинством
su
реализаций вы должны быть в состоянии сделать:хотя, поскольку
su
не имеет такой же проблемы.источник
Вы можете использовать
sudo
:Но, как сказано в комментарии, он может потерпеть неудачу, если {} слишком длинный для sudo.
источник