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?

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.


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).


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

¡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

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.


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.


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



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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.