linux - todos - Comando no encontrado al usar sudo
sudo-i ubuntu (8)
Tengo un script llamado foo.sh
en mi carpeta de inicio.
Cuando ./foo.sh
a esta carpeta e ingreso ./foo.sh
, obtengo
-bash: ./foo.sh: Permission denied
.
Cuando uso sudo ./foo.sh
, obtengo
sudo: foo.sh: command not found
.
¿Por qué sucede esto y cómo puedo solucionarlo?
- Compruebe que tiene permiso de ejecución en el script. es decir,
chmod +x foo.sh
- Compruebe que la primera línea de ese script sea
#!/bin/sh
o algo así. - Para sudo estás en el directorio equivocado. consultar con
sudo pwd
Compruebe secure_path en sudo
[root@host ~]# sudo -V | grep ''Value to override''
Value to override user''s $PATH with: /sbin:/bin:/usr/sbin:/usr/bin
Si $PATH
está siendo reemplazado, use visudo
y edite /etc/sudoers
Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin
Las otras soluciones que he visto aquí hasta ahora se basan en algunas definiciones de sistema, pero de hecho es posible hacer que sudo
use la PATH
actual (con el comando env
) y / o el resto del entorno (con la opción -E
) simplemente invocando bien:
sudo -E env "PATH=$PATH" <command> [arguments]
De hecho, uno puede hacer un alias de esto:
alias mysudo=''sudo -E env "PATH=$PATH"''
(También es posible nombrar el alias en sí mismo sudo
, reemplazando el sudo
original).
Ok esta es mi solución: en ~ / .bash_aliases solo agregue lo siguiente:
# ADDS MY PATH WHEN SET AS ROOT
if [ $(id -u) = "0" ]; then
export PATH=$PATH:/home/your_user/bin
fi
Voila! Ahora puede ejecutar sus propios scripts con sudo o establecerlos como ROOT sin tener que exportar PATH = $ PATH: / home / your_user / bin cada vez.
Tenga en cuenta que necesito ser explícito al agregar mi PATH desde HOME para superusuario is / root
Parece que Linux dirá "comando no encontrado", incluso si le das explícitamente la ruta al archivo.
[veeam@jsandbox ~]$ sudo /tmp/uid.sh;echo $?
sudo: /tmp/uid.sh: command not found
1
[veeam@jsandbox ~]$ chmod +x /tmp/uid.sh
[veeam@jsandbox ~]$ sudo /tmp/uid.sh;echo $?
0
Es un error algo engañoso, sin embargo, es técnicamente correcto. Un archivo no es un comando hasta que es ejecutable, por lo que no se puede encontrar.
Pruebe chmod u+x foo.sh
lugar de chmod +x foo.sh
si tiene problemas con las guías anteriores. Esto funcionó para mí cuando las otras soluciones no lo hicieron.
También puede crear un enlace suave a su secuencia de comandos en uno de los directorios ( /usr/local/bin
por ejemplo) en la RUTA del superusuario. Luego estará disponible para el sudo.
chmod +x foo.sh
sudo ln -s path-to-foo.sh /usr/local/bin/foo
Eche un vistazo a esta respuesta para tener una idea de en qué directorio colocar el enlace suave.
Permiso denegado
Para ejecutar una secuencia de comandos, el archivo debe tener un conjunto de bits de permisos ejecutables .
Para comprender completamente los permisos de archivos de Linux, puede estudiar la documentación del comando chmod
. chmod , abreviatura de cambio de modo , 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 comando. Una vez leído y entendido, debería ser capaz de entender el resultado de correr ...
ls -l foo.sh
... que enumerará los permisos LEER, ESCRIBIR y EJECUTAR 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 (ese último grupo de permisos a veces se refiere a como "mundo" u "otro")
Aquí hay un resumen de cómo solucionar el error Permiso denegado en su 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 comando chmod
corrige eso. (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 concierne a Linux.
Usar los resultados de sudo en Comando no encontrado
Cuando ejecuta un comando usando sudo, lo está ejecutando efectivamente como superusuario o raíz.
La razón por la que el usuario raíz no encuentra su comando es probable que la PATH
entorno PATH
para root no incluya el directorio donde se encuentra foo.sh
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 lo que está configurado para ejecutar
env | grep ^PATH
Aquí hay un ejemplo de salida de ejecutar el comando env
anterior como un usuario ordinario y luego como el usuario raíz que usa sudo
rkielty@rkielty-laptop:~$ env | grep ^PATH
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
rkielty@rkielty-laptop:~$ 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 similar, en este caso los directorios contenidos en la RUTA el usuario no privilegiado (rkielty) y el superusuario no son lo mismo .
El directorio donde reside foo.sh
no está presente en la variable PATH del usuario raíz, de ahí el error de comando no encontrado .