Comando no encontrado al usar sudo

146

Tengo un script llamado foo.shen mi carpeta de inicio.

Cuando navego a esta carpeta e ingreso ./foo.sh, me sale

-bash: ./foo.sh: Permission denied.

Cuando uso sudo ./foo.sh, me sale

sudo: foo.sh: command not found.

¿Por qué sucede esto y cómo puedo solucionarlo?

Neko
fuente

Respuestas:

151

Permiso denegado

Para ejecutar un script, el archivo debe tener un bit de permiso ejecutable establecido .

Para comprender completamente los permisos de los archivos de Linux , puede estudiar la documentación del chmodcomando. chmod , una abreviatura de modo de cambio , es el comando que se usa para cambiar la configuración de permisos de un archivo.

Para leer la documentación de chmod para su sistema local, ejecute man chmodo info chmoddesde la línea de comandos. Una vez leído y entendido, debería poder comprender el resultado de la ejecución ...

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 (a veces se hace referencia al último grupo de permisos) como "mundo" u "otro")

Aquí hay un resumen de cómo solucionar el error de 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 chmodcomando corrige eso. (El grupo y otros solo tienen permisos de lectura establecidos en el archivo, no pueden escribir 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 resultados de sudo en 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 root no encuentra su comando es probable que la PATHvariable de entorno para root no incluya el directorio donde foo.shse 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 ejecutarse

env | grep ^PATH

Aquí hay algunos resultados de muestra de ejecutar el envcomando anterior primero como un usuario normal 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 es similar, en este caso los directorios contenidos en la RUTA, el usuario no privilegiado (rkielty) y el superusuario no son los mismos .

El directorio donde foo.shreside no está presente en la variable PATH del usuario raíz, por lo tanto, el comando no encontró error.

Rob Kielty
fuente
1
@Nakilon, si pones eso en una pregunta con todos los detalles, debería poder solucionarlo más a fondo. El problema es probable qué shell (su primer shell de comando o el shell lanzado por sudo) ha evaluado $ PWD
Rob Kielty
66
@ Rob: así que ¿cómo hacer sudo'es PATHel mismo que el usuario de?
Tom
1
@Rob: Mientras tanto, he encontrado una manera (ver mi respuesta a continuación).
Tom
1
¡Me gusta cómo lo explicaste! Gracias :)
Kasparov92
1
@Tom puedes cambiar el secure_path en / etc / sudoers
DennisLi
98

Las otras soluciones que he visto hasta ahora se basan en algunas definiciones del sistema, pero de hecho es posible sudousar el actual PATH(con el envcomando) y / o el resto del entorno (con la -Eopción) simplemente invocando correctamente :

sudo -E env "PATH=$PATH" <command> [arguments]

De hecho, uno puede hacer un alias:

alias mysudo='sudo -E env "PATH=$PATH"'

(También es posible nombrar el alias en sí sudo, reemplazando el original sudo).

Tom
fuente
3
Me gusta esta solución, Tom, porque estás trabajando conscientemente con una invocación de sudo diferente. Es importante tener en cuenta qué variable PATH está en uso en todo momento de cualquier manera (y hay muchas) que está configurada.
Rob Kielty
44
Creo que esta es la solución correcta y más estandarizada para el command not foundproblema que se enfrenta en la distribución de Ubuntu. Gracias hombre.
Omar Tariq
puedes agregar el alias a tu ./bashrcpara guardarlo entre sesiones
George
19

Verifique 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 $PATHse reemplaza, use visudoy edite/etc/sudoers

Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin
codemonkee
fuente
¡Gracias! Eso ayudó a resolver un misterio de sudo no poder ejecutar comandos.
Evgeny Goldin
7
  1. Compruebe que tiene permiso de ejecución en el script. es decirchmod +x foo.sh
  2. Verifique que la primera línea de ese script sea #!/bin/sho algo así.
  3. Para sudo estás en el directorio equivocado. Comprueba consudo pwd
Ed Heal
fuente
5

También puede crear un enlace suave a su script en uno de los directorios ( /usr/local/binpor ejemplo) en la ruta del superusuario. Entonces 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 flexible.

TrigonaMinima
fuente
2

Parece que Linux dirá "comando no encontrado" incluso si proporciona 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, probablemente sea técnicamente correcto. Un archivo no es un comando hasta que es ejecutable, por lo que no se puede encontrar.

Jeff MacDonald
fuente
1

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 establecer como ROOT sin tener que hacer una exportación PATH = $ PATH: / home / your_user / bin cada vez.

Tenga en cuenta que debo ser explícito al agregar mi RUTA ya que HOME para superusuario es / root

Fernando D Jaime
fuente
1

Intente en chmod u+x foo.shlugar de chmod +x foo.shsi tiene problemas con las guías anteriores. Esto funcionó para mí cuando las otras soluciones no lo hicieron.

¿Qué hay en una búsqueda de Google?
fuente
1

Hay excelentes respuestas arriba. Si, después de probarlos, aún puede command not foundvolver a intentarlo con la ruta completa del archivo:

sudo /home/user/path/to/foo.sh
IggyM
fuente