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-- ?

cnd
la source
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: -
lik
la source
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).

Jan Marek
la source
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.

Jander
la source
10

Cela pourrait être simple

-bash-3.2$ stat --format=%a sample_file
755
Sridhar
la source
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))"
Flèche
la source
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
MacGyver
la source
-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 *
shekar
la source