Вы должны использовать chroot. Команда chrootизменяет корневой каталог, который видят все дочерние процессы. Я приведу пример, чтобы продемонстрировать, как это работает.
Это было написано на месте; Я сейчас не перед машиной UNIX. В этом примере есть директория dirс тремя файлами: a, b, c, и ls. Первые три являются обычными файлами. lsявляется жесткой ссылкой на настоящий lsдвоичный файл, так что мы можем перечислять файлы, находясь в chroot.
Я собираюсь chrootв dir. (Обратите внимание, что я, вероятно, забыл некоторые каталоги в корневом каталоге.)
Вот настройка в форме вывода оболочки:
$ 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
Теперь я буду chrootв dir. В /bin/bashвыбирает аргумент , что процесс должен быть запущен с новой корневой директории. По умолчанию оно /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
/
Теперь мы выходим из chroot:
$ exit
$ # this prompt is now from the original bash process, from before the chroot
$ pwd
/home/alex/test
Я надеюсь, что это иллюстрирует, как chrootработает команда. В основном, что вам нужно сделать, чтобы решить вашу проблему, это запускать chrootкоманду от имени этого пользователя каждый раз, когда он входит в систему. Возможно, поместить ее в сценарий запуска?
Жесткая ссылка на файл будет продолжать работать внутри chroot, даже если к этому файлу нельзя получить доступ другими способами (это работает, потому что жесткие ссылки указывают на inode, а не на пути). Итак, чтобы позволить пользователю получить доступ, например, к mysqlкоманде, вы должны выполнить:
ln /usr/bin/mysql /path/to/chroot/target