Ejecute ./script.sh vs bash script.sh - permiso denegado


Respuestas:


50

Permisos POSIX incorrectos

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.sho . script.shejecutar 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.

Listas de control de acceso

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 getfaclcomando 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 usersque 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:

Sistema de archivos montado con la opción noexec

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 noexecopció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 mountpara 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 /tmpcomo ejemplo aquí, ya que hay buenas razones de seguridad para mantenerse /tmpmontado con el noexec,nodev,nosuidconjunto de opciones.


2
Configuré chmod 777 y todavía tengo este error.
Piotr Stapp

2
No tenía ejecutivo en partición.
Piotr Stapp

así que no tengo ningún ejecutivo y no aparece en fstab. ¿Por qué demonios está haciendo esto a mis particiones no tmp que tengo?
Deryck

2
Era esa opción noexec en / etc / fstab.
user208145

Me gustaría agregar que también es aconsejable verificar si la carpeta que contiene el script es "ejecutable" o no (por lo que tiene la bandera X o no). Si no es así, el script solo será ejecutable por el usuario root.
Letokteren

30

Tratar

chmod 755 script.sh

esto hará que el archivo sea ejecutable. Entonces intenta,

./script.sh

Espero que esto funcione.


2
Llegué a U&L, reformateo de acuerdo con la convención, sin embargo, esto apenas agrega nada a la respuesta anterior.
Archemar

8
a veces, la respuesta más corta es la mejor :)
Sameera Kumarasingha

1

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