В качестве шелла пользователю назначается скрипт /bin/chrsh
echo "/bin/chrsh" >> /etc/shells
cat >> /bin/chrsh << EOF
#!/bin/sh
/usr/bin/sudo /usr/bin/chroot /home/$USER /bin/bash
EOF
chsh -s /bin/chrsh логинURL: http://www.opennet.me/openforum/vsluhforumID1/46802.html
Обсуждается: http://www.opennet.me/tips/info/709.shtml
Ужасный способ. Тем более добавление "/bin/chrsh" в /etc/shells, - при доступе к non-chroot environment на этой машине юзер сможет запросто сменить свой шелл.
Как это сделать правильно в *BSD:
Создаём в /etc/login.conf новый класс пользователей, скажем chrootusers, и назначаем ему shell=/bin/chrsh, которая представляет из себя програмку-враппер которая делает getpwent(), chroot() а потом exec(pw->pw_shell,..). Готово. Никаких скриптов и лазеек.
Думаю в linux можно как-нибудь извернуться через PAM.
В линуксе это чрезвычайно просто проделал через PAM.
http://www.chains.ch/chroot.php
Чрезвычайно просто...каждому юзеру создавать dev и монтировать devpts
ссылка битая !
И ни слова о том, что надо создать такому юзеру остельное окружение, включающее запускаемые программы (начиная с ls), разделяемые библиотеки, файлы из /etc (например, groups, который используется программой ls) и ещё много чего, я даже не назову всё. Возможно, юзеру понадобятся спецфайлы из /dev ...А если какая-то из нужных этому юзеру программ использует /proc, то я даже не знаю, что делать - в отличие от вышеупомянутых, её нельзя скопировать (разве что смонтировать на саму себя по NFS).
> И ни слова о том, что надо создать такому юзеру остельное окружение,
> включающее запускаемые программы (начиная с ls), разделяемые
> библиотеки, файлы из /etc (например, groups, который используется
> программой ls) и ещё много чего, я даже не назову всё. Возможно, юзеру
> понадобятся спецфайлы из /dev ...
Банальности.> А если какая-то из нужных этому юзеру программ использует /proc, то я
> даже не знаю, что делать - в отличие от вышеупомянутых, её нельзя
> скопировать (разве что смонтировать на саму себя по NFS).
Можно просто ещё раз её смонтировать.
Господь с вами любезный государь! :))) По NFSу... хи-хи :))
Я думаю проще так: для простоты положим что пользователю нужен bash и ls#начинаем создавать окружение
mkdir -p /home/vasya_pupkin/etc ;
mkdir -p /home/vasya_pupkin/proc ;
#монтируем нужные файловые системы
mount -t proc /proc /home/vasya_pupkin/proc;
mount -o bind /etc /home/vasya_pupkin/etc;
#Проверочка
mount;
#Смотрим используемые библиотеки и копируем их
ldd -d /bin/ls;
mkdir /home/vasya_pupkin/lib;
cp libtermcap.so.2 /home/vasya_pupkin/lib;
cp /lib/libtermcap.so.2 /home/vasya_pupkin/lib;
cp /lib/libc.so.6 /home/vasya_pupkin/lib;
cp /lib/ld-linux.so.2 /home/vasya_pupkin/lib;
ldd -d /bin/bash;
cp /lib/libreadline.so.4.2 /home/vasya_pupkin/lib;
cp /lib/libhistory.so.4.2 /home/vasya_pupkin/lib;
cp /lib/libdl.so.2 /home/vasya_pupkin/lib;
#Копируем необходимое
mkdir /home/vasya_pupkin/bin;
cp /bin/bash /home/vasya_pupkin/bin;
cp /bin/ls /home/vasya_pupkin/bin;
#собственно chroot
chroot /home/vasya_pupkin/;аналогично обходимся со всем что нужно и все работает без NFS :)))
Чтото длинно и долго...
#!/bin/bash
chroot=$1
progs=${*#$1}
for i in $progs
do
for d in $(ldd $(which $i)|awk '{print $3}')
do
echo mkdir -p $chroot$(dirname $d) && cp $d $chroot$d || echo "failed" && exit 1
done
done./chroot.sh /home/vasja perl bash
это не все. через truss можно вычислить, что перлу, кроме shared objects, которые показывает ldd, не хватает еще горы файлов.
у меня так:
truss /usr/local/bin/perl > perl 2>&1
cat perl | grep openopen("/etc/libmap.conf",0x0,0666) ERR#2 'No such file or directory'
open("/var/run/ld-elf.so.hints",0x0,00) = 3 (0x3)
open("/usr/lib/libm.so.2",0x0,027757774564) = 3 (0x3)
open("/usr/lib/libcrypt.so.2",0x0,027757774564) = 3 (0x3)
open("/usr/lib/libutil.so.3",0x0,027757774564) = 3 (0x3)
open("/usr/lib/libc.so.4",0x0,027757774564) = 3 (0x3)
open("/usr/share/locale/uk_UA.KOI8-U/LC_COLLATE",0x0,0666) = 3 (0x3)
open("/usr/share/locale/uk_UA.KOI8-U/LC_CTYPE",0x0,0666) = 3 (0x3)
open("/usr/share/locale/uk_UA.KOI8-U/LC_MONETARY",0x0,05007724567) = 3 (0x3)
open("/usr/share/locale/uk_UA.KOI8-U/LC_NUMERIC",0x0,05007724567) = 3 (0x3)
open("/usr/share/locale/uk_UA.KOI8-U/LC_TIME",0x0,05007724567) = 3 (0x3)
open("/usr/share/locale/uk_UA.KOI8-U/LC_MESSAGES",0x0,05007724567) = 3 (0x3)
open("/dev/urandom",0x0,01002533205) = 3 (0x3)и это, похоже, еще не все. К перлу еще прийдется копировать .PM'ы. Для каждого пользователя.
Не ужели нет более красивого способа?
>это не все. через truss можно вычислить, что перлу, кроме shared objects,
>которые показывает ldd, не хватает еще горы файлов.
>у меня так:
>truss /usr/local/bin/perl > perl 2>&1
>cat perl | grep open
>
>open("/etc/libmap.conf",0x0,0666)
> ERR#2 'No such file or directory'
>open("/var/run/ld-elf.so.hints",0x0,00) = 3
>(0x3)
>open("/usr/lib/libm.so.2",0x0,027757774564) = 3 (0x3)
>open("/usr/lib/libcrypt.so.2",0x0,027757774564) = 3 (0x3)
>open("/usr/lib/libutil.so.3",0x0,027757774564) = 3 (0x3)
>open("/usr/lib/libc.so.4",0x0,027757774564) = 3 (0x3)
>open("/usr/share/locale/uk_UA.KOI8-U/LC_COLLATE",0x0,0666) = 3 (0x3)
>open("/usr/share/locale/uk_UA.KOI8-U/LC_CTYPE",0x0,0666) = 3 (0x3)
>open("/usr/share/locale/uk_UA.KOI8-U/LC_MONETARY",0x0,05007724567) = 3 (0x3)
>open("/usr/share/locale/uk_UA.KOI8-U/LC_NUMERIC",0x0,05007724567) = 3 (0x3)
>open("/usr/share/locale/uk_UA.KOI8-U/LC_TIME",0x0,05007724567) = 3 (0x3)
>open("/usr/share/locale/uk_UA.KOI8-U/LC_MESSAGES",0x0,05007724567) = 3 (0x3)
>open("/dev/urandom",0x0,01002533205)
> = 3 (0x3)
>
>и это, похоже, еще не все. К перлу еще прийдется копировать .PM'ы.
>Для каждого пользователя.
>
>Не ужели нет более красивого способа?perl я от балды поставил...и так ясно что перл нужно весь копировать,со всеми модулями и либами