Integrierte Möglichkeit zum Auflisten von Dateiberechtigungen in Linux?

Integrierte Möglichkeit zum Auflisten von Dateiberechtigungen in Linux?

Welche Möglichkeiten gibt es, ohne externe Befehle die Berechtigungen einer Datei aufzulisten?

testist ein integriertes Element, würde aber meines Wissens nur für den Eigentümer der Datei funktionieren. Ich bin hinter dem gesamten Ding her. Dachte, ich wäre mit auf etwas gestoßen inodes, aber ich kann auch keine Möglichkeit finden, diese zu lesen (mit integrierten Elementen!).

bashbitte nur. Jede Version und/oder jedes Format ist akzeptabel.

bearbeiten:

Mir ist bewusst, dass es unzählige Möglichkeiten gibt, dies mit externen Befehlen (, usw.) zu tun stat. lsDies ist nur eine Gedankenübung – nichts von dem, was ich tue, „erfordert“ eine builtineinzige Lösung .

Bearbeitung2:

Glenn Jackmans Antwort zu ladbaren Befehlen ist technisch korrekt, da sie ein integriertes Kommando verwendet. Ich denke jedoch, dass sie nur zeigt, dass meine Frage schlecht definiert war.

Verwenden von reinen Befehlen bash(jeder Version) builtin, wie aufgelistetHierim Handbuch und anderen integrierten Funktionen bash(Umleitung, Ersetzung, Schlüsselwörter, andere Dinge, die ich nicht einmal kenne ...), linuxwie kann ich auf einem System die vollständigen Berechtigungen einer Datei auflisten? Die Ausgabe wäre ähnlich wie die unten stehenden, obwohl auch ein Umask-Wert funktionieren würde.

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

user@hostname$ stat test -c %a
664

Antwort1

Mit einfachem Bash ist meiner Meinung nach das Beste, was Sie erreichen können, so etwas wie das hier: Sie erhaltendeinBerechtigungen, nicht Gruppe oder Sonstiges.

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

Dann:

$ 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

Antwort2

Mit Bash Version 5 gibt es „ladbare Befehle“ – Befehle, die keine integrierten Bash-Befehle sind, aber aktiviert werden können, sodass sie zu integrierten Befehlen werden:

  1. Klonen Sie das Bash-Git-Repo:https://savannah.gnu.org/git/?group=bash
  2. ./configure --prefix=/path/where/you/want/it/installed
  3. machen && machen installieren
  4. statist kein "unterstütztes" Loadable, obwohl es hier existiert, also
    1. cd ./examples/loadables
    2. make others
    3. cp stat /path/where/you/want/it/installed/lib/bash

Dann

  1. Starten Sie eine Bash-Shell:/path/where/you/want/it/installed/bin/bash
  2. Setzen Sie eine Shell-Variable:BASH_LOADABLES=/path/where/you/want/it/installed/lib/bash
  3. Aktivieren Sie den Stat-Befehl:enable -f stat stat
  4. und benutze es:stat -A statarray /some/file

statfüllt ein assoziatives Array. Eine Demo (unter Verwendung des Standardarrays mit dem Namen „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

Um die Variable BASH_LOADABLE_PATH automatisch festzulegen, gebe ich in meine ~/.bashrc Folgendes ein:

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

verwandte Informationen