¿Por qué ejecutar el comando como sudo devuelve el comando no encontrado?

12

Comando de muestra:

drush cc all

funciona, pero esto:

sudo drush cc all

me da

sudo: drush: command not found

¿Por qué? ¿Cómo arreglar esto?

Codium
fuente
También he tenido este problema a veces, con comandos tan básicos como cd. Usando el dzdo cdretorno de "comando no encontrado". Por supuesto, más tarde me di cuenta de que cding en un directorio que no tiene permisos en, no ayudará mucho, así que tampoco necesito un intérprete de comandos o necesidad de dzdo ls, dzdo mv, etc los contenidos de fuera de ese directorio.
Comodín el
2
El problema sudo cdes que cdes un comando incorporado, no un programa. Si quieres ir a un directorio que usted no tiene ningún acceso a, y (por ejemplo) cambie el nombre de un archivo existe, se puede hacer (por ejemplo) sudo mv dir/oldfile dir/newfile o sudo sh -c "cd dir; mv oldfile newfile" .
G-Man dice 'Restablece a Monica' el

Respuestas:

13

Cuando usted sudo, obtiene un preconfigurado $PATH, que es (se supone que es) algo así como la ruta predeterminada del usuario raíz . Su programa no está en esa lista de directorios identificados por $PATH.

Ver por ejemplo

sudo intenta estar seguro cuando ejecuta comandos externos.

Hay dos formas distintas de tratar con las variables de entorno. Por defecto, la opción env_reset sudoers está habilitada. Esto hace que la ejecución de comandos con un entorno mínimo que contiene TERM, PATH, HOME, SHELL, LOGNAME, USERy USERNAMEademás de las variables de proceso llamante permitidos por las env_checky env_keep sudoers opciones. Existe efectivamente una lista blanca para las variables de entorno.

Si no puede configurar sudopara preservar su $PATH, la solución habitual es especificar la ruta completa del programa. Es posible que eso no funcione bien con los scripts que llaman a otros ejecutables en el directorio (no accesible).

Thomas Dickey
fuente
0

Debe especificar la ruta completa. También es más seguro; Si no especifica la ruta, es concebible que un atacante pueda crear otro programa que se ejecutará con permisos de root.

Además, debe poner una línea /etc/sudoerspara permitirlo. man sudoerspara la sintaxis, es demasiado poner aquí.

Tom Zych
fuente