Question Comment puis-je obtenir des autorisations de fichiers octaux à partir de la ligne de commande?


Il y a un chmod commande pour définir les autorisations de fichier, mais puis-je obtenir des autorisations de fichier en mode octal (tel que 755) à partir de la ligne de commande?


316
2018-06-17 08:04


origine




Réponses:


Tu peux essayer

stat -c "%a %n" *

Remplacer * avec le répertoire approprié ou le nom de fichier exact que vous souhaitez examiner.

Du 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

Usage:

  • 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)


450
2018-06-17 08:08



sur mac os, utilisez stat -f '%A %a %N' * (crédit: geeklog.adamwilson.info/article/58/…) - s2t2
Si vous êtes plus à l'aise avec ls: for f in $(ls -a); do stat -c "%a %n" $f; done; - usandfriends
@usandfriends en boucle sur la sortie de ls est une mauvaise idée. Si vous voulez vraiment utiliser une boucle, vous pouvez le faire for f in *; do stat "%a %n" "$f"; done - Tom Fenech
Pourquoi sur Mac OS, tout est légèrement modifié (même dans unix iso utils)? Y a-t-il une raison réelle de cela? - Vassilis
S'il vous plaît @hackel, dites-nous ce que vous ressentez vraiment. lol! - MikeSchinkel


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 le 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 une forme lisible par l'homme

% a Droits d'accès en octal

% n Nom du fichier

Numéros octaux et permissions

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

r: 4
w: 2
x: 1

Par exemple, pour le propriétaire du fichier, vous pouvez utiliser le mode octal comme suit. Lis,   écrire et exécuter la permission (complète) sur un fichier en octal est 0 + r + w + x =   0 + 4 + 2 + 1 = 7

Seules les autorisations en lecture et en é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. Laissez-nous   dites que vous souhaitez donner la permission complète au propriétaire, lisez et exécutez   la permission de grouper et de ne lire que la permission à d'autres, alors vous avez besoin   pour calculer la permission 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

La permission effective est 761.

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


37
2018-06-17 08:14



Les 0 initiaux représentent aussi un bit spécial: pastebin.com/6ymkFt71 - Braiam


Comme détaillé dans Autorisations de type "755" avec "ls" par Adam Courtemanche sur AgileAdam.com, vous pouvez créer un alias  lso qui agit comme ls -l mais traite légèrement la sortie1 pour afficher les autorisations également en octal. Cela ajoute une colonne en tête avec trois chiffres2 autorisations octales. Comme écrit, cela fonctionne pour la plupart des fichiers et répertoires, mais ne fonctionne pas correctement si le gluant ou setuid / setgid les bits 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}'"

Cela a une grave lacune, cependant, comme techtonik  fait remarquer. Toi ne peut pas passer d'arguments pour ça lso alias comme vous le feriez la ls commander, car ils sont pris comme arguments supplémentaires pour awk au lieu. Ainsi, vous ne pouvez pas courir lso sur un fichier ou un répertoire spécifique, et vous ne pouvez passer aucune option (comme -F, ou --color) à lso.


Le correctif est de définir lso  comme un fonction plutôt qu'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 ceci de manière interactive dans votre shell, exécutez unalias lso pour supprimer l'alias, vous pouvez le faire avant ou après avoir défini la fonction. Si vous le mettez dans un fichier source, tel que ~/.bashrc, sortez le alias ligne et ajouter la définition de la fonction.

Pourquoi ça marche? Contrairement aux alias, fonctions shell bash peuvent prendre des paramètres positionnels, c'est à dire., arguments de ligne de commande. "$@" se développe à la liste complète des arguments, provoquant des arguments à la lso fonction à passer à ls. (Contrairement à une définition d'alias, un corps de fonction n'est pas cité; il était donc nécessaire de supprimer le \personnages avant $ et ".)

Puisque vous pouvez passer des options à lso une fois définie de cette manière, vous souhaiterez peut-être supprimer le -a et -G options de la définition - vous pouvez les transmettre manuellement dans les cas où vous le souhaitez. (le -l L'option est requise pour afficher des détails tels que les autorisations de fichiers. du tout, il n'y a donc aucun avantage à le 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}'; }

