web-dev-qa-db-fra.com

Comment puis-je obtenir des autorisations de fichier octales à partir de la ligne de commande?

Il existe une commande chmod pour définir les autorisations de fichiers, mais puis-je obtenir les autorisations de fichiers en mode octal (tel que 755) à partir de la ligne de commande?

359
Anwar

Tu peux essayer

stat -c "%a %n" *

Remplacez * par le répertoire approprié ou le nom de fichier exact à examiner.

Depuis le page de manuel de stat ,

-c  --format=FORMAT
          use  the  specified  FORMAT instead of the default; output a newline after
          each use of FORMAT
%a     Access rights in octal
%n     File name

Utilisation:

  • Avec des fichiers:

    $ stat -c "%a %n" ./Documents/Udev.html 
    664 ./Documents/Udev.html
    
  • Avec des dossiers:

    $ stat -c "%a %n" ./Documents/
    755 ./Documents/
    

(Référence)

512
jokerdino

Les autorisations de fichiers sous Linux peuvent être affichées au format octal à l’aide de la commande Linux stat.

Appuyez simplement sur Ctrl+Alt+T sur votre clavier pour ouvrir Terminal. Lorsqu'il s'ouvre, accédez au répertoire dans lequel vous souhaitez rechercher les autorisations de fichiers en mode octal.

stat -c '%A %a %n' *

% A Droits d'accès sous forme lisible par l'homme

% a Droits d'accès en octal

% n Nom du fichier

Nombres octaux et autorisations

Vous pouvez utiliser un nombre octal pour représenter le mode/permission:

r: 4
w: 2
x: 1

Par exemple, pour le propriétaire de fichier, vous pouvez utiliser le mode octal comme suit. L'autorisation de lecture, d'écriture et d'exécution (complète) sur un fichier en octal est 0 + r + w + x = 0 + 4 + 2 + 1 = 7

Seules les autorisations de lecture et d'écriture sur un fichier en octal sont 0 + r + w + x = 0 + 4 + 2 + 0 = 6

Seules les autorisations de lecture et d'exécution sur un fichier en octal sont 0 + r + w + x = 0 + 4 + 0 + 1 = 5

Utilisez la méthode ci-dessus pour calculer l'autorisation pour le groupe et les autres. Supposons que vous souhaitiez accorder une autorisation complète au propriétaire, une autorisation de lecture et d'exécution au groupe et une autorisation de lecture seule à d'autres utilisateurs. Vous devez ensuite calculer l'autorisation comme suit: Utilisateur = r + w + x = 0 + 4 + 2 + 1 = 7 Groupe = r + w + x = 0 + 4 + 2 + 0 = 6 Autres = r + w + x = 0 + 0 + 0 + 1 = 1

L'autorisation effective est 761.

Source: http://kmaiti.blogspot.com/2011/09/umask-concept.html

42
Mitch

Comme détaillé dans autorisations de style "755" avec 'ls' par Adam Courtemanche sur AgileAdam.com , vous pouvez créer n aliaslso qui agit comme ls -l mais traite légèrement la sortie 1  pour afficher les autorisations également en octal. Cela ajoute une colonne en tête montrant trois chiffres 2  autorisations octales. Comme cela a été écrit, cela fonctionne pour la plupart des fichiers et des répertoires, mais cela ne fonctionne pas correctement si les bits collant ou setuid/setgid sont définis. 3

alias lso="ls -alG | awk '{k=0;for(i=0;i<=8;i++)k+=((substr(\$1,i+2,1)~/[rwx]/)*2^(8-i));if(k)printf(\" %0o \",k);print}'"

Ceci a cependant un sérieux inconvénient, car techtonikindique . Vous ne pouvez pas passer d'arguments à cet alias lso comme vous le feriez pour la commande ls , car ils sont pris comme arguments supplémentaires pour awk . Ainsi, vous ne pouvez pas exécuter lso sur un fichier ou un répertoire spécifique, et vous ne pouvez pas non plus transmettre d’option (telle que -F ou --color) à lso.


Le correctif consiste à définir lsosous la forme d'une fonction plutôt que d'un alias.

lso() { ls -alG "$@" | awk '{k=0;for(i=0;i<=8;i++)k+=((substr($1,i+2,1)~/[rwx]/)*2^(8-i));if(k)printf(" %0o ",k);print}'; }

Si vous essayez cela interactivement dans votre shell, exécutez unalias lso pour supprimer l'alias. Vous pouvez le faire avant ou après la définition de la fonction. Si vous le placez dans un fichier source, tel que ~/.bashrc, supprimez simplement la ligne alias et ajoutez la définition de la fonction.

Pourquoi cela fonctionne-t-il? Contrairement aux alias, les fonctions de shell bash peuvent accepter des paramètres de position , c.-à-d., arguments de ligne de commande . "$@" s'étend à la liste complète des arguments , ce qui a pour effet que les arguments de la fonction lso sont transmis à ls. (Contrairement à la définition d'un alias, aucun corps de fonction n'est cité; il était donc nécessaire de supprimer les caractères \ avant les $ et ".)

Etant donné que vous pouvez transmettre des options à lso lorsqu’elle est définie comme une fonction, vous souhaiterez peut-être supprimer les options -a et -G de la définition. Vous pouvez les passer manuellement si vous le souhaitez. ( L'option -l est requise pour afficher des détails tels que les autorisations sur les fichiers , il n'y a donc aucun avantage à les supprimer.)

lso() { ls -l "$@" | awk '{k=0;for(i=0;i<=8;i++)k+=((substr($1,i+2,1)~/[rwx]/)*2^(8-i));if(k)printf(" %0o ",k);print}'; }

