Buscar ruta_segura en sudo
[[email protected] ~]# sudo -V | grep 'Value to override'
Value to override user's $PATH with: /sbin:/bin:/usr/sbin:/usr/bin
Si $PATH
está siendo anulado use visudo
y editar /etc/sudoers
Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin
Permiso denegado
Para ejecutar un script, el archivo debe tener un conjunto de bits de permiso ejecutable .
Para comprender completamente los permisos de archivos de Linux, puede estudiar la documentación del chmod
dominio. chmod, una abreviatura de modo de cambio , es el comando que se utiliza para cambiar la configuración de permisos de un archivo.
Para leer la documentación de chmod para su sistema local, ejecute man chmod
o info chmod
desde la línea de comandos. Una vez leído y comprendido, debería poder comprender el resultado de ejecutar...
ls -l foo.sh
... que enumerará los permisos de LECTURA, ESCRITURA y EJECUCIÓN para el propietario del archivo, el propietario del grupo y todos los demás que no sean el propietario del archivo o un miembro del grupo al que pertenece el archivo (a veces se hace referencia a ese último grupo de permisos como "mundo" u "otro")
Aquí hay un resumen de cómo solucionar el error de permiso denegado en tu caso.
$ ls -l foo.sh # Check file permissions of foo
-rw-r--r-- 1 rkielty users 0 2012-10-21 14:47 foo.sh
^^^
^^^ | ^^^ ^^^^^^^ ^^^^^
| | | | |
Owner| World | |
| | Name of
Group | Group
Name of
Owner
El propietario tiene acceso de lectura y escritura rw pero el - indica que falta el permiso ejecutable
El chmod
el comando soluciona eso. (El grupo y otros solo tienen permisos de lectura establecidos en el archivo, no pueden escribir en él ni ejecutarlo)
$ chmod +x foo.sh # The owner can set the executable permission on foo.sh
$ ls -l foo.sh # Now we see an x after the rw
-rwxr-xr-x 1 rkielty users 0 2012-10-21 14:47 foo.sh
^ ^ ^
foo.sh ahora es ejecutable en lo que respecta a Linux.
Usar sudo da como resultado Comando no encontrado
Cuando ejecuta un comando usando sudo lo está ejecutando efectivamente como superusuario o root.
La razón por la que el usuario raíz no encuentra su comando es probablemente que el PATH
La variable de entorno para root no incluye el directorio donde foo.sh
se encuentra . Por lo tanto, el comando no se encuentra.
La variable de entorno PATH contiene una lista de directorios en los que se buscan comandos. Cada usuario establece su propia variable PATH según sus necesidades. Para ver qué está configurado para ejecutar
env | grep ^PATH
Aquí hay algunos resultados de muestra de ejecutar el env
anterior Comando primero como usuario ordinario y luego como usuario root usando sudo
[email protected]:~$ env | grep ^PATH
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
[email protected]:~$ sudo env | grep ^PATH
[sudo] password for rkielty:
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin
Tenga en cuenta que, aunque similares, en este caso los directorios contenidos en la RUTA del usuario sin privilegios (rkielty) y el superusuario no son los mismos .
El directorio donde foo.sh
resides no está presente en la variable PATH del usuario raíz, por lo tanto, el comando no encontrado error.
Las otras soluciones que he visto aquí hasta ahora se basan en algunas definiciones del sistema, pero de hecho es posible tener sudo
usa el PATH
actual (con el env
comando) y/o el resto del entorno (con el -E
opción) simplemente invocándolo bien:
sudo -E env "PATH=$PATH" <command> [arguments]
De hecho, uno puede convertirlo en un alias:
alias mysudo='sudo -E env "PATH=$PATH"'
(También es posible nombrar el propio alias sudo
, reemplazando el sudo
original .)