Como inspecionar permissões de grupo de um arquivo

9

Eu gostaria de inspecionar as permissões de grupo de um arquivo de um script bash. Especificamente, preciso verificar se um arquivo tem o grupo gravável em bit.

É isso. Simples assim. No entanto:

  1. Eu também preciso que isso seja portátil.
  2. test -w <file não me diz se é grupo gravável.
  3. A saída de ls -ld é boa para os humanos, mas não tão segura quanto aos scripts. Tecnicamente eu poderia analisar a saída como drwxrwxr-x para extrair os bits do grupo, mas isso parece frágil.
  4. A interface para stat é completamente incompatível entre o OS X e outros sistemas.
  5. find <file> -perm ... não pode ser a resposta?
por mislav 26.10.2013 / 02:15

3 respostas

1

Acabei por ls -parsing:

is_group_writable() {
  local ls="$(ls -ld "$1")"
  [ "${ls:5:1}" = "w" ]
}

Sou grato pela extensa resposta do @slm, mas nenhum dos outros métodos é tão direto. O método stat exigiria que eu escrevesse pelo menos duas invocações diferentes para cobrir o OS X e, mesmo depois disso, ele retornaria a representação octal à qual ainda devo aplicar a aritmética. O método Perl é OK, mas requer que eu inicie um interpretador para uma tarefa tão simples, e eu gostaria de mantê-lo simples e usando apenas os utilitários do posix.

    
por 29.10.2013 / 03:23
8

Método 1 - stat

Você pode usar o comando stat para obter os bits das permissões. stat está disponível na maioria dos Unixes (OSX, BSD, não AIX pelo que posso encontrar). Isso deve funcionar na maioria dos Unixes, exceto OSX & BSD pelo que eu posso encontrar.

$ stat -c "%a" <file>

Exemplo

$ ls -l a
-rw-rw-r-- 1 saml saml 155 Oct  6 14:16 afile.txt

Use este comando:

$ stat -c "%a" afile.txt
664

E use um grep simples para ver se o modo de permissões de grupos é 6 ou 7.

$ stat -c "%a" afile.txt | grep ".[67]."

Para o OSX e o BSD, você precisaria usar essa forma de stat , stat -f (ou talvez stat -x ) e analisar de acordo. Como as opções para stat são diferentes, você poderia agrupar esse comando em um comando lsb_release -a e chamar a versão apropriada com base no sistema operacional. Não é ideal, mas viável. Perceba que lsb_release é disponível apenas para distros do Linux então outra alternativa precisaria ser desenvolvida para testar outros sistemas operacionais Unix .

Método 2 - encontrar

Acho que esse comando pode servir melhor para você. Eu faço uso de find e da opção printf .

Exemplo

$ find a -prune -printf '%m\n'
664

Método # 3 - Perl

O Perl pode ser uma maneira mais portátil de fazer isso, dependendo dos sistemas operacionais que você está tentando abordar.

$ perl -le '@pv=stat("afile.txt"); printf "%04o", $pv[2] & 07777;'
0664

NOTA: O texto acima faz uso da função stat() do Perl para consultar os bits do sistema de arquivos.

Você pode tornar isso mais compacto cancelando o uso de uma matriz, @pv e lidando diretamente com a saída de stat() :

$ perl -le 'printf "%04o", (stat("a"))[2] & 07777;'
0664
    
por 26.10.2013 / 02:32
1

Uma opção é usar perl , que será portátil em todos os lugares perl está disponível. É difícil encontrar um sistema unix sem ele. Aqui está um exemplo de como ele pode ser integrado em um script de shell:

if perl -e 'use Fcntl ":mode"; exit( ((stat("file.txt"))[2] & S_IWGRP) >> 3)'; then
    echo "file is group writable"
else
    echo "file is not group witeable"
fi

Exemplos semelhantes de perl podem ser encontrados na estatística perldoc .

    
por 26.10.2013 / 03:48