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

310

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

    
posée Anwar 17.06.2012 - 10:04
la source

6 réponses

446

Vous pouvez essayer

stat -c "%a %n" *

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

À partir de la 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)

    
réponse donnée jokerdino 17.06.2012 - 10:08
la source
37

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 de fichier

  

Nombre octal et permissions

     

Vous pouvez utiliser un nombre octal pour représenter le mode / 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

     

Seulement lire et exécuter l'autorisation sur un fichier en octal est 0 + r + w + x =   0 + 4 + 0 + 1 = 5

     

Utilisez la méthode ci-dessus pour calculer la permission du groupe et des autres. Laissez-nous   dites que vous souhaitez donner l’autorisation complète au propriétaire, lire et exécuter   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

     

L'autorisation effective est 761.

Source: lien

    
réponse donnée Mitch 17.06.2012 - 10:14
la source
32

Comme détaillé dans autorisations de style "755" avec "ls" par Adam Courtemanche sur AgileAdam.com , vous pouvez créer un alias lso agissant comme ls -l mais traite légèrement la sortie 1 pour afficher également les autorisations en octal. Cela ajoute une colonne principale indiquant les autorisations à trois chiffres 2 octales. Comme écrit, cela fonctionne pour la plupart des fichiers et répertoires, mais ne fonctionne pas correctement si sticky 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}'"

Cependant, techtonik fait remarquer . Vous ne pouvez pas transmettre d'arguments à cet alias lso comme vous le feriez pour la commande ls , car elles sont utilisées comme arguments supplémentaires pour awk à la place. Ainsi, vous ne pouvez pas exécuter lso sur un fichier ou un répertoire spécifique, ni transmettre des options (telles que -F ou --color ) à lso .

Le correctif consiste à définir lso en tant que fonction plutôt qu'un alias.

lso() { ls -alG "[email protected]" | awk '{k=0;for(i=0;i<=8;i++)k+=((substr(,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 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 du shell bash peuvent prendre des paramètres de position , c.-à-d., arguments de ligne de commande . "[email protected]" se développe en une liste complète d'arguments , provoquant des arguments sur le% co_de Fonction% à transmettre à lso . (Contrairement à une définition d'alias, un corps de fonction n'est pas cité; il était donc nécessaire de supprimer les caractères ls avant \ et $ .)

Comme vous pouvez transmettre des options à " lorsqu'elles sont définies comme une fonction, vous pouvez supprimer les options lso et -a de la définition - vous pouvez les transmettre manuellement si vous le souhaitez . ( L'option -G est requise pour plus de détails.) Comme les autorisations de fichiers à afficher du tout , il n’ya aucun avantage à le supprimer.)

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

Merci à techtonik pour signaler la limitation pour définir -l comme un alias, ce qui me motive à Élargissez ce post avec des informations sur son utilisation à la place.

1 On peut noter que cela semble faire fi des règles générales concernant ne pas analyser la sortie de lso . 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 que nous souhaitons conserver le comportement exact de ls , à l'exception de notre modification un .

2 Une limitation de cet alias, qui s’applique également à la version de la fonction indiquée ci-dessous, et qui peut être considérée comme un bogue, est que affiche trois chiffres octaux même lorsque le quatrième chiffre octal est zéro. Comme jfmercer a à juste titre souligné , les chiffres octaux affichées ici ne reflètent pas le bit sticky, le cas échéant, ni les bits setuid ou setgid.

3 Plus grave que de ne pas simplement afficher le quatrième chiffre octal, cette méthode suppose que elles ne sont pas définies, et < Si elles sont - si vous voyez ls , t ou s dans la chaîne d'autorisation - alors vous devez 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 setuid / setgid collants.

    
réponse donnée Eliah Kagan 17.06.2012 - 10:12
la source
17

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

Vous pouvez simplement lancer:

stat <path_to_file>

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



Détails (version stat et exemple):

# stat --version
stat (GNU coreutils) 8.4


[[email protected] ~]# touch /tmp/TEST_PERMISSONS

[[email protected] ~]# chmod 644 /tmp/TEST_PERMISSONS

[[email protected] ~]# 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 -)

    
réponse donnée Vano 26.08.2015 - 18:07
la source
6

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
    
réponse donnée cuonglm 21.09.2014 - 17:30
la source
2

Vous pouvez utiliser find avec l'action -printf .

ls ne montre pas les autorisations octales, mais vous pouvez utiliser cette solution de contournement find :

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 %m format indique à l'action -printf d'imprimer des autorisations octales, tandis que le spécificateur %f 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 besoin d'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 à find . Autrement dit, fournissez leurs noms comme arguments immédiatement après le mot find , comme indiqué ci-dessus.

find vous donne un très bon contrôle sur la manière dont la sortie est affichée. Deux modifications en particulier pourraient vous être utiles:

  • Par défaut, find recurses sous-répertoires, similaire à ls -R . Si vous ne souhaitez pas que find visite 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 ne montre qu'un nom de fichier, donc si find doit se déclencher pour accéder à un fichier, vous ne saurez peut-être pas où il se trouve. Pour afficher un chemin, en commençant par le point de départ du fichier, utilisez plutôt %p .

    $ 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
    ....

Consultez man find pour plus d'informations sur l'utilisation de find . commande.

Une autre méthode ( ls et awk )

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

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

Il s’agit essentiellement de la même commande que dans l’alias lso d’Adam Courtemanche , qui cette réponse citée, exécutez-la simplement en une seule commande. Si vous ne l'utilisez qu'une fois, ou rarement, vous ne voudrez peut-être pas l'écrire en tant qu'alias ou fonction shell.

    
réponse donnée Maythux 07.03.2014 - 08:16
la source

Lire d'autres questions sur les étiquettes