Merci à techtonik pour soulignant la limitation en définissant lso comme un alias, me motivant ainsi à développer cet article avec du matériel pour en faire une fonction à la place.


1 On peut noter que cela semble faire fi la règle générale de ne pas analyser la sortie de ls . ls produit une sortie très lisible par l'homme; Cela introduit des particularités et des limitations qui le rendent généralement inadéquat comme entrée pour d'autres commandes. Dans ce cas , nous analysons ls puisque nous souhaitons conserver le comportement exact de ls, sauf que notre changement ajouté.

2 Une limite de cet alias, qui s'applique également à la version de fonction indiquée ci-dessous, et qui peut être considérée comme un bogue, est qu'il n'affiche que trois chiffres octaux , même lorsque le quatrième chiffre octal est zéro ( Comme jfmercer a correctement souligné , les chiffres octaux affichés ici ne reflètent pas le bit collant s'il est présent, ni les bits setuid ou setgid.

3 Plus sérieusement que simplement ne pas afficher le quatrième chiffre octal, c’est que cette méthode suppose qu’ils ne sont pas définis et s’ils sont - si vous voyez t, s ou S dans la chaîne d'autorisation - vous devez alors ignorer les chiffres octaux . Ceci parce que les bits sont déduits de la chaîne d'autorisations d'une manière qui ne prend pas en compte les bits sticky setuid/setgid.

34
Eliah Kagan

En étendant simplement\simplifiant les réponses précédentes 'stat':

Vous pouvez simplement lancer:

stat <path_to_file>

La sortie contiendra une permission octale avec d'autres informations.



Détails (version et exemple de la statistique):

# stat --version
stat (GNU coreutils) 8.4


[user@localhost ~]# touch /tmp/TEST_PERMISSONS

[user@localhost ~]# chmod 644 /tmp/TEST_PERMISSONS

[user@localhost ~]# stat /tmp/TEST_PERMISSONS
  File: `/tmp/TEST_PERMISSONS'
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: fd00h/64768d    Inode: 1010058     Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2015-08-26 18:58:59.000000000 +0300
Modify: 2015-08-26 18:58:59.000000000 +0300
Change: 2015-08-26 18:59:16.000000000 +0300

Notez le: ( 0644 /- rw-r - r--)

20
Vano

Pour la portabilité, vous pouvez utiliser Perl:

$ Perl -e 'printf "%04o %s\n", (stat)[2] & 07777, $_ for @ARGV' *.txt
0644 1.txt
0644 2.txt
0644 3.txt
0644 4.txt
0600 PerlOneLiner.txt
0664 Perl.txt

Si vous voulez remarquer quand une erreur se produit, essayez:

Perl -e '
for (@ARGV) {
    print "$!: $_\n" and next unless -e;
    printf "%03o %s\n", (stat)[2] & 07777, $_;
}
' *.txt
6
cuonglm

Vous pouvez utiliser findavec l'action -printf.

lsn'affiche pas les autorisations octales, mais vous pouvez utiliser cette solution de contournement findname __-:

find path -printf "%m:%f\n"

Par exemple, pour vérifier mon répertoire de vidéos:

$ find Videos -printf "%m:%f\n"
755:Videos

Le spécificateur de format %m indique à l'action -printf d'imprimer des autorisations octales, tandis que le spécificateur de format %f entraîne l'impression du nom de fichier.

Vous pouvez transmettre plusieurs noms de fichier à findname__. Vous pouvez même utiliser des globs (par exemple, find * -printf "%m:%f\n").

Vous n'êtes pas obligé d'utiliser un test tel que -name ou -iname; il suffit de transmettre les noms des fichiers ou des répertoires qui vous intéressent comme points de départ à findname__. Autrement dit, fournissez leurs noms sous forme d'arguments immédiatement après Word findname__, comme indiqué ci-dessus.

findvous donne un excellent contrôle sur la façon dont il affiche la sortie. Il y a deux modifications en particulier qui pourraient vous être utiles:

  • Par défaut, findrécursive les sous-répertoires, de la même manière que ls -R. Si vous ne souhaitez pas que findaccède aux sous-répertoires des points de départ que vous lui transmettez, vous pouvez ajouter -maxdepth 0 (ou utiliser -maxdepth avec d'autres valeurs pour indiquer la profondeur à laquelle vous souhaitez aller).

    $ find Documents -maxdepth 0 -printf "%m:%f\n"
    755:Documents
    
  • %f n'affiche qu'un nom de fichier, donc si finddoit recurse pour accéder à un fichier, il est possible que vous ne sachiez pas où il se trouve. Pour afficher un chemin, en commençant par le point de départ du fichier, utilisez %p à la place.

    $ find /boot -printf "%m:%p\n"
    755:/boot
    644:/boot/initrd.img-4.4.0-92-generic
    600:/boot/System.map-4.4.0-93-generic
    600:/boot/vmlinuz-4.4.0-92-generic
    600:/boot/vmlinuz-4.4.0-93-generic
    ....

Voir man find pour plus d'informations sur l'utilisation de la commande findname__.

Une autre méthode (lset awkname__)

Ceci peut être utilisé pour lister tous les fichiers de répertoires avec leurs permissions:

ls -l | awk '{k=0;for(i=0;i<=8;i++)k+=((substr($1,i+2,1)~/[rwx]/) \
             *2^(8-i));if(k)printf("%0o ",k);print}'

Il s’agit essentiellement de la même commande que celle utilisée dans alias lsode Adam Courtemanche , qui cette réponse citée, s’exécute simplement en tant que commande unique. Si vous utilisez cette option une fois ou dans de rares cas, vous ne voudrez peut-être pas vous soucier de l'écrire sous forme d'alias ou de fonction Shell.

2
Maythux