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?
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/
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
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.
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 -)
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
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.
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.
Lire d'autres questions sur les étiquettes command-line permissions