Вы должны использовать 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