Como posso obter permissões de arquivo octal a partir da linha de comando?

301

Existe um comando chmod para definir permissões de arquivo, mas posso obter permissões de arquivo no modo octal (como 755) na linha de comando?

    
por Anwar 17.06.2012 / 10:04

6 respostas

432

Você pode tentar

stat -c "%a %n" *

Substitua * pelo diretório relevante ou o nome exato do arquivo que você deseja examinar.

Na página de manual do 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

Uso:

  • Com arquivos:

    $ stat -c "%a %n" ./Documents/Udev.html 
    664 ./Documents/Udev.html
    
  • Com pastas:

    $ stat -c "%a %n" ./Documents/
    755 ./Documents/
    

(referência)

    
por jokerdino 17.06.2012 / 10:08
36

As permissões de arquivo no Linux podem ser exibidas em formato octal usando o comando stat do Linux.

Basta pressionar Ctrl + Alt + T no seu teclado para abrir o Terminal. Quando se abre, navegue até o diretório em que você deseja encontrar as permissões de arquivo no modo octal.

stat -c '%A %a %n' *

% A Direitos de acesso em formato legível

% a Direitos de acesso em octal

% n Nome do arquivo

  

Números octais e permissões

     

Você pode usar o número octal para representar o modo / permissão:

r: 4
w: 2
x: 1
     

Por exemplo, para o proprietário do arquivo, você pode usar o modo octal da seguinte maneira. Ler,   escrever e executar permissão (completa) em um arquivo em octal é 0 + r + w + x =   0 + 4 + 2 + 1 = 7

     

Somente a permissão Ler e gravar em um arquivo em octal é 0 + r + w + x = 0 + 4 + 2 + 0   = 6

     

Somente a permissão de leitura e execução em um arquivo em octal é 0 + r + w + x =   0 + 4 + 0 + 1 = 5

     

Use o método acima para calcular a permissão para o grupo e outros. Deixe-nos   digamos que você queira dar permissão total ao proprietário, leia & amp; executar   permissão para agrupar e ler apenas a permissão para os outros, então você precisa   para calcular permissão da seguinte maneira: Usuário = r + w + x = 0 + 4 + 2 + 1 = 7 Grupo =   r + w + x = 0 + 4 + 2 + 0 = 6 Outros = r + w + x = 0 + 0 + 0 + 1 = 1

     

A permissão efetiva é de 761.

Fonte: link

    
por Mitch 17.06.2012 / 10:14
32

Conforme detalhado em permissões de estilo "755" com "ls" por Adam Courtemanche em AgileAdam.com , você pode criar um um alias lso que atua como ls -l mas processa ligeiramente a saída 1 para exibir permissões também em octal. Isso adiciona uma coluna à esquerda mostrando permissões octal de três dígitos 2 . Conforme escrito, isso funciona para a maioria dos arquivos e diretórios, mas não funciona corretamente se o adesivo ou setuid/setgid estão definidos. 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}'"

Isso tem uma lacuna séria, no entanto, como techtonik pontos . Você não pode passar argumentos para este lso alias como você faria para o comando ls , porque são considerados como argumentos adicionais para awk em vez disso. Portanto, você não pode executar lso em um arquivo ou diretório específico, nem pode passar nenhuma opção (como -F ou --color ) para lso .

A correção é definir lso como uma função em vez de um alias.

lso() { ls -alG "$@" | awk '{k=0;for(i=0;i<=8;i++)k+=((substr(,i+2,1)~/[rwx]/)*2^(8-i));if(k)printf(" %0o ",k);print}'; }

Se você estiver tentando isso interativamente em seu shell, execute unalias lso para remover o alias - você pode fazer isso antes ou depois de definir a função. Se você for colocá-lo em um arquivo originado, como ~/.bashrc , apenas retire a linha alias e adicione a definição da função.

