Встроенный способ вывода списка прав доступа к файлам в Linux?

Встроенный способ вывода списка прав доступа к файлам в Linux?

Какие существуют варианты, не используя внешние команды, для просмотра списка прав доступа к файлу?

testвстроенный, но будет работать только для владельца файла AFAIK, я после всего этого. Думал, что наткнулся на что-то с inodes, но я не могу найти способ прочитать их (со встроенными!) тоже.

bashтолько, пожалуйста. Любая версия и/или формат приемлемы.

редактировать:

Я знаю, что есть множество способов сделать это с помощью внешних команд ( stat, ls, и т.д.), это просто мысленное упражнение — ничто из того, что я делаю, не «требует» builtinединственного решения.

правка2:

Ответ Гленна Джекмана о загружаемых командах технически правильный, поскольку он использует встроенный. Однако я думаю, что это просто демонстрирует, что мой вопрос был плохо определен.

Используя чистые bash(любой версии) builtinкоманды, как указаноздесьв руководстве и другие встроенные функции bash(перенаправление, подстановка, ключевые слова, другие вещи, о которых я даже не знаю...), в системе linux, как мне вывести список полных разрешений, которые есть у файла? Вывод будет похож на любой из приведенных ниже, хотя значение umask также будет работать.

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

user@hostname$ stat test -c %a
664

решение1

С простым bash, я думаю, лучшее, что вы можете получить, это что-то вроде этого: вы получаететвойразрешения, а не групповые или другие.

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"
}

Затем:

$ 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

решение2

В bash версии 5 появились «загружаемые команды» — команды, которые не являются встроенными командами bash, но могут быть включены таким образом, что станут встроенными:

  1. клонируйте репозиторий bash git:https://savannah.gnu.org/git/?group=bash
  2. ./configure --prefix=/path/where/you/want/it/installed
  3. сделать && сделать установку
  4. statне является «поддерживаемым» загружаемым объектом, хотя он здесь и существует, поэтому
    1. cd ./examples/loadables
    2. make others
    3. cp stat /path/where/you/want/it/installed/lib/bash

Затем

  1. Запустите оболочку bash:/path/where/you/want/it/installed/bin/bash
  2. установите переменную оболочки:BASH_LOADABLES=/path/where/you/want/it/installed/lib/bash
  3. включите команду stat:enable -f stat stat
  4. и используйте его:stat -A statarray /some/file

statзаполняет ассоциативный массив. Демонстрация (использует массив по умолчанию с именем "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

Чтобы автоматически задать переменную BASH_LOADABLE_PATH, я добавляю в свой ~/.bashrc:

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

Связанный контент