Como obter o número de permissão por string: -rw-r - r--

44

Eu preciso definir o mesmo chmod, como obter o número para -rw-r - r - ?

    
por Ashera 31.05.2012 / 06:31

7 respostas

47

Por favor, verifique stat output:

# 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: -
    
por 31.05.2012 / 06:56
56
r=4
w=2
x=1

em todos os grupos. Seu exemplo é 6 (r + w = 4 + 2) 4 (r = 4) 4 (r = 4).

    
por 31.05.2012 / 07:13
24

O número do modo de permissões completo é um número octal de 4 dígitos, embora na maioria das vezes você use apenas os 3 dígitos menos significativos. Adicione cada grupo na sequência de permissões, tendo r = 4, w = 2, x = 1. Por exemplo:

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

Agora, às vezes você verá uma modéstia estranha assim:

-rwsr-xr-T

O quarto dígito está sobrecarregado nos x bits no modestringring. Se você vir uma letra diferente de x , significa que um desses bits "especiais" de quatro dígitos está definido e, se a letra estiver em minúsculas, então x para essa posição também será definido. Então a tradução para este é:

   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

A maneira padrão do UNIX de mostrar que um número é octal é iniciá-lo com um zero. O GNU chmod irá assumir que o modo que você está dando é octal, mas é mais seguro para preceder o zero.

Finalmente, se você vir um + no final da modestring:

-rwxr-xr-x+

significa que o arquivo estendeu as permissões e você precisará de mais de chmod . Veja os comandos setfacl e getfacl , para começar.

    
por 31.05.2012 / 17:00
8

Isso pode ser simples

-bash-3.2$ stat --format=%a sample_file
755
    
por 01.08.2014 / 02:11
1

Permissões são apenas a representação de string de um número binário.
O 0 é representado principalmente por - , o resto são letras.

básico

Para permissões básicas:

Converta todos os - e os limites de S ou T para 0 , o restante deve representar 1 .
O número binário resultante assim construído deve ser impresso como octal:

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

Em uma linha:

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

Correção de erros e detecção dos outros 3 bits 1000 , 2000 ou 4000 exigem mais algum código:

#!/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))"
    
por 13.08.2017 / 21:54
0

Obtenha a lista de arquivos com seus valores de permissão de string e hexadecimal. Colocar% N no final para que a saída possa ser colocada no Excel mais facilmente.

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'

Isso localizará todos os arquivos com uma permissão hexadecimal específica.

find /tmp1 -user root -perm 644
    
por 23.11.2016 / 07:43
-2

Para todos os arquivos simultâneos em um Dir

-bash-4.1$ chmod -R 640 *

Para todos os arquivos

-bash-4.1$ chmod 640 *
    
por 17.11.2016 / 10:53

Tags