Gli script possono essere eseguiti anche quando non sono impostati come eseguibili?


25

Mi sembra di eseguire script (.sh) con e senza che siano impostati come eseguibili. Quindi, dove importa esattamente questo?

Risposte:


24

Supponiamo che tu abbia il file myscriptcontenente quanto segue:

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

Se rendi questo file eseguibile e lo esegui ./myscript, il kernel vedrà che i primi due byte sono #!, il che significa che è un file di script. Il kernel utilizzerà quindi il resto della riga come interprete e passerà il file come primo argomento. Quindi, funziona:

/bin/bash myscript

e bash legge il file ed esegue i comandi in esso contenuti.

Pertanto, affinché bash (o qualunque sia l'interprete richiesto dallo script) per "eseguire" lo script, deve solo essere in grado di leggere il file.

Quindi, per gli script, il bit di esecuzione rende solo un po 'più conveniente eseguirlo. Finché bash è eseguibile, è sempre possibile eseguire bash con il file di script come argomento oppure eseguire bash in modo interattivo e copiare incollare lo script riga per riga nel terminale per eseguire i comandi.


Grazie per aver spiegato in dettaglio. :) Se l'ho capito bene, qualsiasi accesso utente a bash necessita solo dell'accesso in lettura allo script per eseguirlo perché bash prenderà lo script come input e dovrà solo leggerlo. Posso interrompere questo comportamento prendendo l'autorizzazione di lettura dello script per quell'utente. Destra? Quindi, quando viene utilizzata questa autorizzazione eseguibile e conta esattamente?
Ashfame,

Sì, se si utilizza "bash myscript", l'utente deve solo accedere in lettura a "myscript" (e ovviamente eseguibile per / bin / bash se bash è presente nel percorso). Tuttavia, se rendi eseguibile il tuo script, le cose sono leggermente diverse. È vero che dal punto di vista del kernel, sarà di nuovo "/ bin / bash myscript" se la prima riga è #! / Bin / bash, ma per raggiungere quel punto, prima devi presentare lo script come eseguibile per il utente o gruppo. Tuttavia, è vero se per alcuni utenti lo script non è eseguibile ma leggibile, può comunque "eseguire" lo script con "bash myscript" ....
LGB

@LGB Quindi è praticamente inutile. La cosa buona è tagliare il permesso di lettura da un utente per quello script. Destra?
Ashfame,

@Ashfame: direi utile piuttosto che inutile. Il bit di esecuzione sui file regolari non è (e non è mai stato previsto che sia) utilizzato per limitare l'accesso. Sembra che te lo aspetti. Se si dispone di un eseguibile binario, è necessario disporre dell'autorizzazione di esecuzione per eseguirlo. Tuttavia, se hai accesso in lettura ad esso, puoi sempre copiare il file nella tua directory home, nel qual caso la copia sarà di tua proprietà, quindi puoi aggiungere l'autorizzazione di esecuzione ad esso ... ed eseguirlo. Per le directory, tuttavia, ha uno scopo leggermente diverso. Vedi mywiki.wooledge.org/Permissions
geirha,

1
Cosa devo usare al posto di / bin / bash se non conosco l'interprete corretto? Esiste un comando che esegue lo script in base alla riga shebang?
Aivar,

16

Assicurati di non confondere "l'esecuzione dello script di shell" con "esegui uno script di shell usando sh".

Ciò non sarà influenzato dalle autorizzazioni dei file su file.sh:

sh file.sh

Stai eseguendo sh(che si risolve nel programma /bin/sh), che legge file.shed esegue il suo codice.

Le autorizzazioni per i file avranno effetto se si esegue davvero lo script stesso :

./file.sh

Si noti che le autorizzazioni per i file non sono supportate da filesystem non Linux, come FAT. Quindi, anche se lo esegui chmod -x file.sh, il file avrà ancora i permessi precedenti.

Il permesso di esecuzione è applicato dal filesystem. Ma i programmi possono "eseguire" anche il codice leggendo il contenuto del file, che ignora le autorizzazioni del filesystem su "esegui".


Capisco il tuo punto. Ma allora è per gruppo o mondo o entrambi?
Ashfame,

@Ashfame Se si imposta l'autorizzazione eseguibile, lo script può essere eseguito direttamente dagli utenti che dispongono di tale autorizzazione, indipendentemente dal fatto che siano presenti su base di gruppo, mondo o proprietario. Ma anche le persone senza permesso di esecuzione possono eseguirlo chiamando un altro programma (come bash) per eseguire l'esecuzione - per bloccare che anche tu dovresti togliere il loro readpermesso.
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 basisMa come viene concessa l'autorizzazione a diversi utenti controllando l'autorizzazione eseguibile? E ho ottenuto il tuo secondo punto. Intendi togliere il permesso di lettura dello script in modo che non possano nemmeno elaborarlo tramite bash. Destra?
Ashfame,

@Ashfame Sul punto di autorizzazione di lettura, sì. Su come, si chiamerebbe qualcosa di simile sudo chmod g+x myfile.shnel terminale per aggiungere le autorizzazioni di esecuzione per il gruppo del file. Vedi il tutorial sui permessi dei file . Per gestire le autorizzazioni per più utenti contemporaneamente, utilizzare i gruppi, vedere ad esempio Gestione dei gruppi .
jg-faustus,

quello che intendevo era quando aggiungevamo l'autorizzazione eseguibile nella GUI, quindi per chi? proprietario / gruppo / mondo?
Ashfame,

1

Non pensarci in questo modo. Posso eseguire questo file? Pensalo nel modo in cui: Chi può eseguire questo file?

Se il computer è tuo e il file è tuo, sono sicuro che puoi eseguirlo. Potresti voler approfondire i comandi come chmod e chown e le autorizzazioni dei file.

Spero che aiuti.


Sì, li conosco. Ciò significa che io (proprietario) posso sempre eseguirlo. Destra? Quindi impostare un file come eseguibile è per il gruppo o il mondo o entrambi?
Ashfame,

1

La execsyscall del kernel Linux fallisce EACCESse il file non è eseguibile

Mentre puoi farlo sh myprog.sh(che legge solo i file e li interpreta), provando a eseguire il programma come ./myprog.shnon può funzionare, da quando lo fai:

Questo può essere verificato 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);
}

e myprog.sh:

#!/bin/sh
echo worked

Se myprog.shnon è eseguibile, mainnon riesce con:

execve: Permission denied
13
13

Testato in Ubuntu 17.10, gcc -std=c99.

POSIX 7 menziona che a:

Le funzioni exec, ad eccezione di fexecve (), falliranno se:

[EACCES] L'autorizzazione di ricerca viene negata per una directory elencata nel prefisso del percorso del nuovo file di immagine di processo, oppure il nuovo file di immagine di processo nega l'autorizzazione di esecuzione.

Ulteriori motivazioni sono disponibili all'indirizzo: /security/66550/unix-execute-permission-can-be-easily-bypassed-is-it-superfluous-or-whats-the

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.