Maneira integrada de listar permissões de arquivo no Linux?

Maneira integrada de listar permissões de arquivo no Linux?

Quais são as opções, sem usar comandos externos, para listar as permissões de um arquivo?

testé um builtin, mas só funcionaria para o dono do arquivo AFAIK, estou atrás de tudo. Pensei que estava no caminho certo com inodes, mas também não consigo encontrar uma maneira de lê-los (com recursos integrados!).

bashsó, por favor. Qualquer versão e/ou formato é aceitável.

editar:

Estou ciente de que existem inúmeras maneiras de fazer isso usando comandos externos ( stat, ls, etc.), este é apenas um exercício de reflexão - nada do que estou fazendo "requer" uma builtinúnica solução

editar2:

A resposta dos comandos carregáveis ​​de Glenn Jackman é tecnicamente correta, pois ESTÁ usando um arquivo embutido. No entanto, acho que isso apenas mostra que minha pergunta foi mal definida.

Usando comandos puros bash(qualquer versão) builtin, conforme listadoaquino manual e outras funcionalidades integradas bash(redirecionamento, substituição, palavras-chave, outras coisas que nem conheço...), em um linuxsistema, como posso listar todas as permissões que um arquivo possui? A saída seria semelhante a qualquer uma das abaixo, embora um valor umask também funcionasse.

user@hostname$ stat test -c %A
-rw-rw-r--

user@hostname$ stat test -c %a
664

Responder1

Com o bash simples, acho que o melhor que você pode conseguir é algo assim: você consegueseupermissões, não de grupo ou outro.

myperms() {
  local file=$1
  local perms=""
  if [[ -d $file ]]; then
    perms+='d'
  elif [[ -L $file ]]; then
    perms+='l'
  else
    perms+='-'
  fi
  [[ -r $file ]] && perms+='r' || perms+='-'
  [[ -w $file ]] && perms+='w' || perms+='-'
  [[ -x $file ]] && perms+='x' || perms+='-'
  echo "$perms $file"
}

Então:

$ myperms /bin/bash
-r-x /bin/bash
$ touch afile
$ myperms afile
-rw- afile
$ chmod u+x afile
$ myperms afile
-rwx afile
$ ln -s afile alink
$ myperms alink
lrwx alink
$ chmod u-wx afile
$ myperms alink
lr-- alink

$ ls -l afile alink
-r--r--r-- 1 glennjackman staff 0 Dec 16 14:28 afile
lrwxr-xr-x 1 glennjackman staff 5 Dec 16 14:29 alink -> afile

Responder2

Com o bash versão 5, existem "comandos carregáveis" - comandos que não são comandos bash integrados, mas podem ser habilitados de forma que se tornem integrados:

  1. clone o repositório bash git:https://savannah.gnu.org/git/?group=bash
  2. ./configure --prefix=/path/where/you/want/it/installed
  3. fazer && fazer instalar
  4. statnão é um carregável "suportado", embora exista aqui, então
    1. cd ./examples/loadables
    2. make others
    3. cp stat /path/where/you/want/it/installed/lib/bash

Então

  1. Inicie um shell bash:/path/where/you/want/it/installed/bin/bash
  2. defina uma variável de shell:BASH_LOADABLES=/path/where/you/want/it/installed/lib/bash
  3. ative o comando stat:enable -f stat stat
  4. e use-o:stat -A statarray /some/file

statpreenche uma matriz associativa. Uma demonstração (usando a matriz padrão chamada "STAT")

$ ~/bash/5.0/bin/bash

$ echo $BASH_LOADABLES_PATH
/Users/glennjackman/bash/5.0/lib/bash

$ enable -f stat stat

$ stat ~/.bashrc

$ declare -p STAT
declare -A STAT=([nlink]="1" [link]="/Users/glennjackman/.bashrc" [perms]="0644" [inode]="14482796" [blksize]="4096" [device]="16777220" [atime]="1574454147" [type]="-" [blocks]="8" [uid]="502" [size]="2767" [rdev]="0" [name]="/Users/glennjackman/.bashrc" [mtime]="1574454147" [ctime]="1574454147" [gid]="20" )

$ for key in "${!STAT[@]}"; do printf "%s\t%s\n" "$key" "${STAT[$key]}"; done
nlink   1
link    /Users/glennjackman/.bashrc
perms   0644
inode   14482796
blksize 4096
device  16777220
atime   1574454147
type    -
blocks  8
uid 502
size    2767
rdev    0
name    /Users/glennjackman/.bashrc
mtime   1574454147
ctime   1574454147
gid 20

Para definir automaticamente a variável BASH_LOADABLE_PATH, coloquei meu ~/.bashrc:

# for loadable builtins
bash_root=${BASH%/bin/bash}
[[ -d "$bash_root/lib/bash" ]] && BASH_LOADABLES_PATH="$bash_root/lib/bash"
unset bash_root

informação relacionada