Si dovrebbe usare chroot. Il chrootcomando modifica la directory principale che viene visualizzata da tutti i processi figlio. Fornirò un esempio per dimostrare come funziona.
Questo è stato scritto sul posto; Al momento non sono di fronte a una macchina UNIX. In questo esempio, c'è una directory chiamata dircon tre file: a, b, c, e ls. I primi tre sono file regolari. lsè un collegamento reale al vero lsbinario in modo che possiamo elencare i file mentre ci troviamo nel chroot.
Ho intenzione di chrootin dir. (Nota che probabilmente sto dimenticando alcune directory nella directory principale.)
Ecco la configurazione, nel modulo di output della shell:
$ pwd
/home/alex/test
$ l
dir
$ ls dir
a b c ls
$ ./ls dir # does the same thing
a b c ls
$ ls /
bin boot dev etc home mnt media proc sbin sys usr var
Ora sarò chrootin dir. L' /bin/bashargomento sceglie quale processo deve essere eseguito con la nuova directory principale. L'impostazione predefinita è /bin/sh.
$ chroot /bin/bash dir
$ # this prompt is now from a subprocess running in the new root directory
$ PATH=/ ls
a b c ls
$ pwd
/
Ora usciamo da chroot:
$ exit
$ # this prompt is now from the original bash process, from before the chroot
$ pwd
/home/alex/test
Spero che questo illustri come funziona il chrootcomando. Fondamentalmente quello che devi fare per risolvere il tuo problema è eseguire un chrootcomando come quell'utente ogni volta che effettuano il login. Forse metterlo in uno script di avvio?
Un hardlink a un file continuerà a funzionare all'interno di a chroot, anche se quel file non è accessibile con altri mezzi (questo funziona perché i hardlink puntano a inode, non a percorsi). Pertanto, per consentire all'utente di accedere ad esempio al mysqlcomando, è necessario eseguire:
ln /usr/bin/mysql /path/to/chroot/target