如何用shell脚本监控别人 参考小脚本

一、为什么要学习script命令
当你在终端或控制台上工作时,你想记录下自己做了些什么吗?当你跟一些Linux管理员同时在系统上干活,你想知道别人干了什么吗?当你让别人远程到你的服务器,帮你解决问题时,你想学习别人的经验吗?当你怀疑你的同事时,你想监控他干了什么吗?或者想实现学生作业的完成证明,两人远程或者说异台电脑的同步指导操作, 那么,你就可以使用script命令。

二、 什么是script命令
script 是一个神奇命令,可以使用script工具记录用户在当前终端的所有的操作,已经输出到屏幕的内容。将这些信息保存到指定的文本文件中。 也就是说,script命令在你需要记录或者存档终端活动时可能很有用,记录文件会存储为文本文件,所以可以很方便地用文本编辑器打开。 在使用script命令将终端的会话过程录制下来之后,可以使用 scriptreplay将其录制的结果播放给他人观看。 script 的好处就在于你在终端中的所有操作、敲过的命令和打印出的结果它都可以原原本本地进行录制。可以应用于教学、演示、审计。

三、script命令的基本用法操作
选项:
-a, --append 附加输出
-c, --command 运行命令而不是交互式shell
-e, --return 返回子进程的退出代码
-f, --flush 每次写入后运行flush–force 使用输出文件,即使它是一个链接
-q, --quiet 可以使script命令以静默模式运行-t, --timing[=] 指明输出录制的时间数据
-V, --version 输出版本信息并退出
-h, --help
显示此帮助并退出终端会话录制。

script -t 2>demo.time -a demo.his
#开始录像,ctrl+d或者exit结束2> 完整输出demo.time 对时间线的记录demo.his
对操作命令等内容的记录scriptreplay demo.time demo.his

四、实例,玩转script
1.情景一:自己想记录自己输入的命令,用于教学或者想实现学生作业的完成证明
##开始录像,直接输入命令回车就好,其中-t用于存储时序文件,这里导入到stderr,再重定向到test.time中,-q表示静默的方式,-a追加到test.his中,-f除了看视频回放还可以看日志,主要用于教学
##注意事项:必须是以exit 和ctrl+d结束,不然就会破坏时间线的记录,那只能看日志记录

[root@localhost]# script -t 2>test.time -q -a -f test.his

##回放视频,通过ls可以查看有两个文件

[root@localhost ]# ls
test.his test.time

##回放视频,test.time 对时间线的记录,test.his 对操作命令等内容的记录,而且这两个文件很小,可以拷贝到需要播放的机器上进行播放。

[root@localhost]# scriptreplay test.time test.his
##也可以查看日志记录
[root@localhost ]# cat test.his

2.情景二:想知道你的同事在做什么
##在对方家目录.bash_profile文件中加上下面内容,有些人会说我可以看他家目录的.history文件啊,但注意这个文件只要不是正常下线的都不会记录,而且只能看命令,不能看命令输出结果,就是回显

##变量是定义文件存放的位置和每次时间,并且只要他一登陆就会自动录像,exec就是防止他发现kill掉自己的进程,只要kill掉,他的终端就会掉线

m_path1=/data/mon/`date +%F-%H:%M`.time
m_path2=/data/mon/`date +%F-%H:%M`.his
exec script -t 2>$m_path1 -a -f -q $m_path2

3.情景三:我想实现想监控谁就监控谁,不想监控就取消,那说的就是下面这个脚本啦
#!/bin/bash

read -p "请输入你要录像的用户:" user
##判断用户是否存在,如果不存在则退出
id $user &>/dev/null
if [ $? -ne 0 ]
then
echo "$user不存在"
exit 1
fi
##判断用户是否已经被录像
m_user(){
    
    
        path="/home/$user/.bash_profile"
        num=`cat $path |grep '\<script\>' |wc -l`
        if [ $num -eq 1 ]
        then
                echo "$user已经被录像"
                   exit
        fi
}
##对用户实施录像
m_mon(){
    
    
        path="/home/$user/.bash_profile"
        chattr +a $path
        echo "m_path1=/data/mon/\`date +%F-%H:%M\`.time" >>$path
        echo "m_path2=/data/mon/\`date +%F-%H:%M\`.his" >>$path
        echo "script -t 2>\$m_path1 -a -f -q \$m_path2" >> $path
        echo "正在实施录像....."
        }
##取消录像
m_cancael(){
    
    
        path="/home/$user/.bash_profile"
        chattr -a $path
        sed -i '/\<script\>/{d}' $path
        sed -i '/\<m_path1\>/{d}' $path
        sed -i '/\<m_path2\>/{d}' $path
        sed -i '/\<'$user'\>/{d}' /root/mon_user.txt
        echo "正在实施取消录像....."
 read -p "实施录像请按:y 取消录像请按:n 查询被录像用户请按q:" yes
case $yes in
y)
m_user
m_mon
echo "$user" >> /root/mon_user.txt
;;
n)
m_cancael
;;
q)
cat /root/mon_user.txt
;;
*)
echo "error:input error"
exit 1
esac

猜你喜欢

转载自blog.csdn.net/weixin_50764555/article/details/114069859