可怜的小家伙们哪,连暑假都不得舒心 [好文,赞]

可怜的小家伙们哪,连暑假都不得舒心

转载: http://tieba.baidu.com/p/2493185219?pid=36295911662&cid=#36295911662

作者: http://tieba.baidu.com/home/main?un=mephistohk&fr=pb


假设用户使用 bash。当用户登录时,bash 会去执行 /etc/profile 中的内容。这种机制使得系统管理员可以为所有用户提供共享的的配置,大大方便了系统管理。为了锁定帐户,管理员可以在 /etc/profile 中用 at 命令设置计划任务。时间一到便强制退出。同时采用 passwd -l 来锁定帐户。等过了今天后再用 passwd -u 来解锁帐户。

问题是此时 bash 是通过用户本身的权限去执行 /etc/profile 中的内容。也就是说,用户虽然没有权限去修改 /etc/profile 中的内容,但却有机会终止执行 /etc/profile 中的内容(飞快地按 CTRL-C 或 CTRL-BREAK)。一旦用户掌握了这种诀窍,他们就有机会绕过 /etc/profile 里面的种种设置。如果用户懂一点 at 命令系列的使用方式,他们甚至可以用 atrm 将预设的计划任务取消,令这种机制形同虚设(可别小看“熊孩子”们,现在的小家伙们聪明着呢。我那可爱的外甥女就曾经让我吃过这个苦头。当时她居然找到办法绕过了对她帐户设置的限制,用她的笔记本电脑偷偷打开了我书房的门锁,半夜溜进去看动漫看到天亮。要不是所有的操作 atlantis 都会记录下来,第二天就导致她“罪行败露”,差点就阴沟里翻了船)。所以,通过 /etc/profile 来设置帐户锁定并不可靠。

下面提供一种利用 linux 的 CRON 机制来监测、锁定、解锁帐户的方法。该脚本以 root 帐户执行,因此普通用户既无法修改也无法终止。可以有效地执行监测任务。不过我只是信手写了一下,只草草调试了一遍,LZ 使用的话再进一步调试一下为好。

#!/bin/bash

#
# 为保持缩进,脚本中使用了部分全角的控制,使用时可通过文本编辑器将之替换为两个空格即可
# 使用时应注意为脚本设置可执行权限,例如:chmod 744 /root/lifttime
#

#
# 创建 /etc/cron.d/lifttime 文件
#
# 添加以下记录:
#
# 0-59 * * * * root /root/lifttime
#
# 根据该设置 cron 进程会每分钟执行 1 次 /root/lifttime 脚本
#
#

#
# 供脚本记录日期,仅记录“日”[01-31]即可。
#
# 该文件由脚本自动创建,使用者无需关注
#
w_timefile=/var/tmp/timefile

#
# 创建 /root/user 文件 记录被控制的帐号,每行一个帐户名称
#
# 为简单起见这里没有考虑某些帐户名称整包含其它帐户名称的特殊情况,但这不难避免
#
w_accountfile=/root/user

#
# 帐户可用时间,以分钟为单位。缺省设置为 30 分钟后锁定
#
w_lifttime=30

#
# 被锁定的帐户需要到明日才能解锁
#
if [ -f $w_timefile ]; then
  w_stm=`cat $w_timefile`
  w_etm=`date +%d`
  if [ $w_etm -ne $w_stm ]; then
# 比对日期后为所有被控制的帐户解锁
cat $w_accountfile | while read w_user
do
  passwd -u $w_user  
done
# 记录当天的日期以供明日以后解锁时比对
date "+%d" > $w_timefile
  fi
else
# 创建日期文件
  date "+%d" > $w_timefile
fi

#
# 获取 who 命令显示的用户登录时间,并与当前时间比对来确定是否需要锁定
#
who |while read line
do
  w_name=`echo $line | cut -d' ' -f1`
  if [ `grep $w_name $w_accountfile` ]; then
# 获取用户登录时间
w_date=`echo $line | cut -d' ' -f3-4`
# 获取当前时间
w_stm=`date -d "$w_date" +%s`
# 用户登录时间 + 帐户可用时间即为锁定时间
w_stm=$((w_stm + w_lifttime))
# 获取当前时间
w_etm=`date +%s`

# 当前时间超过锁定时间即执行锁定
if [ $w_etm -gt $w_stm ]; then
#
# 这里需要注意,由于 pkill 在终止进程时并不一定会从登录 shell 进程开始有序进行,
#  因此有时会造成 XServer 无法安全终止导致图形界面死锁。
#  解决的方法是从用户登录 shell 开始终止,这样 unix 进程管理系统会尽可能保证
#  有序地终止全部用户进程。
#

# 从 /etc/passwd 中获取用户登录 shell,以确保 shell 进程首先收到终止信号
  w_shell=`grep ^$w_name: /etc/passwd | cut -d":" -f7`
  w_shell=`basename $w_shell`
# 终止用户 shell 进程
  pkill -9 -u $w_name $w_shell
# 锁定帐户,直到过了今天后被前面的代码解锁
  passwd -l $w_name
fi
  fi
done

不过现在毕竟是暑假,小家伙们适当玩玩也不是坏事,我看是不是能多给他们点时间。或者把这个脚本改进一下,将帐户文件(w_accountfile)的功能扩展一下,添加一个锁定时长项,为每个帐户分别设置锁定时间。这样表现良好的小家伙就多给点时间,表现有待提高的那就只好先委屈他们一下了。这样你这个长辈也更容易在小家伙们面前提高威信不是。


你可能感兴趣的:(知识&技巧,Linux,五味杂陈)