Non capisco perfettamente cosa stai chiedendo. Se non avessi saputo nulla di meglio, penso che mi stavi chiedendo se c'era un modo per rilevarlo mentre si trattava di gestire un file. Non credo sia possibile.
L'unico metodo che riesco a concepire è fare una ricerca in cui inizi specificamente a cercare un determinato ramo nella struttura di directory.
Esempio
$ tree
.
`-- a
`-- b
|-- c
| `-- d
| `-- e -> ../../../../a/b
`-- e -> e
5 directories, 1 file
Il find
comando rileverà questo loop ma non ti dirà molto su di esso.
$ find -L . -mindepth 15
find: File system loop detected; `./a/b/c/d/e' is part of the same file system loop as `./a/b'.
find: `./a/b/e': Too many levels of symbolic links
Ho scelto arbitrariamente 15 livelli in modo da bloccare qualsiasi output visualizzato dal find
. Puoi comunque rilasciare quel parametro ( -mindepth
) se non ti interessa l'albero della directory visualizzato. Il find
comando rileva ancora il loop e si ferma:
$ find -L .
.
./a
./a/b
./a/b/c
./a/b/c/d
find: File system loop detected; `./a/b/c/d/e' is part of the same file system loop as `./a/b'.
find: `./a/b/e': Too many levels of symbolic links
Per inciso, se si desidera sovrascrivere il valore predefinito MAXSYMLINKS
apparentemente 40 su Linux (versioni 3.x più recenti del kernel) è possibile vedere queste domande e risposte U&L intitolate: Come aumentare MAXSYMLINKS .
Utilizzando il comando symlink
Esiste uno strumento che i manutentori del sito FTP potrebbero utilizzare chiamato symlinks
che aiuterà a esporre i problemi con alberi lunghi o penzolanti causati da collegamenti simbolici.
In alcuni casi lo symlinks
strumento potrebbe essere utilizzato anche per eliminare collegamenti offensivi.
Esempio
$ symlinks -srv a
lengthy: /home/saml/tst/99159/a/b/c/d/e -> ../../../../a/b
dangling: /home/saml/tst/99159/a/b/e -> e
La libreria glibc
La libreria glibc sembra offrire alcune funzioni C in questo senso, ma non conosco del tutto il loro ruolo o come usarle effettivamente. Quindi posso solo indicarteli.
La pagina man, man symlink
mostra la definizione della funzione per una funzione chiamata symlink()
. La descrizione va così:
symlink () crea un collegamento simbolico chiamato newpath che contiene la stringa oldpath.
Uno degli errori indica che questa funzione restituisce:
ELOOP Troppi collegamenti simbolici sono stati riscontrati nella risoluzione di newpath.
Ti indirizzerò anche alla pagina man, man path_resolution
che discute come Unix determina i percorsi verso gli elementi sul disco. Nello specifico questo paragrafo.
If the component is found and is a symbolic link (symlink), we first
resolve this symbolic link (with the current lookup directory as starting
lookup directory). Upon error, that error is returned. If the result is
not a directory, an ENOTDIR error is returned. If the resolution of the
symlink is successful and returns a directory, we set the current lookup
directory to that directory, and go to the next component. Note that the
resolution process here involves recursion. In order to protect the
kernel against stack overflow, and also to protect against denial of
service, there are limits on the maximum recursion depth, and on the maximum
number of symbolic links followed. An ELOOP error is returned when the
maximum is exceeded ("Too many levels of symbolic links").
readlink ...
sulle situazioni precedenti?