Vous devez utiliser chroot
. La chroot
commande 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é dir
avec trois fichiers: a
, b
, c
et ls
. Les trois premiers sont des fichiers réguliers. ls
est un lien dur vers le vrai ls
binaire afin que nous puissions lister les fichiers dans le chroot.
Je vais chroot
en 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 chroot
entrer dir
. L' /bin/bash
argument 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 chroot
commande. Fondamentalement, ce que vous devez faire pour résoudre votre problème est d'exécuter une chroot
commande 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 mysql
commande, vous devez exécuter:
ln /usr/bin/mysql /path/to/chroot/target