Je voudrais inspecter les autorisations de groupe d'un fichier à partir d'un script bash. Plus précisément, je dois vérifier si un fichier contient le bit inscriptible de groupe.
C'est ça. Aussi simple que cela. Toutefois:
- J'ai également besoin que ce soit portable.
test -w <file
ne me dira pas si c'est accessible en groupe.- La sortie de
ls -ld
est agréable pour les humains, mais pas si sûre des scripts. Techniquement, je pourrais analyser la sortie de manièredrwxrwxr-x
à extraire les bits de groupe, mais cela semble fragile. - L'interface pour
stat
est totalement incompatible entre OS X et d'autres systèmes. find <file> -perm ...
ne peut pas être la réponse?
bash
permissions
ls
stat
mislav
la source
la source
Réponses:
Méthode n ° 1 - stat
Vous pouvez utiliser la
stat
commande pour obtenir les bits d'autorisation.stat
est disponible sur la plupart des Unix (OSX, BSD, pas AIX d'après ce que je peux trouver). Cela devrait fonctionner sur la plupart des Unix, sauf OSX et BSD d'après ce que je peux trouver.Exemple
Utilisez cette commande:
Et utilisez un simple
grep
pour voir si le mode d'autorisation des groupes est 6 ou 7.Pour Mac OS X et BSD vous auriez besoin d'utiliser cette forme de
stat
,stat -f
(ou peut - êtrestat -x
), et d' analyser en conséquence. Étant donné que les options destat
sont différentes, vous pouvez encapsuler cette commande dans unelsb_release -a
commande et appeler la version appropriée en fonction du système d'exploitation. Pas idéal mais réalisable. Sachez que celalsb_release
n'est disponible que pour les distributions Linux, donc une autre alternative devrait être conçue pour tester d'autres systèmes d'exploitation Unix.Méthode n ° 2 - trouver
Je pense que cette commande pourrait vous servir mieux. J'utilise
find
et leprintf
commutateur.Exemple
Méthode n ° 3 - Perl
Perl pourrait être un moyen plus portable de le faire en fonction des systèmes d'exploitation que vous essayez de couvrir.
REMARQUE: ce qui précède utilise la
stat()
fonction de Perl pour interroger les bits du système de fichiers.Vous pouvez rendre cela plus compact en renonçant à utiliser un tableau
@pv
, et en traitantstat()
directement la sortie de :la source
stat
commande varie considérablement entre les différents systèmes et n'est pas portable.find . -printf
peut le faire mais ne peut pas déterminer s'il est disponible sur OSX 'find.Une option consiste à utiliser
perl
, qui sera portable partoutperl
est disponible. Il est difficile de trouver un système Unix sans lui. Voici un exemple de la façon dont il peut être intégré dans un script shell:Des
perl
exemples similaires peuvent être trouvés dans le stat perldoc .la source
J'ai fini par
ls
analyser:Je suis reconnaissant pour la réponse détaillée de @ slm, mais aucune des autres méthodes n'est aussi simple. La
stat
méthode m'obligerait à écrire au moins deux invocations différentes pour couvrir OS X, et même après cela, elle retourne la représentation octale à laquelle je dois encore appliquer l'arithmétique. La méthode Perl est OK mais nécessite que je démarre un interpréteur pour une tâche aussi simple, et je voudrais rester simple et utiliser uniquement des utilitaires posix.la source
perms=$(ls -ld -- "$1"); perms=${perms%% *}; case $perms in ?????w????) …
Tous les outils Unix / Linux standard.
Je suppose qu'il est POSSIBLE d'avoir un groupe d'écriture, mais pas de groupe de lecture. Dans cette possibilité, il s'agirait soit d'une déclaration de cas 2 | 3 | 6 | 7), soit d'un grep '[2 | 3 | 6 | 7]'.
la source