¿Por qué no puedo ejecutar script con solo permiso de ejecución?

Por el momento estoy jugando con Linux en mi raspbery pi y estoy tratando de aprender cómo funciona el sistema de permissions.

-rwx--x--- un grupo de dos usuarios, uno de ellos creó un script python en su propia carpeta de documentos con los permissions: -rwx--x--- .

El otro miembro del grupo debe ejecutar el file con el command Python hello.py pero dice que se deniega el permiso.

La única forma es darle al grupo también permiso para leer así que: -rwxr-x---

¿Por qué el permiso de ejecución no es suficiente para ejecutar el script de python?

Los permissions de ejecución son suficientes para que el núcleo ejecute el file.

Si el file comienza con #! , luego verá que es un script, analizará esa línea para descubrir la ruta del intérprete y un argumento opcional, y luego ejecutará ese intérprete con ese argumento opcional y la ruta del file como argumento.

Por ejemplo, si el file comienza con:

 #! /usr/bin/python -E 

El kernel cambia el execve("/path/to/the-script", ["the-script", "arg"], [envs]) a execve("/usr/bin/python", ["/usr/bin/python", "-E", "/path/to/the-script", "arg"], [envs]) .

Sin los permissions de ejecución, nunca habría llegado tan lejos.

Ahora, en ese punto, lo que importa es el permiso de ejecución del intérprete. Es ejecutable, luego funciona normalmente.

Sin embargo, más adelante, /usr/bin/python querrá abrir el /path/to/the-script para leer e interpretar el código en él. Y para eso, necesitará permiso de lectura para el file. A less que haya cambiado euid desde la última vez (por ejemplo, si el file /usr/bin/python tenía el bit suid / sgid), si no tenía permissions de lectura anteriormente, aún no lo tiene.

Entonces puede ejecutar un script correctamente si solo tiene permiso de ejecución. Es solo que si el intérprete necesita abrirlo para leer su contenido, falla (y verá que el post de error proviene del intérprete, no del intérprete de commands del que está tratando de ejecutar ese script). En un script como:

 #! /bin/echo Here goes 

Verá que no tener permiso de lectura no importa ya que echo no intenta abrir el file para leerlo.

Los scripts no necesitan un permiso "x" para ejecutarse. Desde la vista del núcleo, son simples files de text, y no se ejecutan, sino su intérprete. Si ejecuta un script de python, inicia el binary de python, y no su something.py.

Pero necesita la bandera r en el script, porque el intérprete debe poder leer el script para ejecutarlo.

Y la mayoría de los intérpretes no ejecutarán scripts sin un marcador ejecutable. Aunque podrían, es una convención de precaución de security.

Por lo tanto, para los scripts, necesita los indicadores r y x para ejecutarlos.