加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

获取主机上的活跃用户

发布时间:2020-12-15 07:07:42 所属栏目:安全 来源:网络整理
导读:今天PHP站长网 52php.cn把收集自互联网的代码分享给大家,仅供参考。 #!/bin/bash# 用途:查找活跃用户# last 命令浏览/var/log/wtmp文件获取用户登录信息;# 最后一个字段时用户登录时长,格式为:(天+小时:分钟),

以下代码由PHP站长网 52php.cn收集自互联网

现在PHP站长网小编把它分享给大家,仅供参考

#!/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 %-8sn" "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 %-8sn" "$USER" "$FIRST_LOG" "$NLOGINS" "$HOURS"
done < $TMP_USERS
) | sort -nrk 4 | awk '{printf("%-4s %sn",NR,$0)}' #以总登陆时间做逆序排序,并行首添加序号

rm $TMP_USERS $TMP_USERINFO $TMP_ULOG

以上内容由PHP站长网【52php.cn】收集整理供大家参考研究

如果以上内容对您有帮助,欢迎收藏、点赞、推荐、分享。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读