自己写的一个脚本,他的作用是根据你的配置文件来决定如何将远程登陆你

系统的用户踢出你的系统.可以手动设置执行的次数,每次执行的时间,哪些主机

哪些用户不踢出.


脚本内容如下(分为两个文件:(1).配置文件 (2).主要的脚本文件

#下面是配置文件的内容
#文件名:force_logout.conf
#########################################################
#Configure File 
#配置允许登陆的主机,一个主机一行
allow_hosts=$(cat <<"EOF"
   192.168.1.12
	
EOF
)
#配置允许登陆的用户,一个用户一行
allow_users=$(cat <<"EOF"
root
EOF
)
#配置该命令执行的间隔时间,和该命令执行的次数
#执行的总时间:count*every_time(danwei)
#时间单位,可能的值有s(秒),m(分),h(小时),d(天)
DANWEI=s
#间隔时间,默认为60s
EVERY_TIME=2
#执行的总次数,设置为0表示执行无数次
COUNT=0
################################################################
#下面是主要脚本文件
#文件名:force_logout.sh
#!/bin/bash
#
#Author:huangyandong
#Web:http://huangyandong.blog.51cto.com/
#Date:2011/10/15
#

#加载配置文件 if [ -r force_logout.conf ];then . force_logout.conf fi #设置变量 ALLOW_HOST_LIST="$allow_hosts" ALLOW_USER_LIST="$allow_users"
#下面的变量为默认允许的本地登陆主机列表
default_allow_hosts=":0 :0.0 -" #函数定义 #强制主机host上的用户user(若没指定用户则所有该主机全踢出)退出系统 #用法: force_logout host [user] force_logout() { local host="$1" local user="$2" local ttys=$(w|grep "$host" | grep "$user"|gawk '{print $2}') for everytty in $ttys ;do pkill -9 -t $everytty done } #根据主机来查找用户,返回一个用户列表字符串 #Usage:find_users host find_users() { local host="$1" local users=$(w|grep "$host"|gawk '{print $1}') echo $users } #判断一个字符串是否在一个以空格分割的字符串数组中,返回yes(存在)或者no(不存在) #Usage:if_exists substr string if_exists() { local isexists=no local substr="$1" local string="$2" for i in $string;do if [ "$substr" == "$i" ];then isexists=yes break; fi done echo $isexists } #主函数 main() { #若没设置变量ALLOW_HOST_LIST ,则将它设置为$defualt_allow_hosts #否则将$default_allow_hosts指定的主机追加到变量ALLOW_HOST_LIST上 if [ -z "$ALLOW_HOST_LIST" ];then #设置默认允许的主机列表 ALLOW_HOST_LIST="$default_allow_hosts" else ALLOW_HOST_LIST="$ALLOW_HOST_LIST $default_allow_hosts" fi #使用w命令来得到当前主机中的所有登陆系统的主机 hosts="$(w|sed -n '3,$p'|gawk '{print $3}')" #循环判断当前系统的主机是否被允许登录 for every_host in $hosts ;do unset IsNotLogout IsNotLogout=$(if_exists "$every_host" "$ALLOW_HOST_LIST") if [ $IsNotLogout == "no" ];then #表示允许强制退出 if [ -n "$ALLOW_USER_LIST" ];then #获取当前主机中所有登录的用户名列表 host_users=$(find_users "$every_host") for every_user in $host_users ;do isnot=$(if_exists "$every_user" "$ALLOW_USER_LIST") if [ $isnot == "no" ];then force_logout "$every_host" "$every_user" break; fi done else force_logout "$every_host" fi fi done } #循环执行 circle_exec() { local second="$1" local cmd="$2" case $second in 0) #无限循环执行 while true ;do eval $cmd && sleep ${EVERY_TIME}${DANWEI} done ;; *) for (( i=1 ; i <= $second ; i=${i}+1 ));do eval $cmd && sleep ${EVERY_TIME}${DANWEI} done ;; esac } circle_exec $COUNT main