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

转载 2013年12月04日 14:51:43

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

转载: 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)的功能扩展一下,添加一个锁定时长项,为每个帐户分别设置锁定时间。这样表现良好的小家伙就多给点时间,表现有待提高的那就只好先委屈他们一下了。这样你这个长辈也更容易在小家伙们面前提高威信不是。


相关文章推荐

各种好文狭包文件合并器

  • 2009年12月03日 15:13
  • 2.54MB
  • 下载

一天掌握DFT,绝对好文.pdf

  • 2009年06月25日 09:10
  • 209KB
  • 下载

菜鸟好文推荐(十五)——9个基于Java的搜索引擎框架

在这个信息相当繁杂的互联网时代,我们已经学会了如何利用搜索引擎这个强大的利器来找寻目标信息,比如你会在Google上搜索情人节如何讨女朋友欢心,你也会在百度上寻找正规的整容医疗机构(尽管有很大一部分广...

VC编程好文

  • 2008年07月02日 16:56
  • 4.11MB
  • 下载

推荐好文-非常详细的Python正则表达式指南

本文介绍了Python对于正则表达式的支持,包括正则表达式基础以及Python正则表达式标准库的完整介绍及使用示例。本文的内容不包括如何编写高效的正则表达式、如何优化正则表达式,这些主题请查看其他教程...

J2EE知识(真心收集好文)

  • 2015年05月27日 17:22
  • 13.53MB
  • 下载

绿色通信 journal 好文

  • 2014年08月15日 06:07
  • 304KB
  • 下载

Struts1与Struts2的区别和对比(深度好文)

本文介绍了Struts2的起源,详细对比了Struts2和Struts1.x的差异,并穿插概述了Struts2框架和请求流程。本文详细介绍了Struts1.x和Struts2两者之间在Action方面...

写论文和查资料相关的3篇好文

  • 2009年07月16日 13:26
  • 541KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:可怜的小家伙们哪,连暑假都不得舒心 [好文,赞]
举报原因:
原因补充:

(最多只允许输入30个字)