Cuando trato de correr ./script.sh
me sale Permission denied
pero cuando corro bash script.sh
todo está bien.
¿Qué hice mal?
Cuando trato de correr ./script.sh
me sale Permission denied
pero cuando corro bash script.sh
todo está bien.
¿Qué hice mal?
Respuestas:
Significa que no tiene establecido el bit de permiso de ejecución script.sh
. Cuando se ejecuta bash script.sh
, solo necesita permiso de lectura script.sh
. Consulte ¿Cuál es la diferencia entre ejecutar "bash script.sh" y "./script.sh"? para más información.
Puede verificar esto ejecutando ls -l script.sh
.
Es posible que ni siquiera necesite comenzar un nuevo proceso de Bash. En muchos casos, simplemente puede ejecutar source script.sh
o . script.sh
ejecutar los comandos de script en su shell interactivo actual. Probablemente desee iniciar un nuevo proceso Bash si el script cambia el directorio actual o modifica el entorno del proceso actual.
Si los bits de permiso POSIX están configurados correctamente, la Lista de control de acceso (ACL) puede haberse configurado para evitar que usted o su grupo ejecuten el archivo. Por ejemplo, los permisos POSIX indicarían que el script de shell de prueba es ejecutable.
$ ls -l t.sh
-rwxrwxrwx+ 1 root root 22 May 14 15:30 t.sh
Sin embargo, intentar ejecutar el archivo da como resultado:
$ ./t.sh
bash: ./t.sh: Permission denied
El getfacl
comando muestra la razón por la cual:
$ getfacl t.sh
# file: t.sh
# owner: root
# group: root
user::rwx
group::r--
group:domain\040users:rw-
mask::rwx
other::rwx
En este caso, mi grupo principal es el domain users
que ha revocado los permisos de ejecución al restringir la ACL con sudo setfacl -m 'g:domain\040users:rw-' t.sh
. Esta restricción puede ser levantada por cualquiera de los siguientes comandos:
sudo setfacl -m 'g:domain\040users:rwx' t.sh
sudo setfacl -b t.sh
Ver:
Finalmente, la razón en este caso específico para no poder ejecutar el script es que el sistema de archivos en el que reside el script se montó con la noexec
opción. Esta opción anula los permisos POSIX para evitar que se ejecute cualquier archivo en ese sistema de archivos.
Esto se puede verificar ejecutando mount
para enumerar todos los sistemas de archivos montados; las opciones de montaje se enumeran entre paréntesis en la entrada correspondiente al sistema de archivos, p. ej.
/dev/sda3 on /tmp type ext3 (rw,noexec)
Puede mover el script a otro sistema de archivos montado o volver a montar el sistema de archivos permitiendo la ejecución:
sudo mount -o remount,exec /dev/sda3 /tmp
Nota: He utilizado /tmp
como ejemplo aquí, ya que hay buenas razones de seguridad para mantenerse /tmp
montado con el noexec,nodev,nosuid
conjunto de opciones.
Tratar
chmod 755 script.sh
esto hará que el archivo sea ejecutable. Entonces intenta,
./script.sh
Espero que esto funcione.
En mi win7 con admin ejecutando cmd; Tengo archivos .sh asociados con cygwin64 / bin / bash, pero fue bloqueado por cmd. Ninguna de las sugerencias anteriores ayudó (chmod, setfacl, mount).
La solución a continuación funcionó, es un administrador de acl-fixer martillo de administración cada vez que las carpetas / archivos se vuelven inaccesibles para el administrador en win7, que a menudo es):
Start > run cmd as Admin
c:\> script.sh
Access is denied.
cmd> chmod 0777 script.sh c:\cygwin64\bin\bash.exe
cmd> script.sh
Access is denied.
> assoc .sh
.sh=bash
> ftype bash
bash=C:\cygwin64\bin\bash.exe -- "%1" %*
> bash
$ FILE=c:/cygwin64/bin/bash.exe
$ FILE=${FILE////\\} # s,/,\,g
# Compare these permissions using accesschk by Mark Russinovich 2015
$ accesschk.exe -lq $FILE
$ accesschk.exe -lq c:/windows/system32/cmd.exe
# [large output not shown]
# === Solution: Change windows acl for bash ===
$ takeown /F $FILE /A > /dev/null
$ icacls $FILE /t /q /c /reset
$ icacls $FILE /t /q /c /grant :r Everyone:F
$ icacls $FILE /t /q /c /setowner Administrators
# ====
cmd> script.sh
OK .. invokes bash
getfacl script.sh
?