Bạn nên sử dụng chroot. Các chrootlệnh thay đổi thư mục gốc mà tất cả các tiến trình con xem. Tôi sẽ đưa ra một ví dụ để chứng minh cách nó hoạt động.
Điều này đã được viết tại chỗ; Tôi không thực sự đứng trước một máy UNIX ngay bây giờ. Trong ví dụ này, có một thư mục có tên dirvới ba tác phẩm: a, b, c, và ls. Ba đầu tiên là các tập tin thường xuyên. lslà một liên kết cứng đến lsnhị phân thực để chúng ta có thể liệt kê các tệp khi ở trong chroot.
Tôi sẽ đi chrootvào dir. (Lưu ý rằng tôi có thể quên một số thư mục trong thư mục gốc.)
Đây là thiết lập, ở dạng đầu ra 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
Bây giờ tôi sẽ chrootvào dir. Đối /bin/bashsố chọn quá trình nên được chạy với thư mục gốc mới. Nó mặc định là /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
/
Bây giờ chúng tôi thoát khỏi chroot:
$ exit
$ # this prompt is now from the original bash process, from before the chroot
$ pwd
/home/alex/test
Tôi hy vọng điều này minh họa cách chroothoạt động của lệnh. Về cơ bản những gì bạn phải làm để giải quyết vấn đề của mình là chạy một chrootlệnh như người dùng đó mỗi khi họ đăng nhập. Có lẽ đặt nó trong một kịch bản khởi động?
Một liên kết cứng đến một tệp sẽ tiếp tục hoạt động bên trong một chroot, ngay cả khi tệp đó không thể được truy cập bằng các phương tiện khác (điều này hoạt động vì các liên kết cứng trỏ đến inodes, không phải đường dẫn). Vì vậy, để cho phép người dùng truy cập, ví dụ mysqllệnh, bạn sẽ thực thi:
ln /usr/bin/mysql /path/to/chroot/target