Comment obtenir le numéro d'autorisation par chaîne: -rw-r - r--


53

Je dois définir le même chmod, comment obtenir le numéro pour -rw-r - r-- ?


2
Par programme ou avez-vous simplement besoin de savoir traduire?
mattdm

Je suis paresseux pour traduire :) stat convient pour un moment.
Cnd

9
Qu'entendez-vous par «définir le même»? Avez-vous déjà un fichier avec l'autorisation -rw-r -r-- et souhaitez-vous définir un autre fichier avec les mêmes autorisations? Puis voyez si vos chmodsupports --reference: “--reference = RFILE utilisez le mode RFILE au lieu des valeurs MODE” - man chmod.
manatwork


Quel Unix utilisez-vous?
Kusalananda

Réponses:


53

S'il vous plaît vérifier la statsortie:

# stat .xsession-errors 
  File: ‘.xsession-errors’
  Size: 839123          Blocks: 1648       IO Block: 4096   regular file
Device: 816h/2070d      Inode: 3539028     Links: 1
Access: (0600/-rw-------)  Uid: ( 1000/     lik)   Gid: ( 1000/     lik)
Access: 2012-05-30 23:11:48.053999289 +0300
Modify: 2012-05-31 07:53:26.912690288 +0300
Change: 2012-05-31 07:53:26.912690288 +0300
 Birth: -

11
stat -c %a /path/to/fileest le tour de magie dont vous avez besoin.
fromnaboo

et la réponse se trouve dans le bloc Accès ci-dessus. Le fichier qu'il a utilisé dans l'exemple a un ensemble d'accès différent de celui de la question. celui dans la question aurait montré Accès: (0644 / -rw-r - r--)
nycynik

65
r=4
w=2
x=1

dans chaque groupe. Votre exemple est 6 (r + w = ​​4 + 2) 4 (r = 4) 4 (r = 4).


26

Le numéro du mode de permission complet est un nombre octal à 4 chiffres, bien que la plupart du temps, vous n'utilisiez que les 3 chiffres les moins significatifs. Ajoutez chaque groupe dans la chaîne des autorisations, en prenant r = 4, w = 2, x = 1. Par exemple:

 421421421
-rwxr-xr--
 \_/        -- r+w+x = 4+2+1 = 7
    \_/     -- r+_+x = 4+0+1 = 5
       \_/  -- r+_+_ = 4+0+0 = 4     => 0754

Maintenant, parfois, vous verrez un étrange modestring comme ceci:

-rwsr-xr-T

Le quatrième chiffre est surchargé sur les xbits du modestring. Si vous voyez une lettre autre que celle- xci, cela signifie qu'un de ces bits "spéciaux" à quatrième chiffre est défini, et si la lettre est en minuscule, xcette position est également définie. Donc la traduction pour celui-ci est:

   4  2  1
 421421421
-rwsr-xr-T
   +  +  +  -- s+_+T = 4+0+1 = 5  
 \_/        -- r+w+s = 4+2+1 = 7  (s is lowercase, so 1)
    \_/     -- r+_+x = 4+0+1 = 5
       \_/  -- r+_+T = 4+0+0 = 4  (T is uppercase, so 0)   => 05754

La méthode UNIX standard pour montrer qu'un nombre est octal est de le démarrer avec un zéro. De toute façon, GNU chmodsupposera que le mode que vous donnez est octal, mais il est plus sûr d’ajouter le zéro.

Enfin, si vous voyez un +à la fin du modestring:

-rwxr-xr-x+

cela signifie alors que le fichier a des autorisations étendues et que vous aurez besoin de plus que chmod. Regardez dans les commandes setfaclet getfacl, pour commencer.


10

Cela pourrait être simple

-bash-3.2$ stat --format=%a sample_file
755

3

Les autorisations ne sont que la représentation sous forme de chaîne d'un nombre binaire.
Le 0est principalement représenté par -, le reste sont des lettres.

de base

Pour les autorisations de base:

Convertissez tous -et caps Sou Tto 0, le reste devrait représenter 1.
Le nombre binaire résultant ainsi construit doit être imprimé sous forme octale:

$ a=-rw-r--r--
$ b=${a//[ST-]/0}
$ b=${b//[!0]/1}
$ printf '%04o\n' $((2#$b))
0644

En une ligne:

$ b=${a//[ST-]/0}; b=${b//[!0]/1}; printf '%04o\n' $((2#$b))
0644

Correction d'erreur et détection des 3 autres bits 1000, 2000ou 4000nécessite un code supplémentaire:

#!/bin/bash

Say     (){ printf '%s\n' "$@"; }
SayError(){ a=$1; shift; printf '%s\n' "$@" >&2; exit "$a"; }

e1="Permission strings should have 10 characters or less"
e2="Assuming first character is the file type"
e3="Permission strings must have at least 9 characters"
e4="Permission strings could only contain 'rwxsStT-'"

a=$1

((${#a}>10))  &&   SayError 1 "$e1"
((${#a}==10)) && { Say        "$e2"; a=${a#?}; }
((${#a}<9))   &&   SayError 2 "$e3"
a=${a//[^rwxsStT-]}
((${#a}<9))   &&   SayError 3 "e4"
b=${a//[ST-]/0}; b=${b//[!0]/1}; c=0
[[ $a =~ [sS]......$ ]] && c=$((c|4)) 
[[ $a =~    [sS]...$ ]] && c=$((c|2)) 
[[ $a =~       [tT]$ ]] && c=$((c|1))

printf '%04o\n' "$((2#$b|c<<9))"

0

Obtenez la liste des fichiers avec leurs valeurs de chaîne et leurs autorisations hexadécimales. Mettez% N à la fin pour que la sortie puisse être placée dans Excel plus facilement.

stat -c "%A %a %N" *

-rw-r--r-- 644 `file2.txt'
-rw-r--r-- 644 `file3.txt'
-rw-r--r-- 644 `file4.txt'
-rw-r--r-- 644 `file.txt'
drwxr-xr-x 755 `hsperfdata_root'
-rw-r--r-- 644 `junk.txt'
drwx------ 700 `vmware-root'

Ceci trouvera tous les fichiers avec une permission hex spécifique.

find /tmp1 -user root -perm 644

-2

Pour tous les fichiers simultanés dans un répertoire

-bash-4.1$ chmod -R 640 *

Pour tous les fichiers

-bash-4.1$ chmod 640 *
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.