Quale modalità file indica che un file è un collegamento simbolico (collegamento simbolico)?
Il mio caso duso è rilevare simboli collegamenti allinterno di un repository git (e la sua cronologia). Avevo limpressione che un link simbolico fosse un link simbolico a causa della sua modalità file e che la modalità file fosse ciò che lo strumento chmod
imposta.
Commenti
Risposta
Le modalità file coprono due diverse nozioni: tipi di file e permessi dei file. La modalità di un file è rappresentata dal valore di st_mode
nel risultato delle stat(2)
chiamate e ls -l
li presenta tutti insieme; vedi Capire i permessi UNIX e i tipi di file per i dettagli.
Una volta che un file è stato creato, il suo tipo può “T essere cambiato. Inoltre, su sistemi Linux non è possibile specificare i permessi di un collegamento simbolico; tutto ciò che conta è il permesso del target (ed effettivamente la modalità completa poiché ciò determina anche il comportamento del link simbolico). Vedi Come si applicano i permessi dei file ai link simbolici? per i dettagli. Su Mac OS X i collegamenti simbolici possono avere le proprie autorizzazioni.
Infine, git
utilizza un modello semplificato, con un numero limitato di modalità riconosciute:
-
040000
per una directory -
100644
per un file normale -
100755
per un file eseguibile -
120000
per un collegamento simbolico
Puoi visualizzare questi valori utilizzando comandi come git cat-file -p "master^{tree}"
; vedi Pro Git per i dettagli.
Risposta
Quale modalità file indica che un file è un collegamento simbolico (collegamento simbolico)?
LAPI POSIX da controllare se un file è un collegamento simbolico utilizza la macro S_ISLNK
.
In glibc, S_ISLNK
è definito come segue:
#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)
es un file è un collegamento simbolico if ((mode & 0170000) == 0120000)
(almeno su GNU / Linux).
Risposta
Un collegamento simbolico (sebbene alcuni filesystem gestiscano i collegamenti simbolici in modo diverso) è una voce di tabella inode
che punta alla stessa posizione di un altro file (o directory).
Ad esempio, se foo
è inode 1234
allora bar
(un collegamento simbolico a pippo) è inode 1234
.
bar
non “esiste veramente” è solo un puntatore a un file “reale”.
Symlinks
generalmente non dispone di autorizzazioni al di fuori delle autorizzazioni del file a cui puntano. Pertanto, le autorizzazioni bar"s
sono “lo stesso” as foo"s
. Non puoi “impostare le autorizzazioni su bar
(il collegamento simbolico) solo su foo
(il file reale).
Detto questo, è “una vista di alto livello. Diversi file system gestiscono i collegamenti simbolici in modo diverso. Strumenti diversi gestiscono symlinks
in modo diverso. Alcuni file system” flag “symlinks
e gestirli in modo speciale, ma alcuni “t.
Ad esempio chmod
su Linux
non cambierà un symlinks
permessi ma su OSX
puoi ottenerli. In entrambi i casi vengono cambiati i permessi dei file reali.
Non riesco a pensare a nessun sistema (non “t significa che “non è là fuori) dove un symlink
ha autorizzazioni separate dal file reale.
Commenti
- No, un collegamento simbolico è un tipo di file (” tutto è un file “) che contiene un nome file anziché un nome generico- dati relativi allo scopo. In genere questo nome file si riferisce a un file esistente – che ‘ è il punto centrale di avere collegamenti simbolici – ma non è garantito che sia vero. Sì, un collegamento simbolico (come ogni altro tipo di file) ha un inode. No, un collegamento simbolico e il file a cui punta hanno inode separati, con numeri di inode diversi. I link Hard hanno lo stesso inode, e quindi lo stesso inode num ber.
- beh, doveva essere di alto livello ma i sistemi moderni non ‘ per creare un file sul disco rigido la tabella degli inode contiene la stringa e nessun file reale è creato. Penso che ‘ si chiami ” collegamento simbolico veloce ”
- Se ‘ foo ‘ e ‘ bar ‘ sono entrambi puntatori al nodo 1234, quindi ‘ sono collegamenti HARD, non collegamenti simbolici. Se ” bar ” fosse un SYMlink, sarebbe letteralmente la stringa di caratteri ” foo ” (o anche il percorso per foo) invece di un nodo. In effetti, puoi creare un link simbolico che ‘ non punta a nessun punto significativo, ad es.
ln -s 'this is not a real file' bar
- Inoltre: BSD (che include Mac OS X) ha una chiamata di sistema lchmod () che ti permetterà di impostare i permessi del link simbolico stesso. Non ho idea di quale sia luso di questo.
chmod
imposta i bit di autorizzazione (rwx e sticky / setuid / setgid bits, …): questo è ciò che chiamiamo una ” modalità “. Ma sembra che tu ti riferisca invece ai tipi di file.