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


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


316
2018-06-17 08:04


origem




Respostas:


Podes tentar

stat -c "%a %n" *

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

De man page de 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)


450
2018-06-17 08:08



no mac os, use stat -f '%A %a %N' * (crédito: geeklog.adamwilson.info/article/58/…) - s2t2
Se você está mais confortável com ls: for f in $(ls -a); do stat -c "%a %n" $f; done; - usandfriends
@usandfriends looping na saída de ls é uma má ideia. Se você realmente quiser usar um loop, você pode fazer for f in *; do stat "%a %n" "$f"; done - Tom Fenech
Por que no Mac OS tudo é um pouco alterado (mesmo em unix iso utils)? Existe uma razão real disso? - Vassilis
Por favor, @hackel, conte-nos como você realmente se sente. ri muito! - MikeSchinkel


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

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

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

% A direitos de acesso em forma 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, ler e 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 é 761.

Fonte: http://kmaiti.blogspot.com/2011/09/umask-concept.html


37
2018-06-17 08:14



O 0 inicial também representa um bit especial: pastebin.com/6ymkFt71 - Braiam


Conforme detalhado em Permissões no estilo "755" com "ls" de Adam Courtemanche em AgileAdam.comvocê pode criar um alias  lso que age como ls -l mas processa ligeiramente a saída1 para exibir permissões também em octal. Isso adiciona uma coluna principal mostrando três dígitos2 permissões octal. Conforme escrito, isso funciona para a maioria dos arquivos e diretórios, mas não funciona corretamente se pegajoso ou setuid / setgid bits 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 grave, no entanto, como techtonik  aponta. Você não pode passar argumentos para isso lso alias como você faria para a ls comando, porque eles são considerados argumentos adicionais para awk em vez de. Assim você não pode correr lso em um arquivo ou diretório específico, nem você pode passar opções (como -Fou --color) para lso.


A correção é definir lso  como um função em vez de um 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}'; }

Se você está 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ê está colocando em um arquivo que é originado, como ~/.bashrc, apenas tire o alias linha e adicione a definição da função.

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

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

lso() { ls -l "$@" | 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}'; }

Graças a techtonik para apontando a limitação na definição lso como um pseudônimo, motivando-me a expandir este post com material sobre como torná-lo uma função.


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

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

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


33
2018-06-17 08:12



não funciona com diretórios - awk: read error (Is a directory) - anatoly techtonik
@techtonik Obrigado por apontar isto! Eu (finalmente) atualizei esta resposta para incluir uma correção para isso. - Eliah Kagan
Você pode adicionar --color parâmetro para cores do show lso() { ls -alG "$@" --color | 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}'; } - tagplus5


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 juntamente com outras informações.



Detalhes (versão stat 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

Note o: (0644/ -rw-r - r--)


17
2017-08-26 16:07





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

6
2017-09-21 15:30



Além de ser portátil, a solução da @ cuonglm mostra quatro caracteres octais em vez de três, mostrando assim o estado do "pedaço pegajoso" que muitas vezes é esquecido. - jfmercer


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

ls não mostra permissões octal, mas você pode usar isso findsolução baseada em

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

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

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

o %m especificador de formato informa o -printf ação para imprimir permissões octal, enquanto o %f O especificador de formato 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; é suficiente passar os nomes dos arquivos ou diretórios nos quais você está interessado como ponto de partida find. Ou seja, forneça seus nomes como argumentos imediatamente após a palavra find, como mostrado acima.

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

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

    $ find Documents -maxdepth 0 -printf "%m:%f\n"
    755:Documents
    
  • %f mostra apenas um nome de arquivo, por isso, se find tem que recursar para chegar a um arquivo, você pode não saber onde ele está localizado. Para mostrar um caminho, começando com o ponto de partida em que o arquivo foi encontrado, use %p em vez de.

    $ 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
    ....

Vejo 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($1,i+2,1)~/[rwx]/) \
             *2^(8-i));if(k)printf("%0o ",k);print}'

Este é essencialmente o mesmo comando que em Adam Courtemanche's lso alias, qual essa resposta citado, 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 uma função de alias ou shell.


2
2018-03-07 07:16