Grâce à techtonik pour soulignant la limitation en définissant lso en tant qu’alias, ce qui me motive à étendre ce post avec du matériel pour en faire une fonction à la place.


1On peut noter que cela semble bafouer la règle générale de ne pas analyser les résultats de ls. ls produit une sortie très lisible par l'homme; Cela introduit des idiosyncrasies et des limitations le rendant généralement impropre à la saisie d'autres commandes. Dans ce cas nous analysons ls depuis nous souhaitons préserver le comportement exact de ls sauf notre un changement ajouté.

2Une limitation 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 à juste titre souligné, les chiffres octaux affichés ici ne reflètent pas le bit sticky si présent, ni les bits setuid ou setgid.

3Plus sérieusement que de ne pas simplement montrer le quatrième chiffre octal, c'est que cette méthode assume ils ne sont pas réglés, et si elles sont - si vous voyez t, s, ou S dans la chaîne d'autorisation - alors vous devriez ignorer les chiffres octaux. Ceci parce que les bits sont déduits de la chaîne d'autorisations d'une manière qui ne tient pas compte des bits de setuid / setgid.


33
2018-06-17 08:12



ne fonctionne pas avec les répertoires - awk: read error (Is a directory) - anatoly techtonik
@techtonik Merci de l'avoir signalé! J'ai (enfin) mis à jour cette réponse pour y inclure un correctif. - Eliah Kagan
Vous pouvez ajouter --color paramètre pour afficher les couleurs lso() { ls -alG "$@" --color | 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}'; } - tagplus5


Il suffit de prolonger \ simplifier les réponses précédentes relatives aux statistiques:

Vous pouvez simplement exécuter:

stat <path_to_file>

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



Détails (version stat et exemple):

# 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

Noter la: (0644/ -rw-r - r--)


17
2017-08-26 16:07





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 souhaitez noter une erreur, essayez:

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

6
2017-09-21 15:30



En plus d'être portable, la solution de @ cuonglm montre quatre caractères octaux plutôt que Trois, montrant ainsi l'état du "sticky bit" qui est souvent oublié. - jfmercer


Vous pouvez utiliser find avec le -printf action.

ls ne montre pas les autorisations octales, mais vous pouvez l'utiliser findsolution de rechange basée sur:

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

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

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

le %m spécificateur de format indique le -printf action pour imprimer des autorisations octales, tandis que le %f le spécificateur de format provoque l'impression du nom de fichier.

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

Vous n'avez pas à utiliser un test comme -name ou -iname; il suffit de transmettre les noms des fichiers ou répertoires qui vous intéressent comme points de départ pour find. Autrement dit, fournissez leurs noms comme arguments immédiatement après le mot find, Comme montré ci-dessus.

find vous donne un grand contrôle sur la façon dont il affiche la sortie. Il y a deux modifications en particulier que vous pourriez trouver utiles:

  • Par défaut, find sous-répertoires récursifs, similaires à ls -R. Si vous ne voulez pas find pour visiter les 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 souhaitée.

    $ find Documents -maxdepth 0 -printf "%m:%f\n"
    755:Documents
    
  • %f affiche uniquement un nom de fichier, donc si find doit se rappeler pour accéder à un fichier, vous ne savez peut-être pas où il se trouve. Pour afficher un chemin, en commençant par le point de départ du fichier, utilisez %p au lieu.

    $ 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 du find commander.

Une autre méthode (ls et awk)

Cela peut être utilisé pour répertorier tous les fichiers de répertoire avec leurs autorisations:

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}'

C'est essentiellement la même commande que dans Adam Courtemanche's lso alias, lequel cette réponse cité, il suffit de lancer en une seule commande. Si vous ne l'utilisez qu'une fois ou à de rares occasions, vous ne voudrez peut-être pas l'écrire en tant qu'alias ou fonction shell.


2
2018-03-07 07:16