Esecuzione di uno script in zsh - permessi sui file


16

Sono confuso riguardo all'esecuzione dei permessi dei file che non si comportano come mi aspetto. Probabilmente perché le mie aspettative sono sbagliate. Comunque:

Ho un file di script, per semplicità è appena chiamato s, situato in ~/bin. Per il bene di questo esempio, il file contiene solo le seguenti righe:

#!/bin/zsh
echo "Test";

Molto semplice.

Naviga verso la ~/bindirectory e chmodle autorizzazioni di file di sal 400- vale a dire, in sola lettura per me solo. Nessuna autorizzazione di esecuzione. Quindi provo a eseguire lo script inserendone il percorso, dando questo:

% ./s
zsh: permission denied: ./s

Fin qui tutto bene. Il file non può essere eseguito a causa di autorizzazioni errate. Le autorizzazioni di bumping fino a 500(esegui l'autorizzazione concessa) funzionano anche bene - con queste autorizzazioni, il file viene eseguito correttamente:

% ./s
Test

Questo è tutto come previsto. Ma poi chmodriaccendo le autorizzazioni 400(eseguo nuovamente le autorizzazioni), provo a sourceinserire il file e questo succede:

% source s
Test

Sebbene le autorizzazioni siano 400, lo script viene eseguito.

Quindi ecco la mia domanda: perché ./sfallisce (come dovrebbe) ma source sviene eseguito normalmente? Ciò non vanifica l'intero scopo del permesso di esecuzione?

Su 400autorizzazioni sh se zsh sanche lavorare.

Sono sicuro che sto facendo o capendo qualcosa di orribilmente sbagliato da qualche parte. Può qualcuno punto dove a me, e spiegare la differenza tra ./s, source s, sh se zsh s?

Risposte:


17

Quando esegui ./s, dici al kernel di eseguire il programma s. Se si dispone dell'autorizzazione di esecuzione, il kernel legge i primi byte del file, vede la #!riga in modo che sappia che si tratta di uno script ed esegue l'interprete, passandogli il nome dello script come primo argomento. Se non si dispone dell'autorizzazione di esecuzione, il kernel interrompe l'esecuzione al primo passaggio.

Quando corri zsh s, lo esegui zshe gli dici di leggere il file chiamato se di interpretarlo come comandi. Non stai eseguendo s, stai eseguendo zsh. Stessa cosa con sh so cat s.

Quando esegui source s, di nuovo, dici a zsh di leggere un file, quindi ciò che conta è che tu abbia il permesso di leggere su di esso.


Ok, ha senso. Ma questo non sconfigge completamente il punto di avere il permesso di esecuzione? Non importa se è impostato o meno, sarò sempre in grado di eseguire lo script (o dire a zsh di interpretare i comandi nello script, che è equivalente).
C106,

Inoltre, cat sstampa solo il contenuto del file. cat s | zshli passa a zshe stampa Test.
C106,

1
@ C106 Il punto dell'autorizzazione di esecuzione è indicare che il file rappresenta qualcosa che è possibile eseguire senza ulteriori informazioni. È anche importante se il file è setuid / setgid. Un file potrebbe non avere i permessi di esecuzione ma è comunque costituito da istruzioni che capita che qualche programma per computer esegua da qualche parte.
Gilles 'SO- smetti di essere malvagio' il

Questo ha molto senso, ed è davvero incredibilmente ovvio davvero. Grazie.
C106,
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.