Você deveria usar chroot
. O chroot
comando altera o diretório raiz que todos os processos filho veem. Vou dar um exemplo para demonstrar como funciona.
Isso foi escrito no local; Atualmente, não estou na frente de uma máquina UNIX. Neste exemplo, há um diretório chamado dir
com três arquivos: a
, b
, c
, e ls
. Os três primeiros são arquivos regulares. ls
é um hardlink para o ls
binário real, para que possamos listar arquivos enquanto estiver no chroot.
Eu vou chroot
em dir
. (Observe que provavelmente estou esquecendo alguns diretórios no diretório raiz.)
Aqui está a configuração, no formato de saída do 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
Agora eu vou chroot
entrar dir
. O /bin/bash
argumento escolhe qual processo deve ser executado com o novo diretório raiz. O padrão é /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
/
Agora saímos do chroot
:
$ exit
$ # this prompt is now from the original bash process, from before the chroot
$ pwd
/home/alex/test
Espero que isso ilustre como o chroot
comando funciona. Basicamente, o que você precisa fazer para resolver seu problema é executar um chroot
comando como esse usuário toda vez que efetuar login. Talvez colocá-lo em um script de inicialização?
Um hardlink para um arquivo continuará a funcionar dentro de um chroot
, mesmo que esse arquivo não possa ser acessado por outros meios (isso funciona porque os hardlinks apontam para inodes, não para caminhos). Portanto, para permitir ao usuário acessar, por exemplo, o mysql
comando, você deve executar:
ln /usr/bin/mysql /path/to/chroot/target