答案1
Ubuntu <= 11.10 用户请按照本指南操作,对于 Ubuntu 用户 >= 11.10,请阅读页面底部的通知:
是的,所有这些程序都已过时,您的所有问题都在这里得到解答,并且可以通过家长控制来查看......
当我们谈论强制用户注销时,我们真正谈论的是对该帐户实施系统访问或服务的时间限制。我发现实施时间限制的最简单方法是使用名为Linux的PAM。
可插入式身份验证模块 (PAM)是一种用户身份验证机制。具体来说,我们将使用该pam_time
模块来控制用户对服务的定时访问。
使用该pam_time
模块,我们可以在一天中的不同时间以及特定日期或通过各种终端线路对系统和/或特定应用程序设置访问限制。根据配置,您可以使用此模块根据用户姓名、一天中的时间、一周中的日期、他们申请的服务以及他们发出请求的终端来拒绝个别用户的访问。
使用 时,您必须用换行符pam_time
终止文件中每一行(或规则)的语法。您可以用井号 [#] 注释每一行,系统将忽略该文本,直到换行符为止。/etc/security/time.conf
以下是规则的语法:
服务;ttys;用户;时间
The first field — services — is a logic list of PAM service names.
The second field — tty — is a logic list of terminal names.
The third field — users — is a logic list of users or a netgroup of users.
The fourth field — times — indicates the applicable times.
以下是一组典型规则的示例:
login ; * ; !bobby ; MoTuWeThFr0800-2000
login ; * ; !root ; !Al0000-2400
http ; * ; !bobby ; MoTuWeThFr0800-2000
http ; * ; !root; !Al0000-2400
这些规则限制用户 bobby 在 08:00 到 20:00 之间登录,并且还限制这些时间段内的 Internet 访问。Root 可以在任何时间登录,并且可以在任何时间浏览 Internet。
笔记:系统使用这些规则将错误记录为 syslog(3)。
使用 Ubuntu Linux,您可以为您的计算机分配时间限制,以防止一个或多个用户连接到您的系统。例如,通过时间限制,您可以限制孩子访问计算机(简而言之,是一种家长控制),甚至在特定时段保护与服务器的连接。
手动配置
了解你将要做什么
在本教程中,我们将使用 PAM(可插入身份验证模块,英文为 Pluggable Authentication Modules)。它允许您在用户连接时控制用户身份验证。然后,我们将使用安全配置文件来定义允许的登录时间。这些操作可以在任何版本的 Ubuntu 上执行,并且只需要一个简单的文本编辑器(vim、emacs、nano、gedit、kate 等)。通过 PAM 模块启用限制时间
首先,首先进入/etc/pam.d/
,那里有所有可配置的服务:
$ Ls /etc/pam.d/
atd common-account common-session gdm login ppp sudo
chfn common-auth cron gdm-autologin Other samba
chsh common-cupsys gnome-screensaver password passwd su
如果我们想阻止与计算机的连接,我们将不得不更改 gdm 服务。编辑文件 so gdm 并添加以下代码行(在文件末尾):
account required pam_time.so
GDM 是 Ubuntu、Edubuntu 和 Xubuntu 发行版的登录屏幕。对于使用 KDE 的 Kubuntu,kdm 服务被称为它将要打开的文件。您已完成 PAM 的配置!这将启用对此服务的小时数的控制。
如果您有服务器,则可能没有 GUI。在这种情况下,GDM/KDM 未安装,连接不会被阻止。要阻止连接到 TTY,您必须修改登录同一文件,并添加与先前确认的相同的代码行。此操作也适用于已安装 GUI 并希望阻止访问登录屏幕和终端的人。
配置访问时间
现在 PAM 服务已激活,我们只需配置访问时间。打开/etc/security
。有多个配置文件可用:
$ Ls /etc/security/
access.conf namespace.conf pam_env.conf
group.conf namespace.init time.conf
limits.conf opasswd time.conf.bak
编辑文件time.conf
。一些解释和示例(英文)介绍。要设置访问计划,请复制并粘贴以下代码行(与往常一样,位于文件末尾):
*;*;user;scheduler
不要在用户字段中输入您想要阻止的登录帐户。
如果要阻止多个用户,请连续输入他们的登录信息,并用 | 运算符分隔。例如,如果我想冻结 Patrick、John 和 Emily 的帐户:
*;*;Patrick|jean|emilie;scheduler
相反,如果您想阻止除某位用户之外的所有用户访问系统,请在相关人员前使用!。例如,如果我想禁止除 Nicolas 和 Xavier 之外的所有用户访问计算机:
Nicolas *;*;!|xavier;scheduler
现在转到区域字段。在此字段中,可以选择连接的日期和时间。您必须首先使用以下缩写指定星期几:
Mo : Monday Fr : Friday Wd : Sa/Su
Tu : Tuesday Sa : Saturday wk : Mo/Tu/We/Th/Fr
We : Wenesday Su : Sunday
Th : Thursday Al : All Days
注意不要混淆缩写 Wk 和 Wd 会产生误导!在互联网上尤其难以识别:您可以轻松找到相互矛盾的信息!
然后,我们指定截止时间。这些应采用 24 小时格式,由 4 位数字组成。例如,要限制下午 3:17 至下午 6:34,我们写:1517-1834。要允许 Marie 仅在星期二下午 3:17 至下午 6:34 连接,我们得到以下结果:
*;*;marie;Tu1517-1834
这些时间之外的连接将被禁止。对于用户,可以使用运算符 | 和!来多次指示(!然后表示允许所有登录时间,除了要显示的那些时间)。
代码行开头的两个星号(通配符)分别是 和 tty 服务字段。由于您要阻止对系统的所有访问,因此无需指定要阻止的服务或 tty。但是,如果您想阻止使用特定服务,只需按以下示例指定它即可:
login;tty1|tty4|tty5;marie;!Wd0000-2400
因此,用户 mary 在周末无法连接到 TTY、4 和 5。
限制时间表的一些示例
mathilde 被允许在每天下午 1:20 至 3:20 以及下午 4:00 至晚上 8:30 之间上网:
*;*;mathilde;Al1320-1520|Al1600-2030
Stone、Frank 和 Florian 可以在工作日下午 2:00 至下午 6:45 以及周末下午 2:00 至晚上 10:15 进行连接:
*;*;Stone|franck|florian;Wk1400-1845|Wd1400-2215
Olive 永远不允许连接。jessica 可以在星期三下午 1:00 到下午 4:00 登录:
*;*;olivier;!Al0000-2400
*;*;jessica;We1300-1600
2 条不同的线路,每个用户有两个不同的时间 会话到期
当会话过期(超过用户已连接的时间)时,PAM 可以联系到用户。虽然 mathilde 在允许的时间内连接,但完全可以超过这些时间!为此,我们将使用一个新程序:“cron”。此应用程序以时间间隔执行命令。在我们的例子中,我们将使用命令“skill-KILL-u”在会话过期时断开用户连接。处理非常简单。只需编辑文件“/etc/crontab”。然后添加以下代码行:
Minute Hour Day * * (s) root skill -KILL -u User
和之前一样,用时间表和所需时间替换分钟字段。然后填写禁止的天数,或者直接输入星号 (*) 以表示一周中的所有天数。最后,将要阻止的登录帐户使用的字段更改为阻止,就大功告成了!
日子与工作不一样cron
!以下是此程序要使用的缩写列表:
mon : monday fri : friday
tue : tuesday sat : saturday
wed : wednesady sun : sunday
thu : thursday * : all hours
一些工作示例cron
(上一节中有时间示例)
jessica 可以在星期三下午 1:00 到 4:00 登录
-> 断开连接:星期二下午 4:00。
00 16 * root * wed skill -KILL -u jessica
mathilde 每天被允许在下午 1:20 至 3:20 和下午 4:00 至晚上 8:30 之间上网。
-> 断开连接:每天美国东部时间晚上 8:30 至下午 3:20。
20 15 * * * root skill -KILL -u mathilde
30 20 * * * root skill -KILL -u mathilde
Stone、Frank 和 Florian 可以在工作日下午 2:00 至下午 6:45 之间连接,周末下午 2:00 至晚上 10:15 之间连接
-> 断开连接(1):星期一、星期二、星期三、星期四和星期五,18:45。 -> 断开连接(2):星期六和星期日晚上 10:15。
45 18 * * mon,tue,wed,thu,fri root skill -KILL -u stone && skill -KILL -u franck && skill -KILL -u florian
15 22 * * sat,sun root skill -KILL -u stone && skill -KILL -u franck && skill -KILL -u florian
skill-KILL-u 命令会断开用户与 GUI 以及 TTY 的连接。它非常适合服务器管理员使用。但是,此命令是即时的,断开连接不会事先通知。因此,最好阻止相关计算机或网络的用户安装此设备!
可以在结束前几分钟阻止用户wall
启动命令cron
大体时间,将会显示在所有用户的终端上。
40 18 * * Mon,Tue,wed,thu,fri root echo "end of session in 5 minutes" | wall
notify-send
为了防止用户使用 GUI,可以使用软件包中的wall 命令代替libnotify-bin
40 18 * * Mon,Tue,wed,thu,fri stone DISPLAY=:0 notify-send "end of session in 5 minutes"
Ubuntu 11.10 用户的
我看到周围的用户在使用 Pam 时遇到了问题,而且我发现了很多相关的错误,那么原因是什么呢?很简单,Ubuntu 11.10 不再支持 GDM,新的显示管理器是 lightGDM,问题在于这个指令的存储位置,account required pam_time.so
我认为是错误/etc/pam.d/lightdm
的,/etc/pam.d/lightdm-autologin
但是怎么回事呢?
因此您可以检查以下 2 个 LightGdm 日志文件:
- /var/log/lightdm/lightdm.log
- /var/log/lightdm/x-0.log
或者在调试模式下运行 LightGdm:
LightDM——调试
或报告错误:
ubuntu 错误 lightdm
我报告了 Bug这里所以祈祷并等待吧……
答案2
时间Kpr
我想它有你需要的一切。限制每个用户每天的访问时间、简单的配置图形界面、一天内绕过的能力、添加一些“奖励时间”、通知用户剩余时间等。
项目页面是这里。他们还有一个适用于 ubuntu 的 PPA,您可以将其添加到您的软件源中:deb http://ppa.launchpad.net/timekpr-maintainers/ppa/ubuntu lucid main
。并通过软件中心或 CLI 安装:sudo apt-get install timekpr
。
答案3
如果你正在做某事,自动注销会让人非常沮丧。这是暴力的、残酷的、粗鲁的。而且不管你多大年纪。如果你只是沉迷于电脑,那是一种感觉;而当你在计时,并在你设法点击提交按钮或保存文档前 5 秒被踢出电脑,那感觉就完全不同了。我建议你考虑使用自动提醒,而不是自动踢出。这将教会你的孩子们互相尊重,并允许彼此自愿使用电脑。
甚至还有更轻松的选择。首先跟踪每个孩子使用电脑的时间,然后将收集到的数据提供给所有人,以便他们可以看到。单单是这个非常简单的事情(适用于互联网带宽消耗)就救了我一命,当时我在一个满是成年人的办公室里担任网络管理员。每台计算机的带宽使用情况的公开统计数据(仅是字节数,而不是去匿名化信息,如访问的网站列表等)将情况从“我——邪恶贪婪的管理员对抗他们——可怜的受虐办公室用户”变成了“伙计,你的下载量比我多 5 倍,真糟糕!”“对不起,我确实下载了,午休时我看了很多 YouTube,按照这种速度不会再看了”——我只是被排除在对抗场景之外。
答案4
我也遇到过这个问题。所以我编写了 kidtimer 脚本,它允许您定义使用时间和总数。该项目可以在 Github 上的以下位置找到:
安装和使用它的方法如下:
将代码复制并粘贴到名为 的文件中
kidtimer.install
。#!/bin/bash # Restrict kids computer access to specific hours and total time. # By: Michael Groves - grover66_at_gmail_dot_com #variables basedir="/usr/local/kidtimer" configdir="/etc/kidtimer" Cdate=`/bin/date | awk '{ print $2" "$3 }'` TUI=0 HOUR=`/bin/date +%H` DOW=`/bin/date +%u` WEEKEND="no" [ "$DOW" == "6" ] && WEEKEND="yes" [ "$DOW" == "7" ] && WEEKEND="yes" #arguments [ $# -eq 0 ] && TUI=1 [ $# -eq 1 ] && COMMAND=$1 [ $# -eq 2 ] && COMMAND=$1 && KID=$2 [ $# -eq 3 ] && COMMAND=$1 && KID=$2 && Time=$3 ################# Subroutines ################## ################################################ go_check_install () { if [ ! -e $basedir ]; then go_initialize fi } go_initialize () { /bin/mkdir -p $basedir/time /bin/mkdir -p $basedir/schedule /bin/cp $0 /usr/local/bin/kidtimer && chmod +x /usr/local/bin/kidtimer echo "0 * * * * root /usr/local/bin/kidtimer hourly" > /etc/cron.d/kidtimer echo "0 0 * * * root /usr/local/bin/kidtimer daily" >> /etc/cron.d/kidtimer echo "* * * * * root /usr/local/bin/kidtimer check" >> /etc/cron.d/kidtimer echo "@reboot root /usr/local/bin/kidtimer daily" >> /etc/cron.d/kidtimer echo "@reboot root /usr/local/bin/kidtimer hourly" >> /etc/cron.d/kidtimer /bin/mkdir $configdir /usr/bin/touch $configdir/kid.list go_create_message_files echo "Kidtimer is now installed. Run /usr/local/bin/kidtimer to configure." } go_create_message_files () { cat << EOF > $basedir/send5.sh #!/bin/bash Name=\$1 /bin/su -s /bin/bash -c 'DISPLAY=:0 /usr/bin/notify-send -i \ /usr/share/pixmaps/gnome-set-time.png "ALERT" \ "You will be logged out in 5 minutes."' \$Name EOF chmod +x $basedir/send5.sh cat << EOF > $basedir/send4.sh #!/bin/bash Name=\$1 /bin/su -s /bin/bash -c 'DISPLAY=:0 /usr/bin/notify-send -i \ /usr/share/pixmaps/gnome-set-time.png "ALERT" \ "You will be logged out in 4 minutes."' \$Name EOF chmod +x $basedir/send4.sh cat << EOF > $basedir/send3.sh #!/bin/bash Name=\$1 /bin/su -s /bin/bash -c 'DISPLAY=:0 /usr/bin/notify-send -i \ /usr/share/pixmaps/gnome-set-time.png "ALERT" \ "You will be logged out in 3 minutes."' \$Name EOF chmod +x $basedir/send3.sh cat << EOF > $basedir/send2.sh #!/bin/bash Name=$1 /bin/su -s /bin/bash -c 'DISPLAY=:0 /usr/bin/notify-send -i \ /usr/share/pixmaps/gnome-set-time.png "ALERT" \ "You will be logged out in 2 minutes."' \$Name EOF chmod +x $basedir/send2.sh cat << EOF > $basedir/send1.sh #!/bin/bash Name=\$1 /bin/su -s /bin/bash -c 'DISPLAY=:0 /usr/bin/notify-send -i \ /usr/share/pixmaps/gnome-set-time.png "ALERT" \ "You will be logged out in 1 minute."' \$Name EOF chmod +x $basedir/send1.sh cat << EOF > $basedir/logout.sh #!/bin/bash Name=\$1 /usr/bin/pkill -KILL -u \$Name rm -rf /tmp/kidtimer.shutdown.\$Name EOF chmod +x $basedir/logout.sh cat << EOF > $basedir/schedule/blank #hour weekday weekend (y/n) 00 n n 01 n n 02 n n 03 n n 04 n n 05 n n 06 n n 07 n n 08 y y 09 y y 10 y y 11 y y 12 y y 13 y y 14 y y 15 y y 16 y y 17 y y 18 y y 19 y y 20 n n 21 n n 22 n n 23 n n #minutes weekday weekend MAX 120 240 EOF } go_check () { for I in `cat $configdir/kid.list`; do /usr/bin/users | grep -q $I if [ $? -eq 0 ]; then if [ -e $basedir/time/$I.ttl ]; then C=`cat $basedir/time/$I.ttl` C=$((C + 1)) echo $C > $basedir/time/$I.ttl else echo 1 > $basedir/time/$I.ttl C=1 fi else go_clean_jobs $I exit 0 fi # check total time. W="no" [ $DOW -eq 6 ] && W="yes" [ $DOW -eq 7 ] && W="yes" [ "$W" == "no" ] && TIME_LIMIT=`cat $basedir/schedule/$I | grep ^MAX | awk '{ print $2 }'` [ "$W" == "yes" ] && TIME_LIMIT=`cat $basedir/schedule/$I | grep ^MAX | awk '{ print $3 }'` if [ $C -ge $TIME_LIMIT ]; then if [ ! -e /tmp/kidtimer.shutdown.$I ]; then /usr/bin/passwd $I -l go_logout $I fi fi done } go_clean_jobs () { K=$1 for I in `/usr/bin/atq | awk '{ print $1 }' | sort`; do /usr/bin/at -c $I | grep kidtimer | grep -q $K [ $? -eq 0 ] && /usr/bin/at -d $I done [ -e /tmp/kidtimer.shutdown.$K ] && rm -rf /tmp/kidtimer.shutdown.$K } go_daily () { for I in `cat $configdir/kid.list`; do ls -l $basedir/time/$I.ttl | grep -q "$Cdate" if [ ! $? -eq 0 ]; then echo "0" > $basedir/time/$I.ttl fi done } go_hourly () { if [ -s $configdir/kid.list ]; then for I in `cat $configdir/kid.list`; do if [ -e $basedir/schedule/$I ]; then [ "$WEEKEND" == "no" ] && TL=`cat $basedir/schedule/$I | grep ^MAX | awk '{ print $2 }'` [ "$WEEKEND" == "yes" ] && TL=`cat $basedir/schedule/$I | grep ^MAX | awk '{ print $3 }'` [ -e $basedir/time/$I.ttl ] && C=`cat $basedir/time/$I.ttl` [ $C -ge $TL ] && /usr/bin/passwd $I -l && exit 0 [ "$WEEKEND" == "no" ] && R=`grep ^$HOUR $basedir/schedule/$I | awk '{ print $2 }'` [ "$WEEKEND" == "yes" ] && R=`grep ^$HOUR $basedir/schedule/$I | awk '{ print $3 }'` if [ "$R" == "y" ]; then /usr/bin/passwd $I -u else /usr/bin/passwd $I -l /usr/bin/users | grep -q $I && /usr/local/bin/kidtimer shutdown $I fi fi done fi } go_logout () { K=$1 echo "$basedir/send5.sh $K" | at now + 1 minutes echo "$basedir/send4.sh $K" | at now + 2 minutes echo "$basedir/send3.sh $K" | at now + 3 minutes echo "$basedir/send2.sh $K" | at now + 4 minutes echo "$basedir/send1.sh $K" | at now + 5 minutes echo "$basedir/logout.sh $K" | at now + 6 minutes touch /tmp/kidtimer.shutdown.$K } go_addtime () { U=$KID A=$Time if [ "$KID" == "reset" ]; then echo "0" > $basedir/time/$U.ttl echo "Done." exit 0 elif [ "$KID" == "" ]; then echo "Error." echo "Syntax: addtime <user> <minutes|reset>" exit 1 else C=`cat $basedir/time/$KID.ttl` C=$((C - Time)) echo $C > $basedir/time/$KID.ttl echo "New total minutes is "$C"." echo "Done." fi /usr/bin/passwd $KID -u } go_tui () { go_command_list echo -n "Choose: "; read -e X case "$X" in 1) go_setup_user ;; 2) go_modify_user ;; 3) go_remove_user ;; 4) go_list_users ;; 5) exit 0 ;; esac go_tui } go_command_list () { echo echo "1) Setup user limits." echo "2) Modify user limits." echo "3) Remove user limits." echo "4) List configured users." echo "5) Quit." echo } go_list_users () { echo echo "Users configured for kidtimer:" if [ -s $configdir/kid.list ]; then cat $configdir/kid.list else echo "No configured users." fi } go_setup_user () { echo echo -n "Username: "; read -e U /usr/bin/id $U > /dev/null 2>&1 if [ $? -eq 0 ]; then /bin/cp $basedir/schedule/blank $basedir/schedule/$U echo "0" > $basedir/time/$U.ttl echo $U >> $configdir/kid.list echo "Done." echo echo -n "Modify limits now ?(y/n): "; read -e M if [ "$M" == "y" ]; then if [ -e /usr/bin/nano ]; then /usr/bin/nano $basedir/schedule/$U echo "Done." else /usr/bin/vi $basedir/schedule/$U echo "Done." fi fi else echo "Error. User does not exist. Please create user using the useradd command first." fi } go_modify_user () { echo echo -n "Username: "; read -e U grep -q ^$U $configdir/kid.list if [ $? -eq 0 ]; then if [ -e /usr/bin/nano ]; then /usr/bin/nano $basedir/schedule/$U echo "Done." else /usr/bin/vi $basedir/schedule/$U echo "Done." fi else echo "Error. User not setup. Please setup user first." fi } go_remove_user () { echo echo -n "Username: "; read -e U grep -q ^$U $configdir/kid.list if [ $? -eq 0 ]; then grep -v ^$U $configdir/kid.list > /tmp/kidtimer.tmp cat /tmp/kidtimer.tmp > $configdir/kid.list echo "Done." else echo "Error. User is not setup." fi } go_help () { echo echo "Commands:" echo "--------------------------------------------------------------------------------" echo "addtime <user> <minutes> ... Increases allowed time for the day." echo "logout <user> ... Starts logout sequence for user." echo "hourly ... Enables/disables user access based on the schedule." echo "daily ... Resets time for the new day." echo "help ... This list." echo "--------------------------------------------------------------------------------" } ###################### Code #################### ################################################ go_check_install [ $TUI -eq 1 ] && go_tui case "$COMMAND" in addtime) go_addtime ;; logout) go_logout $KID ;; initialize) go_initialize ;; hourly) go_hourly ;; daily) go_daily ;; check) go_check ;; -h) go_help ;; help) go_help ;; esac exit 0
执行它:
sudo ./kidtimer.install
运行:
sudo kidtimer
设置现有用户帐户。
完毕。
求助:
sudo kidtimer help
将时间添加到用户帐户(仅限当天):
sudo kidtimer addtime user minutes
特征:
- 允许您的孩子在一天中的特定时间(包括工作日和周末)使用电脑。
- 设置最长时间,包括工作日和周末。
关键文件:
/etc/kidtimer/kid.list
/etc/cron.d/kidtimer
/usr/local/kidtimer/schedule/<user>
/usr/local/kidtimer/time/<user>.ttl
/usr/local/bin/kidtimer
Cronjobs:
- 每分钟检查一次用户是否已登录。如果已登录,则增加总时间。如果已达到最大时间,则禁用帐户并启动注销序列(总共 5 分钟)。
- 每小时检查一次用户是否被允许登录。如果允许,则启用帐户。
- 午夜时分,重置时间。
笔记:
该应用程序用于notify-send
提醒用户时间即将用完。时间用完时,所有用户进程都将终止,因此请用户做好准备。