Ricerca nel sito web

Ogni file Linux ha un bit di esecuzione. Ecco cosa significa


Sommario

  • Il bit di esecuzione determina se viene concessa o meno l'autorizzazione per eseguire un file come programma o script.
  • L'impostazione del bit di esecuzione su una directory determina la capacità di accesso, consentendo l'ingresso e l'accesso ai file.
  • Comprendere e manipolare i permessi dei file utilizzando comandi come stat e chmod è essenziale per gli utenti Linux.

Il sistema di autorizzazione dei file di base di Linux è semplice e robusto e non sorprende che sia sopravvissuto intatto per oltre 50 anni. Ma la parte di esecuzione è un elemento che crea confusione, che vale la pena comprendere in dettaglio.

Che cos'è il bit di esecuzione e come posso vedere di cosa si tratta?

Ogni file su un sistema Linux ha una serie di permessi che controllano cosa si può fare con esso: può essere letto, scritto o eseguito? Esistono tre livelli di utente, ognuno con il proprio set di autorizzazioni: il proprietario del file (utente), i membri del gruppo proprietario del file e tutti gli altri (altri). Queste tre azioni e tre tipi di utenti ci danno un totale di nove autorizzazioni per ogni file:

Ricordate che, su Unix e Linux, anche le directory sono file. Hanno gli stessi dati di autorizzazione degli altri file, anche se i significati di queste autorizzazioni sono leggermente diversi.

I permessi di lettura e scrittura sono abbastanza autoesplicativi, ma il "bit di esecuzione" è un po' più misterioso, persino magico. Una volta capito, tuttavia, è abbastanza semplice e particolarmente utile quando ne hai bisogno.

È possibile esaminare le autorizzazioni di un file utilizzando uno strumento come ls o stat. Prova a eseguire ls -l su un file sul tuo sistema e vedrai qualcosa di simile al seguente:

Ci sono molte informazioni sul file qui, ma le autorizzazioni sono solo l'insieme di lettere all'inizio. In questo caso, "rwxr-xr-x" significa che, mentre solo il proprietario del file può scriverci, tutti gli altri possono leggerlo ed eseguirlo. Sentirai il termine "bit di esecuzione" ma, in realtà, ci sono tre bit di esecuzione per file.

Cosa fa il bit di esecuzione a un file?

Lo scopo principale del bit di esecuzione è quello di controllare se è possibile eseguire o meno un file come programma o script. Se si immette il nome di un file sulla riga di comando, la shell tenterà di eseguirlo. Il tentativo di eseguire un file di dati come un documento o un'immagine produrrà un errore di autorizzazione:

Ciò è dovuto al fatto che il bit di esecuzione non è impostato su un file di questo tipo. Tuttavia, la parte di esecuzione non è magica; Non puoi agitare la tua bacchetta chmod su un file immagine e trasformarlo in un programma eseguibile:

È possibile eseguire un file solo se è di un certo tipo. In generale, ci sono due tipi di file che puoi eseguire direttamente su Linux:

  • Un eseguibile binario: si tratta di un file che è stato compilato dal codice sorgente e impacchettato per un'architettura specifica, utilizzando le istruzioni del codice macchina per svolgere il suo compito. È possibile compilare un programma di questo tipo dal sorgente, scaricarlo o installarlo utilizzando un gestore di pacchetti.
  • Un file di script: si tratta di un file di testo scritto in un linguaggio leggibile dall'uomo che può essere eseguito con un altro programma, un interprete. Potrebbe trattarsi di uno script di shell o di un programma in un linguaggio di scripting come Perl o PHP.

Quando si esegue direttamente un file di script, digitandone il percorso, la shell decide quale interprete utilizzare in base alla riga shebang dello script. Ad esempio, uno script Python può iniziare con questa riga:

        #!/usr/bin/python

    

Ciò rafforza il fatto che il bit di esecuzione riguarda le autorizzazioni e nient'altro. È ciò che consente alla shell di decidere se si deve essere autorizzati a provare a eseguire un file come un programma, non se l'esecuzione ha effettivamente senso.

