Come posso sapere se ho il permesso di eseguire un particolare comando?

18

C'è un modo per identificare se io come utente ordinario ho il diritto di emettere un comando.

Ad esempio; Voglio verificare se ho il diritto di emettere il comando shutdown prima che io lo emetti veramente.

Qualcosa come i seguenti comandi

-> doIhaveRightToIssue shutdown
-> Yes/No
    
posta Bernhard Colby 21.03.2017 - 15:28

5 risposte

24

Il caso più semplice è quello di un eseguibile binario come gzip . Per prima cosa, localizziamo l'eseguibile:

$ which gzip
/bin/gzip

Quindi esaminiamo gli attributi di questo file:

$ ls -l /bin/gzip
-rwxr-xr-x 1 root root 98240 oct 27  2014 /bin/gzip

Le tre x ci dicono che il file può essere eseguito dal proprietario (il primo root ), o chiunque nel gruppo root (secondo root ) e chiunque altro, rispettivamente. Quindi il tuo utente è autorizzato a eseguire il programma.

Tuttavia, il tuo eseguibile potrebbe essere un file di script che chiama all'interno altri eseguibili. Potresti essere in grado di eseguire lo script ma non i programmi chiamati al suo interno. Non c'è modo di determinare se il tuo utente è autorizzato a farlo, oltre a provarlo effettivamente.

Poi ci sono casi speciali come shutdown - questo è in realtà un collegamento simbolico a un'utilità principale chiamata systemctl , che ha i suoi meccanismi per determinare se sei autorizzato a chiamarlo e per chiederti il ​​tuo sudo password se non lo fai, per esempio.

(Informazioni sul comando which : questo individua gli eseguibili nel tuo $ PATH che ti è permesso di eseguire, e ti dice quale usare se ne hai più di uno con lo stesso nome nel $ PATH. individua solo qualsiasi eseguibile. Io lo uso qui come esempio di dove cercare il permesso.Il fatto che which trovi l'eseguibile indica già che hai il permesso di eseguirlo.)

    
risposta data Jos 21.03.2017 - 15:44
21

Con sudo :

$ sudo -l shutdown
/sbin/shutdown

Se non avessi il permesso, sudo si lamenterà invece di mostrare il comando.

Con polkit, controlli l'azione che vuoi eseguire:

$ pkcheck --action-id org.freedesktop.login1.power-off --process $$ -u --enable-internal-agent && echo yes
polkittemporary_authorization_id=tmpauthz1
yes

Trovare l'azione pertinente è una domanda diversa.

    
risposta data muru 21.03.2017 - 15:52
8

Puoi usare:

test -x $(command -v shutdown) && echo yes || echo no

command -v shutdown restituisce il percorso del comando shutdown . test -x controlla se quel percorso è eseguibile per te.

Si noti che sebbene si possa essere in grado di eseguire il comando, il comando potrebbe ancora fallire perché non ha il permesso inadeguato per eseguire l'operazione. Questo è il caso comune sui sistemi di tipo Unix, che invece di limitare l'accesso per eseguire un comando, limitano invece l'accesso alle operazioni che i programmi possono effettivamente fare.

    
risposta data Robie Basak 21.03.2017 - 20:54
5

Beh, a volte può essere un po 'difficile ...

Prima di tutto, guarda le autorizzazioni con ls -l ...

 owngrpotr  user  group  command
-rwxr-xr-x  root  bin    vim

Se l'ultimo / terzo terzetto ha un x ("può eseguire") in esso, quindi altri - e questo significa che tu puoi eseguirlo ... Se è uno script di shell o qualcosa del genere, quindi altri avrebbero bisogno di r ("può leggere").

Se altri non ha il permesso di esecuzione ma gruppo (la seconda tripletta), allora puoi eseguirlo se sei un membro della gruppo - nell'esempio sopra, bin . Ad esempio, il gruppo wheel viene spesso utilizzato per limitare chi può eseguire su , quindi solo gli utenti appartenenti a questo gruppo potrebbero eseguirlo del tutto. Un altro esempio è creare un gruppo per sviluppare ers e limitare l'esecuzione del compilatore C e di tali strumenti a questo gruppo.

Se dopo l'ultima tripletta c'è un trailing + , significa che vengono utilizzati gli AccessControllLists - questo potrebbe aggiungere diritti di esecuzione a utenti e gruppi aggiuntivi.

+++

Anche se sei in grado di eseguire il comando, il comando può dipendere dall'accesso a file, directory e / o dispositivi a cui non hai accesso - questo potrebbe limitare ciò che sarai in grado di fare (potresti non essere in grado di fare nulla).

Infine, sebbene tu possa avere il permesso di eseguire un comando, il comando stesso potrebbe controllare la tua identità e rifiutarti di permetterti di usarlo a meno che tu non sia elencato in un file di configurazione o che alcuni utenti (es. root ). Ad esempio, il comando mount consentirà solo root di montare qualsiasi dispositivo - gli utenti normali possono solo montare dispositivi elencati come tali in / etc / fstab ... che potrebbero non essere nessuno. Se non sei root e prova a montare qualcosa, mount si lamenterà e si rifiuterà di montare il dispositivo. Un altro esempio è sudo , che verrà eseguito per chiunque, ma solo gli utenti elencati in / etc / sudoers potranno effettivamente eseguire cose come root .

    
risposta data Baard Kopperud 21.03.2017 - 19:27
3

Usare which , type , command ecc. è una soluzione pratica che funzionerà nel 99% dei casi, ma per essere sicuro al 100% dovrai ispezionare manualmente ogni directory eseguibile elencata nel tuo %codice%. Molte shell (incluso $PATH ) aggiungeranno il prefisso al comando con entres da bash e tenteranno di eseguirle ripetutamente finché non avranno successo. Poiché $PATH non può realmente eseguire il comando, è impossibile per esso prevedere quale file verrà effettivamente selezionato dalla shell.

Ad esempio, immagina di avere which , entrambe le directory contenenti file eseguibili, ma per architetture diverse. L'esecuzione di PATH=/opt/arm/bin:/bin restituirà which dd (supponendo che disponga delle autorizzazioni per eseguirlo), poiché quella voce viene prima. Tuttavia, quando eseguo /opt/arm/bin/dd nella mia shell, verrà eseguito dd , perché /bin/dd non riuscirà a essere eseguito. La stessa situazione può accadere in caso di binari corrotti, librerie mancanti, ecc. Alla fine, non c'è un modo sicuro per sapere se sarai in grado di eseguire un comando o meno, a parte provare.

Un altro aspetto è ciò che consideri "avere i permessi". Come utente, ho le autorizzazioni per eseguire /opt/arm/bin/dd ma non rm ~/file . Di nuovo, non c'è un modo generale per sapere che senza un'ispezione manuale, o dando il comando e osservando i risultati.

    
risposta data Dmitry Grigoryev 22.03.2017 - 16:04

Leggi altre domande sui tag