Мне удалось добиться почти того, что я изначально хотел, используя пространства имен монтирования . (В моем первоначальном решении также использовался unionfs , но, как оказалось, он вообще не нужен ). Он используется для привязки -mount /bin/bash
к /bin/sh
для ограниченного набора процессов. Краткая процедура установки новой оболочки, где sh
— это bash
, описана ниже.
Сначала мы запускаем новую оболочку с изолированным пространством имен монтирования:
sudo unshare -m sudo -u user /bin/bash
А потом в новой оболочке привязываем -крепление /bin/bash
к/bin/sh
:
sudo mount --bind /bin/bash /bin/sh
Вот именно!
Посмотрим, что у нас в этой оболочке:
user@ubuntu:~$ /bin/sh --version
GNU bash, version...
user@ubuntu:~$ diff -s /bin/sh /bin/bash
Files /bin/sh and /bin/bash are identical
Но при работе в другой оболочке:
user@ubuntu:~$ /bin/sh --version
/bin/sh: 0: Illegal option --
user@ubuntu:~$ diff -s /bin/sh /bin/bash
Binary files /bin/sh and /bin/bash differ
user@ubuntu:~$ diff -s /bin/sh /bin/dash
Files /bin/sh and /bin/dash are identical