Welcher Dateimodus zeigt an, dass eine Datei ein symbolischer Link (Symlink) ist?
Mein Anwendungsfall ist das Erkennen von Symbolen Links innerhalb eines Git-Repositorys (und seines Verlaufs). Ich hatte den Eindruck, dass ein Symlink aufgrund seines Dateimodus ein Symlink ist und dieser Dateimodus vom Tool chmod
festgelegt wird.
Kommentare
- Siehe superuser.com/questions/303040/…
- Es scheint, dass meine Frage besser gestellt wurde ‚ Welcher Dateimodus sind Symlinks in git ‚.
- stackoverflow.com/questions/15465436/git-how-to-handle-symlinks
-
chmod
setzt Berechtigungsbits (rwx- und sticky / setuid / setgid-Bits, …): Dies nennen wir einen “ -Modus „. Aber Sie scheinen sich stattdessen auf Dateitypen zu beziehen. - @JohnWHSmith Ich würde gerne einen Link zu Dokumenten hochstufen, die die Unterschiede zwischen Dateimodi und Dateitypen unterscheiden! : D
Antwort
Die Dateimodi decken zwei verschiedene Begriffe ab: Dateitypen und Dateiberechtigungen. Der Modus einer Datei wird durch den Wert von st_mode
im Ergebnis von stat(2)
-Aufrufen und ls -l
präsentiert sie alle zusammen; siehe Grundlegendes zu UNIX-Berechtigungen und -Dateitypen .
Sobald eine Datei erstellt wurde, kann ihr Typ „nicht geändert werden. Außerdem können Sie auf Linux-Systemen die Berechtigungen eines Symlinks nicht angeben. Alles, was zählt, ist die Erlaubnis des Ziels (und effektiv der Vollmodus, da dies auch das Verhalten des Symlinks bestimmt). Weitere Informationen finden Sie unter Wie gelten Dateiberechtigungen für Symlinks? . Unter Mac OS X können Symlinks ihre eigenen Berechtigungen haben.
Schließlich verwendet git
ein vereinfachtes Modell mit einer begrenzten Anzahl erkannter Modi:
-
040000
für ein Verzeichnis -
100644
für eine normale Datei -
100755
für eine ausführbare Datei -
120000
für einen symbolischen Link
Sie können diese Werte mit Befehlen wie git cat-file -p "master^{tree}"
anzeigen. Weitere Informationen finden Sie unter Pro Git .
Antwort
Welcher Dateimodus zeigt an, dass eine Datei ein symbolischer Link (Symlink) ist?
Die zu überprüfende POSIX-API Wenn es sich bei einer Datei um einen Symlink handelt, wird das Makro S_ISLNK
verwendet.
In glibc wird S_ISLNK
wie folgt definiert:
#define __S_IFMT 0170000 /* These bits determine file type. */ #define __S_IFLNK 0120000 /* Symbolic link. */ #define __S_ISTYPE(mode, mask) (((mode) & __S_IFMT) == (mask)) #define S_ISLNK(mode) __S_ISTYPE((mode), __S_IFLNK)
dh Eine Datei ist ein Symlink if ((mode & 0170000) == 0120000)
(zumindest unter GNU / Linux).
Antwort
Ein Symlink (obwohl einige Dateisysteme Symlinks unterschiedlich behandeln) ist ein inode
-Tabelleneintrag, der auf dieselbe Stelle wie eine andere Datei (oder ein anderes Verzeichnis) verweist.
Wenn beispielsweise foo
inode 1234
ist, dann bar
(a Symlink zu foo) ist inode 1234
.
bar
existiert nicht wirklich, es ist nur ein Zeiger auf a „echte“ Datei.
Symlinks
haben im Allgemeinen keine Berechtigungen außerhalb der Berechtigungen der Datei, auf die sie verweisen. bar"s
sind also Berechtigungen „das gleiche“ as foo"s
. Sie können keine Berechtigungen für bar
(den Symlink) nur für foo
(die reale Datei).
Davon abgesehen ist es „eine wirklich übergeordnete Ansicht. Verschiedene Dateisysteme behandeln Symlinks unterschiedlich. Verschiedene Tools behandeln symlinks
unterschiedlich. Einige Dateisysteme“ kennzeichnen „symlinks
und behandeln sie speziell, aber einige nicht.
Zum Beispiel chmod
auf Linux
ändert eine symlinks
Berechtigungen, aber auf OSX
können Sie darauf zugreifen. In beiden Fällen werden die Berechtigungen für echte Dateien geändert.
Ich kann mir kein System vorstellen (nicht „t bedeutet, dass es nicht da draußen ist), wo ein symlink
Berechtigungen hat, die von der realen Datei getrennt sind.
Kommentare
- Nein, ein Symlink ist ein Dateityp (“ alles ist eine Datei „), der eher einen Dateinamen als einen allgemeinen enthält. Zweckdaten. In der Regel bezieht sich dieser Dateiname auf eine vorhandene Datei – das ist ‚ der springende Punkt bei Symlinks -, dies ist jedoch nicht garantiert. Ja, ein Symlink (wie jeder andere) Dateityp) hat einen Inode. Nein, ein Symlink und die Datei, auf die verwiesen wird, haben separate Inodes mit unterschiedlichen Inode-Nummern. Hard Links haben denselben Inode und somit die gleiche Inode num ber.
- Nun, es sollte auf hohem Niveau sein, aber moderne Systeme ‚ erstellen keine Datei auf der Festplatte. Die Inode-Tabelle enthält die Zeichenfolge und keine echte Datei erstellt. Ich denke, es heißt ‚ “ schneller Symlink “
- Wenn ‚ foo ‚ und ‚ bar ‚ sind beide Zeiger auf den Knoten 1234, dann sind sie ‚ HARD-Links, keine Symlinks. Wenn “ bar “ ein SYMlink wäre, wäre dies buchstäblich die Zeichenfolge “ foo “ (oder sogar der Pfad zu foo) anstelle eines Knotens. Tatsächlich können Sie einen Symlink erstellen, der ‚ an keiner Stelle von Bedeutung ist, z.
ln -s 'this is not a real file' bar
- Außerdem: BSD (einschließlich Mac OS X) verfügt über einen Systemaufruf lchmod (), mit dem Sie die Berechtigungen für den Symlink selbst festlegen können. Ich habe keine Ahnung, wozu das gut ist.