web-dev-qa-db-fra.com

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

J'ai besoin de définir le même chmod, comment obtenir le numéro pour - rw-r - r -?

56
cnd

Veuillez vérifier la sortie stat:

# 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: -
54
lik
r=4
w=2
x=1

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

69
Jan Marek

Le numéro du mode d'autorisations complet est un nombre octal à 4 chiffres, bien que la plupart du temps, vous n'utilisez que les 3 chiffres les moins significatifs. Additionnez chaque groupe dans la chaîne d'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 modeste comme celui-ci:

-rwsr-xr-T

Le quatrième chiffre est surchargé sur les bits x dans le modestring. Si vous y voyez une lettre autre que x, cela signifie que l'un de ces bits de quatrième chiffre "spéciaux" est défini, et si la lettre est en minuscule, alors x pour cette position est également défini. La traduction de celui-ci est donc:

   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 manière UNIX standard de montrer qu'un nombre est octal est de le démarrer avec un zéro. GNU chmod supposera que le mode que vous lui donnez est octal de toute façon, mais il est plus sûr d'ajouter le zéro.

Enfin, si vous voyez un + à la fin de la modeste:

-rwxr-xr-x+

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

27
Jander

Cela pourrait être simple

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

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

de base

Pour les autorisations de base:

Convertir tout - et majuscules S ou T à 0, le reste devrait représenter 1.
Le nombre binaire résultant ainsi construit doit être imprimé en octal:

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

En une seule ligne:

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

Correction d'erreurs et détection des 3 autres bits 1000, 2000 ou 4000 nécessite un peu plus de code:

#!/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))"
3
Isaac

Obtenez la liste des fichiers avec leurs valeurs d'autorisation de chaîne et hex. Mettre% N à la fin pour que la sortie puisse être mise 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'

Cela trouvera tous les fichiers avec une autorisation hexadécimale spécifique.

find /tmp1 -user root -perm 644
0
MacGyver