如何使用–userspec在chroot中设置ulimit

我有脚本来创build一个最小的chroot(下面),但我不知道如何获得ulimit来处理chroot的进程:

#!/bin/bash user=$1 apps="$2" cmd_to_run="$3" shift 3 directory="minimal_chroot" if [ ! -d "$directory" ]; then mkdir -pv $directory/etc >/dev/null 2>&1 grep /etc/passwd -e "^$user" | sed "s/\/home\/$user/\//" >> $directory/etc/passwd grep /etc/group -e "^$user" >> $directory/etc/group mkdir -p "$directory/etc/security/" >/dev/null limits="$directory/etc/security/limits.conf" echo "$user hard nofile 100" >> $limits # cmds can be a space-separated list of commands for app in $apps; do file_path=`which $app` if [ -n "$file_path" ] ; then non_root_path=`echo "$file_path" | sed -E 's/^\/(.*$)/\1/'` mkdir -pv $directory/`dirname $non_root_path` >/dev/null 2>&1 cp -v {,$directory}$file_path >/dev/null 2>&1 for file in `ldd $file_path | grep "/lib" | sed -E 's/^.*[ \t]\/(lib[^ ]+\.[0-9]) .*$/\1/'` ; do mkdir -p $directory/`dirname $file | sed -E 's/^\/(.*$)/\1/'` >/dev/null 2>&1 cp -v {,$directory}/$file >/dev/null 2>&1 done fi done fi find $directory -maxdepth 1 -type f -exec rm {} + >/dev/null 2>&1 chmod -R o+rwx $directory >/dev/null 2>&1 find $directory -exec chmod o+rx-w {} + >/dev/null 2>&1 chmod o+rw $directory >/dev/null 2>&1 uid=`id -u $user` ulimit -Su 10 sudo chroot --userspec=$uid:$uid $directory $cmd_to_run $* <&0 & chroot_pid=$! trap "kill -INT $chroot_pid" SIGINT SIGTERM SIGXCPU wait $python_chroot_pid find $directory -maxdepth 1 -type f -exec rm {} + >/dev/null 2>&1 

输出:

 blah@dev:~$ sudo ./minimal_chroot.sh chrootuser "ls cd pwd cat bash" bash bash-4.2$ pwd / bash-4.2$ ulimit -a core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited scheduling priority (-e) 0 file size (blocks, -f) unlimited pending signals (-i) 7806 max locked memory (kbytes, -l) 64 max memory size (kbytes, -m) unlimited open files (-n) 1024 pipe size (512 bytes, -p) 8 POSIX message queues (bytes, -q) 819200 real-time priority (-r) 0 stack size (kbytes, -s) 8192 cpu time (seconds, -t) unlimited max user processes (-u) 7806 virtual memory (kbytes, -v) unlimited file locks (-x) unlimited bash-4.2$ 

请注意,最大用户进程仍然是在7806而不是我试图用ulimit -Su 10命令指定的ulimit -Su 10 。 噢,我也搞乱/etc/security/limits.conf可以看到与echo "$user hard nofile 100" >> $limits线。 这也不起作用。

我怎样才能使ulimits生效,同时仍然保持chroot最低?

尝试#2

我试图换掉这一行:

 sudo chroot --userspec=$uid:$uid $directory $cmd_to_run $* <&0 & 

为了这:

 sudo chroot $directory bash -c "ulimit -Su 20; su $user; $cmd_to_run $*" <&0 & 

这实际上运行良好, ulimit -a显示最大用户进程为20,但后来我意识到,它不su $user$user ,并仍然以root身份运行,因为我拿出了 – userspec。

请注意,通过PAM模块(即pam_limits强制实施限制,默认情况下,其configuration文件为/etc/security/limits.conf ,但只是将该configuration文件放入chroot并不能提供任何实际的基础结构。

你看到的ulimit -a的输出是blah用户login的。

chroot调用在任何时候都不会触发PAMconfiguration,因此它不能在chroot设置任何限制。