获取主机上的活跃用户

下面是编程之家 jb51.cc 通过网络收集整理的代码片段。

编程之家小编现在分享给大家,也给大家做个参考。

#!/bin/bash
# 用途:查找活跃用户
# last 命令浏览/var/log/wtmp文件获取用户登录信息;
# 最后一个字段时用户登录时长,格式为:(天+小时:分钟),如果用户在先,则是still logged in
# 因此在获取用户信息剔掉在线用户,获取时间用tr -d去掉()

#set -x   #调试时去掉注释

LOG_FILE=/var/log/wtmp
if [[ -n $1 ]];
then
	LOG_FILE=$1
fi

TMP_ULOG=/tmp/ulog.$$
TMP_USERS=/tmp/users.$$
TMP_USERINFO=/tmp/userinfo.$$
SECONDS_OF_ONE_DAY=86400  #60 * 60 * 24
TMP_0_SECONDS="00:00"  #在线时长为0
USER_ONLINE_TIME_TMP_FILE=/tmp/user_online_time.txt #用户在线时间临时纪录文件

printf "%-4s %-10s %-10s %-6s %-8s\n" "Rank" "User" "Start" "Logins" "Usage hours";
#获取所有用户登入信息,剔除last命令显示的最后两行无关信息,并剔除掉reboot用户纪录
last -f $LOG_FILE | head -n -2 | grep -v reboot | grep -v 'still logged in' > $TMP_ULOG 
#获取所有登陆用户,剔重,作为循环条件
cat $TMP_ULOG | cut -d ' ' -f1 | sort | uniq > $TMP_USERS 
(
while read USER;
do
	grep ^$USER $TMP_ULOG > $TMP_USERINFO   #纪录用户所有登录信息的临时文件
	
	SECONDS=0
	while read USER_ONLINE_TIME;
	do
		if [ "$USER_ONLINE_TIME" != "$TMP_0_SECONDS" ];
		then
			echo $USER_ONLINE_TIME > $USER_ONLINE_TIME_TMP_FILE
			CHECK_ONLINE_DAY=`grep '+' $USER_ONLINE_TIME_TMP_FILE | wc -l`
			if [ $CHECK_ONLINE_DAY -gt 0 ];  #获取用户在线天数
			then
				COUNT_ONLINE_DAY=$(echo $USER_ONLINE_TIME | cut -d '+' -f1)
				ONLINE_DAY_SECONDS=`expr $SECONDS_OF_ONE_DAY \* $COUNT_ONLINE_DAY`
				USER_ONLINE_TIME=$(echo $USER_ONLINE_TIME | cut -d '+' -f1)
			else
				ONLINE_DAY_SECONDS=0
			fi

			TMP_SECONDS=$(date -d $USER_ONLINE_TIME +%s 2> /dev/null)
			SECONDS_0=$(date -d $TMP_0_SECONDS +%s 2> /dev/null)
			let TMP_SECONDS=TMP_SECONDS-SECONDS_0  #去掉取秒时的基准数
			let TMP_SECONDS=TMP_SECONDS+ONLINE_DAY_SECONDS
			let SECONDS=SECONDS+TMP_SECONDS
		fi
	done < <(cat $TMP_USERINFO | awk '{print $NF}' | tr -d ')(')

    #获取用户最早登陆时间,具体取第几列字段,要看具体环境
	FIRST_LOG=$(tail -n 1 $TMP_USERINFO | awk '{print $5,$6}') 
	NLOGINS=$(cat $TMP_USERINFO | wc -l)
	HOURS=$(echo "$SECONDS / 60.0" | bc)
	printf "%-10s %-10s %-6s %-8s\n" "$USER" "$FIRST_LOG" "$NLOGINS" "$HOURS"
done < $TMP_USERS
) | sort -nrk 4 | awk '{printf("%-4s %s\n",NR,$0)}' #以总登陆时间做逆序排序,并行首添加序号

rm $TMP_USERS $TMP_USERINFO $TMP_ULOG

以上是编程之家(jb51.cc)为你收集整理的全部代码内容,希望文章能够帮你解决所遇到的程序开发问题。

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

相关文章

系ubuntu 下面打开终端输入:sudo apt-get install sendmail...
依家我有1个软件goagent目录(大家懂得) 放在/home/gateman/...
其实我想讲的是 cp -L关于-L参数的解释:-L, --dereferenc...
原地址:http://www.rjgc.net/control/content/content.php?...
chroot,即 change root directory (更改 root 目录)。在 li...
简单解析下, stdin就是标准输入, stdout就是标准。举个例子...