Como sugerido por @Gustave , o programa stat
(que faz parte de GNU coreutils e essencialmente um programa "Linux" por esse motivo, embora você possa ter uma porta ou pacote em sistemas BSD) pode fazer isso. O comando
stat -c "%a %n"
arquivo
produz uma listagem formatada apenas com o modo octal (incluindo o setuid, setgid e sticky bits codificados) e o nome do arquivo. Segundo a documentação
-
%a
é o "Direitos de acesso em octal" -
%n
é o "nome do arquivo"
Por exemplo, dado este script:
#!/bin/sh
for name in $*
do
ls -ld "$name"
stat -c '%a %n' "$name"
done
você pode ver a saída assim de myscript /usr/bin /usr/bin/X /usr/bin/bsd-write
:
drwxr-xr-x 5 root root 118784 Jul 11 19:55 /usr/bin
755 /usr/bin
-rwsr-sr-x 1 root root 9232 Dec 16 2011 /usr/bin/X
6755 /usr/bin/X
-rwxr-sr-x 1 root tty 11000 Jun 17 2010 /usr/bin/bsd-write
2755 /usr/bin/bsd-write
Você veria 3 ou 4 dígitos octal retornados para os direitos de acesso , dependendo de o setuid, etc., estar definido. O primeiro dígito (quarto) combina
- 4 (setuid)
- 2 (setgid)
- 1 (pegajoso)
Os direitos de acesso retornados excluem os bits extras retornados pela chamada do sistema stat
que informa se o nome é um diretório ( S_IFDIR
) ou arquivo ( S_IFREG
). Todos esses bits, a propósito, se encaixam em um valor de 16 bits por causa das implementações antigas do Unix nos anos 1970 e início dos anos 80 - e têm valores padrão . Como os direitos de acesso excluem o tipo de arquivo, você pode usar esse valor como está no comando chmod
(e também o chmod
function), porque é octal, e o chmod
espera isso. Mesmo o setuid, etc., trabalha com octal, embora coisas como
chmod u+s /usr/bin/whatever
são mais legíveis.
Para ler mais