Gostaria de inspecionar as permissões de grupo de um arquivo a partir de um script bash. Especificamente, preciso verificar se um arquivo tem o bit gravável do grupo.
É isso aí. Simples assim. Contudo:
- Eu também preciso que isso seja portátil.
test -w <file
não vai me dizer se é gravável em grupo.- A saída de
ls -ld
é boa para humanos, mas não tem tanta certeza sobre scripts. Tecnicamente, eu poderia analisar a saídadrwxrwxr-x
para extrair os bits do grupo, mas isso parece frágil. - A interface para
stat
é completamente incompatível entre o OS X e outros sistemas. find <file> -perm ...
não pode ser a resposta?
bash
permissions
ls
stat
mislav
fonte
fonte
Respostas:
Método # 1 - stat
Você pode usar o
stat
comando para obter os bits de permissão.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 e BSD, pelo que posso encontrar.Exemplo
Use este comando:
E use um simples
grep
para ver se o modo de permissões de grupos é 6 ou 7.Para OSX e BSD você precisa usar esta forma de
stat
,stat -f
(ou talvezstat -x
), e analisar em conformidade. Como as opçõesstat
são diferentes, você pode agrupar esse comando em umlsb_release -a
comando e chamar a versão apropriada com base no sistema operacional. Não é o ideal, mas viável. Perceba quelsb_release
está disponível apenas para distribuições Linux, portanto, outra alternativa precisaria ser criada para testar outros sistemas operacionais Unix.Método # 2 - encontrar
Acho que esse comando pode atendê-lo melhor. Eu uso
find
e oprintf
interruptor.Exemplo
Método # 3 - Perl
Perl pode ser uma maneira mais portátil de fazer isso, dependendo dos sistemas operacionais que você está tentando cobrir.
NOTA: O item acima utiliza a
stat()
função do Perl para consultar os bits do sistema de arquivos.Você pode tornar isso mais compacto renunciando ao uso de uma matriz
@pv
e lidando com a saídastat()
diretamente:fonte
stat
comando varia muito entre os diferentes sistemas e não é portátil.find . -printf
pode fazê-lo, mas não pode determinar se está disponível no achado do OSX.Uma opção é usar
perl
, que será portátil em qualquer lugarperl
disponível. É difícil encontrar um sistema unix sem ele. Aqui está um exemplo de como ele pode ser integrado a um script de shell:perl
Exemplos semelhantes podem ser encontrados no stat perldoc .fonte
Acabei
ls
analisando:Sou grato pela extensa resposta do @ slm, mas nenhum dos outros métodos é tão direto. O
stat
método exigiria que eu escrevesse pelo menos duas invocações diferentes para cobrir o OS X, e mesmo depois disso ele retorna a representação octal à qual ainda preciso aplicar aritmética. O método Perl está OK, mas exige que eu inicie um intérprete para uma tarefa tão simples, e gostaria de mantê-lo simples e usando apenas os utilitários posix.fonte
perms=$(ls -ld -- "$1"); perms=${perms%% *}; case $perms in ?????w????) …
Todas as ferramentas padrão Unix / Linux.
Suponho que seja possível ter gravação em grupo, mas não leitura em grupo. Nessa possibilidade, seria uma declaração de caso 2 | 3 | 6 | 7) ou um grep '[2 | 3 | 6 | 7]'
fonte