È importante capire che il bit di esecuzione non è un modo infallibile per impedire l'esecuzione. Prendi questo script di shell come esempio:

        #!/bin/sh
echo "pretend this script does something dangerous like rm -rf / ..."

    

Potresti pensare che la rimozione dell'autorizzazione di esecuzione ti mantenga al sicuro:

Tuttavia, considera il seguente caso:

Disastro! Lo script viene ora eseguito perché:

  • Chiunque può eseguire il programma /bin/sh.
  • Il programma sh proverà a eseguire il nome del file passato come argomento, senza controllare il suo bit di esecuzione.

Quindi, l'esecuzione di un programma coinvolge due aspetti separati. Le autorizzazioni del file determinano se è possibile provare a eseguirlo digitandone il percorso. Il contenuto del file determina se esegue effettivamente un'operazione quando viene eseguito. In definitiva, il bit di esecuzione è un meccanismo di sicurezza per impedire l'esecuzione accidentale di un file.

Cosa fa il bit di esecuzione a una directory?

Il bit di esecuzione funziona in modo molto diverso quando viene impostato su una directory. Dopotutto, una directory non può essere un programma, quindi non ha senso eseguirne una. Al contrario, il bit di esecuzione determina se è possibile entrare in una directory e accedere ai relativi file.

Con il bit execute impostato su una directory, è possibile utilizzare il comando cd per accedervi e il comando ls per visualizzare i dettagli del suo contenuto:

Tuttavia, se rimuovi tale autorizzazione, non sarai più in grado di accedere a quella directory o visualizzare i dettagli dei file al suo interno:

Si noti che il comando ls visualizza ancora un elenco lungo, ma sostituisce la maggior parte dei dati con punti interrogativi, indicando che non è in grado di leggerli. I nomi effettivi dei file all'interno di una directory vengono memorizzati come parte di tale directory, quindi l'autorizzazione di lettura concede l'accesso ad essi. Ma qualsiasi altro dato, come la dimensione di un file o la sua data di modifica, è inaccessibile senza l'autorizzazione di esecuzione sulla directory.

Questo può portare a errori di confusione se si dispone di un alias di comando. Ad esempio, sul mio sistema Ubuntu, ls è alias a ls --color, che utilizza determinati dati del file per colorare il suo output. In una directory non eseguibile, questo genera errori:

Ma, senza questa opzione, ls funziona bene su una directory di questo tipo poiché tutto ciò che deve visualizzare sono i nomi dei file.

Come posso utilizzare e modificare il bit di esecuzione?

Se hai bisogno di concentrarti solo sulle autorizzazioni di un file, puoi utilizzare stat per ottenere risultati più dettagliati rispetto a ls. L'opzione -c del programma stat ti consente di specificare un formato per estrarre i metadati esatti di cui hai bisogno. Ad esempio, per mostrare solo le autorizzazioni di un file accanto al suo nome, utilizza questo formato:

        stat -c "%a %n"
    

Dovrai modificare questo comando su macOS che utilizza una versione BSD di stat piuttosto che la versione GNU di Linux:

        stat -f "%Sp %N"
    

Se si desidera solo la stringa di autorizzazione, è possibile eliminare "%n" ad esempio:

        stat -c "%a"
    

Questo può essere utile per lo scripting. Ad esempio, è possibile utilizzare questa riga per ottenere informazioni di riepilogo delle diverse impostazioni di autorizzazione per tutti i file in una directory:

        stat -c "%a" ~/home/projects/all/*/* | sort | uniq -c | sort

    

È possibile modificare le autorizzazioni di un file utilizzando il comando chmod. La sintassi completa di chmod è piuttosto complicata perché è uno strumento potente. Tuttavia, se ricordi le azioni di base basate sulle lettere e le abbreviazioni (u=utente/proprietario, g=gruppo, o=altro, a=tutti) è facile da usare.

Per rendere un file eseguibile da chiunque, utilizzare questo comando:

        chmod a+x file

    

Per rimuovere l'autorizzazione eseguibile da tutti gli utenti, digitare quanto segue:

        chmod a-x file