Representação octal de permissões de arquivo / pasta usando o awk?

3

Temos várias máquinas aqui com todos os tipos de hardware e sistemas operacionais, a maioria delas faz tarefas regulares com o bash que um agente executa. No entanto, chegou ao meu conhecimento que algumas máquinas Solaris que possuímos não possuem stat util, e adicioná-lo seria um problema que pode levar tempo (irônico)

Enquanto isso, eu estava tentando imitar uma tarefa sísifa que o stat fez de uma maneira magnífica: retornar as permissões de arquivo no Octal

Eu encontrei um exemplo antigo que imprime as permissões regulares no Octal - rwx, mas não para as permissões "especiais" - grupo grudento, usuário grudento, etc

O meu método básico foi este: primeiro calcular o valor Octal dos bits especiais e depois adicionar o 'rwx' regular, mas não parece funcionar bem

ls -lah $file  | awk '{k=0;for(i=0;i<=8;i++) {if (substr($1,i+2,1)~/[s]/) k += ((substr($1,i+2,1)~/[s]/)*2^9);else k+=((substr($1,i+2,1)~/[rwx]/)*2^(8-i));}if (k)printf("%0o ",k);}'


ls -lah $file  | awk '{k=0;for(i=0;i<=8;i++){k+=((substr($1,i+2,1)~/[rwxs]/)*2^(8-i));printf("%0o\n",k)}if(k)printf("%0o ",k);}'

alguém pode me sugerir o que seria uma boa solução?

    
por dotdot 29.01.2012 / 16:34

2 respostas

1

Isto deve lidar com qualquer conjunto de permissões, incluindo sticky, setuid e setgid ("s" significa "set" em vez de "sticky", que é "t"). Zeros à esquerda são impressos.

ls -lahd "$file" | awk '{k = 0; for (g=2; g>=0; g--) for (p=2; p>=0; p--) {c = substr($1, 10 - (g * 3 + p), 1); if (c ~ /[sS]/) k += g * 02000; else if (c ~ /[tT]/) k += 01000; if (c ~ /[rwxts]/) k += 8^g * 2^p} if (k) printf("%05o ", k)}'

Aqui está em várias linhas para facilitar a leitura:

awk '{k = 0; 
      for (g=2; g>=0; g--) 
          for (p=2; p>=0; p--) {
              c = substr($1, 10 - (g * 3 + p), 1); 
              if (c ~ /[sS]/) 
                  k += g * 02000; 
              else 
                  if (c ~ /[tT]/) 
                      k += 01000; 
              if (c ~ /[rwxts]/) 
                  k += 8^g * 2^p
      } 
      if (k) {
          printf("%05o ", k); 
     }'

Demo:

$ touch foo
$ chmod 7654 foo
$ ls -l foo
-rwSr-sr-T 1 user user 0 2012-01-29 13:21 foo
$ ls -l foo | awk '...'
07654
    
por 29.01.2012 / 20:51
0

Você pode usar o seguinte comando para obter as permissões octal de um arquivo / pasta:

$ find /tmp/ -printf "%m,%p\n"

Isto irá imprimir a lista de arquivos / pastas sob /tmp precedido com as permissões em octal. Isso também imprime as permissões especiais como s . Este é apenas um exemplo. Você pode personalizá-lo de acordo com suas necessidades.

    
por 29.01.2012 / 16:47