Por que isso funciona? Ao contrário dos aliases, funções do shell bash podem receber parâmetros posicionais , ou seja, argumentos da linha de comando . "$@" expande para a lista completa de argumentos , causando argumentos para o lso função a ser passada para ls . (Diferentemente de uma definição de alias, um corpo de função não é citado; portanto, era necessário remover os caracteres \ antes de $ e " .)

Como você pode passar opções para lso quando definido dessa forma como uma função, você pode querer remover as opções -a e -G da definição - você pode passá-las manualmente nos casos em que você as deseja . ( A opção -l é necessária para detalhes como permissões de arquivo a serem mostradas , então não há nenhum benefício em removê-lo.

lso() { 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}'; }

Obrigado ao techtonik por apontando a limitação na definição de lso como um alias, motivando-me assim a expanda este post com material sobre como torná-lo uma função.

1 Pode-se notar que isso parece desrespeitar a regra geral sobre não analisar a saída de ls . ls produz uma saída legível para humanos; isso introduz idiossincrasias e limitações, tornando-a geralmente inadequada como entrada para outros comandos. Nesse caso, analisamos ls , já que desejamos preservar o comportamento exato de ls , exceto nossa uma alteração adicionada.

2 Uma limitação deste alias, que também se aplica à versão da função mostrada abaixo, e que pode ser considerado um bug, é que apenas exibe três dígitos octal mesmo quando o quarto dígito octal é zero. Como jfmercer tem corretamente apontado , os dígitos octal exibido aqui não reflete o bit pegajoso se presente, nem setuid ou setgid bits.

3 Mais seriamente do que simplesmente não mostrar o quarto dígito octal é que este método assume que eles não estão definidos, e < strong> se eles forem - se você vir t , s ou S na cadeia de permissão - então você deve desconsiderar os dígitos octal . Isso porque os bits são inferidos da string de permissões de uma maneira que não considera bits setuid / setgid fixos.

    
por Eliah Kagan 17.06.2012 / 10:12
16

Apenas estendendo \ simplificando as respostas anteriores relacionadas a 'stat':

Você pode simplesmente executar:

stat <path_to_file>

A saída conterá a permissão octal junto com outras informações.



Detalhes (versão de estatística e exemplo):

# stat --version
stat (GNU coreutils) 8.4


[user@localhost ~]# touch /tmp/TEST_PERMISSONS

[user@localhost ~]# chmod 644 /tmp/TEST_PERMISSONS

[user@localhost ~]# 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

Observe: ( 0644 / - rw-r - r -)

    
por Vano 26.08.2015 / 18:07
6

Para portabilidade, você pode usar 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

Se você quiser perceber quando ocorre um erro, tente:

perl -e '
for (@ARGV) {
    print "$!: $_\n" and next unless -e;
    printf "%03o %s\n", (stat)[2] & 07777, $_;
}
' *.txt
    
por cuonglm 21.09.2014 / 17:30
2

Você pode usar find com a ação -printf .

ls não mostra permissões octal, mas você pode usar essa solução alternativa find :

find path -printf "%m:%f\n"

Por exemplo, para verificar meu diretório de vídeos:

$ find Videos -printf "%m:%f\n"
755:Videos

O especificador de formato %m informa a ação -printf para imprimir permissões octal, enquanto o especificador de formato %f faz com que ele imprima o nome do arquivo.

Você pode passar vários nomes de arquivos para find . Você pode até usar globs (por exemplo, find * -printf "%m:%f\n" ).

Você não precisa usar um teste como -name ou -iname ; basta passar os nomes dos arquivos ou diretórios nos quais você está interessado como ponto de partida para find . Ou seja, forneça seus nomes como argumentos imediatamente após a palavra find , como mostrado acima.

find oferece um excelente controle sobre como mostra a saída. Existem duas modificações em particular que você pode achar úteis:

  • Por padrão, find recursa subdiretórios, semelhante a ls -R . Se você não quiser que find visite os subdiretórios dos pontos iniciais que você passa para ele, você pode adicionar -maxdepth 0 (ou usar -maxdepth com outros valores para indicar o quão profundo você deseja ir).

    $ find Documents -maxdepth 0 -printf "%m:%f\n"
    755:Documents
    
  • %f mostra apenas um nome de arquivo, portanto, se find tiver que recursar para obter um arquivo, talvez você não saiba onde ele está localizado. Para mostrar um caminho, começando com o ponto de partida em que o arquivo foi encontrado, use %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
    ....

Veja man find para mais informações sobre como usar o find comando.

Outro método ( ls e awk )

Isso pode ser usado para listar todos os arquivos de diretório com suas permissões:

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}'

Este é essencialmente o mesmo comando de lso alias de Adam Courtemanche , que que resposta citada, basta executar como um único comando. Se você estiver usando apenas uma vez, ou em raras ocasiões, talvez não queira se incomodar em escrevê-lo como um alias ou uma função de shell.

    
por Maythux 07.03.2014 / 08:16