¿Pueden ejecutarse los scripts incluso cuando no están configurados como ejecutables?


25

Parece que puedo ejecutar scripts (.sh) con y sin ellos configurados como ejecutables. Entonces, ¿dónde importa exactamente esto?

Respuestas:


24

Digamos que tiene el archivo que myscriptcontiene lo siguiente:

#!/bin/bash
echo "Hello, World!"

Si hace que este archivo sea ejecutable y lo ejecute ./myscript, el núcleo verá que los dos primeros bytes son #!, lo que significa que es un archivo de script. El núcleo usará el resto de la línea como intérprete y pasará el archivo como primer argumento. Entonces, se ejecuta:

/bin/bash myscript

y bash lee el archivo y ejecuta los comandos que contiene.

Por lo tanto, para bash (o cualquier intérprete que requiera su script) para "ejecutar" el script, solo necesita poder leer el archivo.

Entonces, para los scripts, el bit de ejecución solo hace que sea un poco más conveniente ejecutarlo. Mientras bash sea ejecutable, siempre puede ejecutar bash con el archivo de script como argumento, o ejecutar bash de forma interactiva y copiar y pegar el script línea por línea en su terminal para ejecutar los comandos.


Gracias por explicar en detalle. :) Si lo entendí bien, cualquier acceso de usuario a bash solo necesita acceso de lectura al script para ejecutarlo porque bash tomará el script como entrada y solo necesitará leerlo. Puedo detener este comportamiento tomando el permiso de lectura del script para ese usuario. ¿Correcto? Entonces, ¿cuándo se usa este permiso ejecutable y exactamente importa?
Ashfame

Sí, si usa "bash myscript", entonces el usuario solo necesita acceso de lectura para "myscript" (y, por supuesto, ejecutable para / bin / bash si bash está allí dentro de la ruta). Sin embargo, si hace que su script sea ejecutable, las cosas son un poco diferentes. Es cierto que desde el punto de vista del núcleo, será "/ bin / bash myscript" nuevamente si la primera línea es #! / Bin / bash, pero para llegar a ese punto, primero debe presentar el script como ejecutable para el usuario o grupo. Sin embargo, eso es cierto si para algún usuario el script no es ejecutable sino legible, todavía puede "ejecutar" el script con "bash myscript" ....
LGB

@LGB Entonces eso es bastante inútil. Lo bueno es cortar el permiso de lectura de un usuario para ese script. ¿Correcto?
Ashfame

@Ashfame: Yo diría útil en lugar de inútil. El bit de ejecución en los archivos normales no se usa (y nunca se pretendió) para limitar el acceso. Parece que estás esperando eso de eso. Si tiene un ejecutable binario, debe tener permiso de ejecución para ejecutarlo. Sin embargo, si tiene acceso de lectura, siempre puede copiar el archivo a su propio directorio de inicio, en cuyo caso la copia será de su propiedad, por lo que puede agregarle permiso de ejecución ... y ejecutarla. Sin embargo, para directorios tiene un propósito un poco diferente. Ver mywiki.wooledge.org/Permissions
geirha

1
¿Qué debo usar en lugar de / bin / bash si no conozco al intérprete correcto? ¿Hay algún comando que ejecute el script de acuerdo con la línea shebang?
Aivar

16

Asegúrese de no confundir "ejecutar el script de shell" con "ejecutar un script de shell usando sh".

Esto no se verá afectado por los permisos de archivo en file.sh:

sh file.sh

Está ejecutando sh(que resuelve el programa /bin/sh), que lee file.shy ejecuta su código.

Los permisos de archivo tendrán efecto si realmente ejecuta el script en sí :

./file.sh

Tenga en cuenta que los permisos de archivos no son compatibles con sistemas de archivos que no sean Linux, como FAT. Entonces, incluso si ejecuta chmod -x file.sh, el archivo seguirá teniendo sus permisos anteriores.

El sistema de archivos impone el permiso de ejecución. Pero los programas también pueden "ejecutar" el código al leer el contenido del archivo, lo que omite los permisos del sistema de archivos en "ejecutar".


Entiendo tu punto. ¿Pero entonces es para grupo o mundo o ambos?
Ashfame

@Ashfame Si configura el permiso ejecutable, los usuarios que tienen ese permiso pueden ejecutar el script directamente, ya sea que lo tengan en forma grupal, mundial o de propietario. Pero incluso las personas sin permiso de ejecución pueden ejecutarlo llamando a un programa diferente (como bash) para hacer la ejecución, para bloquear que también tendrían que quitarles su readpermiso.
jg-faustus

If you set the executable permission, the script can be run directly by users who have that permission - whether they have it on a group, world or owner basisPero, ¿cómo se otorga el permiso a diferentes usuarios al verificar el permiso ejecutable? Y obtuve tu segundo punto. Te refieres a quitarles el permiso de lectura del guión para que ni siquiera puedan procesarlo a través de bash. ¿Correcto?
Ashfame

@Ashfame En el punto de permiso de lectura, sí. Sobre cómo, llamaría a algo como sudo chmod g+x myfile.shen el terminal para agregar permisos de ejecución para el grupo del archivo. Ver Tutorial de permisos de archivos . Para administrar los permisos de varios usuarios simultáneamente, debe usar grupos; consulte, por ejemplo, Administración de grupos .
jg-faustus

lo que quise decir fue cuando agregamos el permiso ejecutable en la GUI, ¿entonces es para quién? dueño / grupo / mundo?
Ashfame

1

No pienses en eso de la manera que. ¿Puedo ejecutar este archivo? Piénselo de la manera que: ¿Quién puede ejecutar este archivo?

Si la computadora es suya y el archivo es suyo, estoy seguro de que puede ejecutarlo. Es posible que desee profundizar en comandos como chmod y chown , y permisos de archivos.

Espero que eso ayude.


Sí, sé sobre ellos. Eso significa que yo (propietario) siempre puedo ejecutarlo. ¿Correcto? ¿Entonces configurar un archivo como ejecutable es para el grupo o el mundo o ambos?
Ashfame

1

La execsyscall del kernel de Linux falla EACCESsi el archivo no es ejecutable

Si bien puede hacerlo sh myprog.sh(que solo lee los archivos e interpreta), intentar ejecutar el programa ./myprog.shno puede funcionar, ya que cuando lo hace:

Esto se puede verificar con main.c:

#define _XOPEN_SOURCE 700
#include <errno.h>
#include <stdio.h>
#include <unistd.h>

int main(void) {
    char *argv[] = {"myprog", NULL};
    char *envp[] = {NULL};
    int ret;
    ret = execve("myprog.sh", argv, envp);
    perror("execve");
    printf("%d\n", errno);
    printf("%d\n", EACCES);
}

y myprog.sh:

#!/bin/sh
echo worked

Si myprog.shno es ejecutable, mainfalla con:

execve: Permission denied
13
13

Probado en Ubuntu 17,10, gcc -std=c99.

POSIX 7 menciona que en:

Las funciones ejecutivas, excepto fexecve (), fallarán si:

[EACCES] Se denegó el permiso de búsqueda para un directorio que figura en el prefijo de ruta del nuevo archivo de imagen de proceso, o el nuevo archivo de imagen de proceso niega el permiso de ejecución.

Se pueden encontrar más razones en: /security/66550/unix-execute-permission-can-be-easily-bypassed-is-it-superfluous-or-whats-the

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.