J'essaie de faire fonctionner la commande suivante de manière à ce que le process_paths
script ne soit pas exécuté avec des privilèges élevés. Y a-t-il un moyen de faire cela?
sudo find /path/ -exec process_paths '{}' \+
Voici /path/
quelques fichiers sans autorisation de lecture pour un utilisateur normal. Le script a process_paths
juste besoin des chemins.
... -exec sudo -u user process_paths {} \+
sudo: unable to execute /usr/bin/perl: Argument list too long
: /SUDO_COMMAND
variable dans find. . [^.] * -type f -print0 | xargs -0 sudo chmod 664; ne fonctionne pas-exec
commandes à appeler comme utilisateur, pourquoi êtes - vous en cours d' exécution à l'find
aidesudo
en premier lieu?Réponses:
Sur les systèmes qui le prennent en charge (GNU et quelques autres), vous pouvez faire:
xargs
n'est pas exécuté soussudo
, donc il a toujours les uids / gids d'origine et aussi l'environnement d'origine (au sens large), pas celui modifié parsudo
.process_paths
stdin finit cependant par être modifié (selon l'xargs
implémentation, il est ouvert sur/dev/null
ou partage lepipe
fromsudo
/find
.Pour éviter cela (avec GNU
xargs
et des shells commeksh
,zsh
oubash
qui prennent en charge la substitution de processus), vous pouvez faire:Avec
zsh
:Dans
zsh
, en attribuant un nom d'utilisateur à la$USERNAME
variable spéciale, définissez les uids, gids sur celui de l'utilisateur correspondant dans la base de données utilisateur comme lesudo -u "$SUDO_USER"
ferait.Vous pourriez faire:
Mais parce que
sudo
transmet une$SUDO_COMMAND
variable d'environnement (qui contient la concaténation des arguments avec des espaces) àprocess_paths
, la liste des fichiers finit par être transmise deux fois,process_paths
ce qui signifie que la limite de la taille maximale d'args + env est susceptible d'être atteinte s'il y a un grand nombre de fichiers.Avec la plupart des
su
implémentations, vous devriez pouvoir faire:mais comme
su
n'a pas le même problème.la source
Vous pouvez utiliser
sudo
:Mais comme dit dans un commentaire, il peut apparemment échouer si le {} est trop long pour sudo.
la source