Permisos

bash: ./script.sh: Permission denied

El fichero existe y se lee bien, pero no arranca. Hay cuatro motivos distintos y el mensaje es el mismo para todos.

Qué comprobar, y en qué orden

En el orden en que lo miramos nosotros. No es un ranking de frecuencia: no publicamos estadísticas que no hemos medido.

  1. 1

    Falta el bit de ejecución.

    Comprobar

    ls -l script.sh

    Corregir

    chmod +x script.sh
  2. 2

    El sistema de ficheros está montado con noexec. Habitual en /tmp y en /var por endurecimiento.

    Comprobar

    findmnt -no OPTIONS -T script.sh

    Corregir

    # Mover el script a un sistema de ficheros sin noexec, que es lo correcto.
    # Quitar noexec de /tmp deshace una medida de seguridad deliberada.
  3. 3

    Falta el permiso de ejecución en algún directorio de la ruta. Para atravesar un directorio hace falta su bit x, no el de lectura.

    Comprobar

    namei -l $(pwd)/script.sh

    Corregir

    chmod +x /ruta/intermedia
  4. 4

    El intérprete del shebang existe pero no tiene su propio bit de ejecución. El mensaje señala al script y el permiso que falta está en el intérprete.

    Comprobar

    head -1 script.sh
    ls -l $(head -1 script.sh | sed 's|^#!||' | awk '{print $1}')

    Corregir

    sudo chmod +x /ruta/al/interprete

Un detalle que ahorra tiempo

Si el shebang apunta a un intérprete que no existe —o el fichero tiene saltos de línea de Windows y queda un \r pegado al nombre— el error **no** es este: es «bad interpreter: No such file or directory». Se distinguen a simple vista, y head -1 script.sh | cat -A lo confirma mostrando el ^M al final de la línea.

Los comandos de esta página se ejecutan en tu servidor y algunos modifican la configuración: léelos antes de pegarlos. Las rutas y los nombres de servicio varían entre distribuciones. Así se elabora este catálogo.