En muchas ocaciones es necesario ejecutar sudo sobre un grupo de comandos, es una tarea muy común en sistemas tipos UNIX usar tuberías (pipe), redirección y concatenar comandos (&&, ||), por ejemplo si ejecutamos:
sudo comando1 && comando2 || comando3
El resultado obtenido no es el deseado debido a que los comandos 2 y 3 se invocaron con los privelegios del usuario actual y no bajo la influencia de sudo
Un ejemplo más específico
Partamos de la idea de que hemos instalado y configurado wordpress y queremos encontrar los ficheros donde wordpress usa la palabra array:
$ sudo find /var/www/wordpress -type f -name '*.php' -print0 | xargs -0 grep -l array grep: /var/www/wordpress/index.php: Permiso denegado grep: /var/www/wordpress/wp-rss.php: Permiso denegado grep: /var/www/wordpress/wp-register.php: Permiso denegado grep: /var/www/wordpress/wp-atom.php: Permiso denegado grep: /var/www/wordpress/wp-login.php: Permiso denegado ...
Como se muestra en el ejemplo anterior grep no tiene acceso a los ficheros que se encuentran en /var/www debido a que se ejecuta con los privilegios del usuario actual.
La solución
Ejecutar el grupo de comandos en una subshell, para ello tecleamos:
$ sudo bash -c "find /var/www/wordpress -type f -name '*.php' -print0 | xargs -0 grep -l array"
Lecturas recomendadas
– Carl Albing, JP Bossen, Cameron Newham. bash Cookbook. Acápite 17.15, Using sudo on a Group of Commands
– man sudo
– man sudoers
– man bash