Vous devez utiliser chroot. La chrootcommande modifie le répertoire racine que tous les processus enfants voient. Je vais donner un exemple pour montrer comment cela fonctionne.
Cela a été écrit sur place; Je ne suis pas actuellement devant une machine UNIX pour le moment. Dans cet exemple, il y a un répertoire appelé diravec trois fichiers: a, b, cet ls. Les trois premiers sont des fichiers réguliers. lsest un lien dur vers le vrai lsbinaire afin que nous puissions lister les fichiers dans le chroot.
Je vais chrooten dir. (Notez que j'oublie probablement certains répertoires du répertoire racine.)
Voici la configuration, sous forme de sortie 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
Maintenant je vais chrootentrer dir. L' /bin/bashargument choisit le processus à exécuter avec le nouveau répertoire racine. Il est par défaut /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
/
Maintenant, nous quittons chroot:
$ exit
$ # this prompt is now from the original bash process, from before the chroot
$ pwd
/home/alex/test
J'espère que cela illustre le fonctionnement de la chrootcommande. Fondamentalement, ce que vous devez faire pour résoudre votre problème est d'exécuter une chrootcommande en tant qu'utilisateur à chaque connexion. Peut-être la mettre dans un script de démarrage?
Un lien dur vers un fichier continuera de fonctionner à l'intérieur d'un chroot, même si ce fichier n'est pas accessible par d'autres moyens (cela fonctionne car les liens durs pointent vers des inodes, pas des chemins). Ainsi, afin de permettre à l'utilisateur d'accéder par exemple à la mysqlcommande, vous devez exécuter:
ln /usr/bin/mysql /path/to/chroot/target