Respuestas:
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 chmod
comando. 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 chmod
o info chmod
desde 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 chmod
comando 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 PATH
variable de entorno para root no incluya 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 ejecutarse
env | grep ^PATH
Aquí hay algunos resultados de muestra de ejecutar el env
comando 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.sh
reside no está presente en la variable PATH del usuario raíz, por lo tanto, el comando no encontró error.
sudo
'es PATH
el mismo que el usuario de?
Las otras soluciones que he visto hasta ahora se basan en algunas definiciones del sistema, pero de hecho es posible sudo
usar el actual PATH
(con el env
comando) y / o el resto del entorno (con la -E
opció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
).
command not found
problema que se enfrenta en la distribución de Ubuntu. Gracias hombre.
./bashrc
para guardarlo entre sesiones
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 $PATH
se reemplaza, use visudo
y edite/etc/sudoers
Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin
También puede crear un enlace suave a su script en uno de los directorios ( /usr/local/bin
por 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.
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.
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
Intente en 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.