Welche Möglichkeiten gibt es, ohne externe Befehle die Berechtigungen einer Datei aufzulisten?
test
ist 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!).
bash
bitte 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
. ls
Dies ist nur eine Gedankenübung – nichts von dem, was ich tue, „erfordert“ eine builtin
einzige 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 ...), linux
wie 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:
- Klonen Sie das Bash-Git-Repo:https://savannah.gnu.org/git/?group=bash
./configure --prefix=/path/where/you/want/it/installed
- machen && machen installieren
stat
ist kein "unterstütztes" Loadable, obwohl es hier existiert, alsocd ./examples/loadables
make others
cp stat /path/where/you/want/it/installed/lib/bash
Dann
- Starten Sie eine Bash-Shell:
/path/where/you/want/it/installed/bin/bash
- Setzen Sie eine Shell-Variable:
BASH_LOADABLES=/path/where/you/want/it/installed/lib/bash
- Aktivieren Sie den Stat-Befehl:
enable -f stat stat
- und benutze es:
stat -A statarray /some/file
stat
fü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