Estou tentando fazer com que o seguinte comando funcione de maneira que o process_paths
script não seja executado sob privilégios elevados. Existe uma maneira de fazer isso?
sudo find /path/ -exec process_paths '{}' \+
Aqui /path/
tem alguns arquivos que não têm permissão de leitura para o usuário normal. O script process_paths
só precisa dos caminhos.
... -exec sudo -u user process_paths {} \+
sudo: unable to execute /usr/bin/perl: Argument list too long
: /SUDO_COMMAND
variável em localização. . [^.] * -type f -print0 | xargs -0 sudo chmod 664; funciona-exec
comandos sejam chamados como seu usuário, por que você estáfind
usandosudo
em primeiro lugar?Respostas:
Em sistemas que o suportam (GNU e muitos outros), você pode:
xargs
não é executado abaixosudo
, por isso ainda possui os uids / gids originais e também o ambiente original (no sentido mais amplo), não o modificado porsudo
.process_paths
stdin acaba sendo modificado embora (dependendo daxargs
aplicação, é aberto sobre/dev/null
ou açõespipe
desudo
/find
.Para evitar isso (com GNU
xargs
e shells comoksh
,zsh
oubash
que suportam a substituição de processos), você pode:Com
zsh
:Em
zsh
, atribuindo um nome de usuário à$USERNAME
variável especial, define os uids, gids como os do usuário correspondente no banco de dados do usuário, comosudo -u "$SUDO_USER"
faria.Você poderia fazer:
Mas como
sudo
passa uma$SUDO_COMMAND
variável de ambiente (que contém a concatenação dos argumentos com espaços) paraprocess_paths
, a lista de arquivos acaba sendo passada duas vezes, oprocess_paths
que significa que o limite no tamanho máximo de args + env será atingido se houver um grande número de arquivos.Com a maioria das
su
implementações, você deve ser capaz de:embora
su
não tenha o mesmo problema.fonte
Você pode usar
sudo
:Mas, como dito em um comentário, aparentemente pode falhar se o {} for muito longo para o sudo.
fonte