usuario todos por permisos implementar hat etc escribible ejemplo dar como agregar abrir linux bash sudo

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?


  1. Compruebe que tiene permiso de ejecución en el script. es decir, chmod +x foo.sh
  2. Compruebe que la primera línea de ese script sea #!/bin/sh o algo así.
  3. 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 .