Estoy tratando de hacer que el siguiente comando funcione de manera que el process_paths
script no se ejecute con privilegios elevados. ¿Hay alguna forma de hacer esto?
sudo find /path/ -exec process_paths '{}' \+
Aquí /path/
tiene algunos archivos que no tienen permiso de lectura para el usuario normal. El script process_paths
solo necesita los caminos.
... -exec sudo -u user process_paths {} \+
sudo: unable to execute /usr/bin/perl: Argument list too long
: /SUDO_COMMAND
variable en find. . [^.] * -tipo f -print0 | xargs -0 sudo chmod 664; no funciona-exec
comandos se invoquen como su usuario, ¿por qué lo estáfind
utilizandosudo
en primer lugar?Respuestas:
En los sistemas que lo admiten (GNU y muchos otros), puede hacer lo siguiente:
xargs
no se ejecuta debajosudo
, por lo que todavía tiene los uids / gids originales y también el entorno original (en el sentido más amplio), no el modificado porsudo
.process_paths
sin embargo, stdin termina siendo modificado (dependiendo de laxargs
implementación, está abierto/dev/null
o compartepipe
desdesudo
/find
.Para evitar eso (con GNU
xargs
y shells comoksh
,zsh
obash
que admitan la sustitución del proceso), puede hacer lo siguiente:Con
zsh
:En
zsh
, la asignación de un nombre de usuario a la$USERNAME
variable especial, establece los uids, gids a los del usuario correspondiente en la base de datos de usuarios comosudo -u "$SUDO_USER"
lo haría.Podrías hacerlo:
Pero debido a que
sudo
pasa una$SUDO_COMMAND
variable de entorno (que contiene la concatenación de los argumentos con espacios) aprocess_paths
, la lista de archivos termina pasándose dos veces, loprocess_paths
que significa que es probable que se alcance el límite del tamaño máximo de args + env si hay un gran Número de archivos.Con la mayoría de las
su
implementaciones, debería poder hacer:aunque como
su
no tiene el mismo problema.fuente
Puedes usar
sudo
:Pero como se dijo en un comentario, aparentemente puede fallar si el {} es demasiado largo para sudo.
fuente