Come controllare le autorizzazioni di gruppo di un file


9

Vorrei ispezionare le autorizzazioni di gruppo di un file da uno script bash. In particolare, devo verificare se un file ha il bit scrivibile del gruppo attivo.

Questo è tutto. Semplice come quella. Però:

  1. Ho anche bisogno che questo sia portatile.
  2. test -w <file non mi dirà se è scrivibile in gruppo.
  3. L'output di ls -ldè piacevole per gli umani, ma non è così sicuro degli script. Tecnicamente ho potuto analizzare l'output in modo da drwxrwxr-xestrarre i bit di gruppo, ma questo sembra fragile.
  4. L'interfaccia per statè completamente incompatibile tra OS X e altri sistemi.
  5. find <file> -perm ... non può essere la risposta?

Devi controllare il bit di autorizzazione del gruppo o devi verificare se un gruppo specifico dispone delle autorizzazioni di scrittura? Il gruppo (o l'utente) potrebbe disporre dell'autorizzazione di scrittura tramite un ACL.
Gilles 'SO- smetti di essere malvagio' il

Solo il bit di autorizzazione del gruppo. Nessun gruppo specifico è rilevante.
mislav

Risposte:


8

Metodo n. 1 - stat

È possibile utilizzare il statcomando per ottenere i bit delle autorizzazioni. statè disponibile sulla maggior parte degli Unix (OSX, BSD, non AIX da quello che posso trovare). Questo dovrebbe funzionare sulla maggior parte degli Unix, tranne OSX e BSD da quello che posso trovare.

$ stat -c "%a" <file>

Esempio

$ ls -l a
-rw-rw-r-- 1 saml saml 155 Oct  6 14:16 afile.txt

Usa questo comando:

$ stat -c "%a" afile.txt
664

E usa un semplice grepper vedere se la modalità permessi dei gruppi è un 6 o 7.

$ stat -c "%a" afile.txt | grep ".[67]."

Per OSX e BSD avresti bisogno di utilizzare questa forma di stat, stat -f(o forse stat -x), e analizzare di conseguenza. Poiché le opzioni statsono diverse, è possibile racchiudere questo comando in un lsb_release -acomando e chiamare la versione appropriata in base al sistema operativo. Non ideale ma praticabile. Tieni presente che lsb_releaseè disponibile solo per le distribuzioni Linux, quindi un'altra alternativa dovrebbe essere ideata per testare altri sistemi operativi Unix.

Metodo n. 2: trova

Penso che questo comando potrebbe servirti meglio però. Uso finde l' printfinterruttore.

Esempio

$ find a -prune -printf '%m\n'
664

Metodo n. 3 - Perl

Perl potrebbe essere un modo più portatile per farlo a seconda dei sistemi operativi che stai cercando di coprire.

$ perl -le '@pv=stat("afile.txt"); printf "%04o", $pv[2] & 07777;'
0664

NOTA: quanto sopra fa uso della stat()funzione di Perl per interrogare i bit del filesystem.

Puoi renderlo più compatto rinunciando a un array @pve gestendo stat()direttamente l'output di :

$ perl -le 'printf "%04o", (stat("a"))[2] & 07777;'
0664

Penso che tu abbia perso il suo punto 4. Il statcomando varia ampiamente tra i diversi sistemi e non è portatile.
Giordania,

@jordanm - grazie l'ho visto, cercavo un'alternativa. Penso che find . -printfpossa farlo, ma non riesco a determinare se è disponibile sulla ricerca di OSX.
slm

1
Non sono riuscito a trovarlo come riferimento nella guida POSIX2008, quindi sono propenso a concordare. Non sono sicuro di altri metodi. Penso che devi mordere il proiettile qui e rilevare quale sistema operativo e chiamare l'approp. comando, sembrerebbe essere l'approccio migliore.
slm

1
Non riuscivo nemmeno a pensare a un metodo usando un'utilità di shell standard. Ecco perché la mia risposta usa perl.
Giordania,

1
@jordanm - grandi menti. Stavo lavorando anche su una soluzione perl Cool
Cool

1

Un'opzione è usare perl, che sarà portatile ovunque perlsia disponibile. È difficile trovare un sistema unix senza di esso. Ecco un esempio di come può essere integrato in uno script di shell:

if perl -e 'use Fcntl ":mode"; exit( ((stat("file.txt"))[2] & S_IWGRP) >> 3)'; then
    echo "file is group writable"
else
    echo "file is not group witeable"
fi

perlEsempi simili possono essere trovati in stat perldoc .


1

Ho finito per lsanalizzare:

is_group_writable() {
  local ls="$(ls -ld "$1")"
  [ "${ls:5:1}" = "w" ]
}

Sono grato per l'ampia risposta di @ slm, ma nessuno degli altri metodi è così semplice. Il statmetodo mi richiederebbe di scrivere almeno due invocazioni diverse per coprire OS X, e anche dopo ciò restituisce la rappresentazione ottale a cui devo ancora applicare l'aritmetica. Il metodo Perl è OK ma mi richiede di avviare un interprete per un compito così semplice, e vorrei mantenerlo semplice e usando solo utils posix.


2
Stai usando bash, non solo POSIX. In POSIX:perms=$(ls -ld -- "$1"); perms=${perms%% *}; case $perms in ?????w????) …
Gilles 'SO- smetti di essere malvagio'

0
FILE="filename";G=$(stat -c '%a' ${FILE} | cut -c2);
if [ $G -gt 5 ];then   echo "Group write is set on ${FILE}";fi

Tutti gli strumenti Unix / Linux standard.

Suppongo sia POSSIBILE avere una scrittura di gruppo, ma non una lettura di gruppo. In tale possibilità, si tratterebbe di una dichiarazione del caso 2 | 3 | 6 | 7) o di un grep "[2 | 3 | 6 | 7]"

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.