使用shell脚本恢复修改文件的时间戳
标签:Linux
Shell
脚本
文件对于Linux系统来说是一个非常关键的概念,我们在linux系统上的操作其实也就是对各种文件的操作。linux系统会自动地记录每个文件的时间戳,以帮助管理者迅速找出被篡改的文件从而更好地管理系统,保证系统的正常运作。这篇文章可以算作是我在看完使用shell脚本掩盖linux服务器的操作痕迹一文后的笔记,那里面详细讲解了脚本的编辑过程和一些很有价值的内容,所以在接下来的阅读之前请一定先阅读一下上述文章,本文也只是在对待文本处理的方式上提出了自己的一些思考。
1、先看看脚本
#!/bin/bash
if [ $# -eq 0 ]; then
echo "Use -s parameter to save And -r parmeter to restore."
exit 1
fi
if [ $1 = '-s' ]; then
rm -f ./timestamps;
/bin/ls -l --time-style="+%F %H:%M:%S" |tr -s ' '|cut -d' ' -f 6-|sed '/^$/d' > timestamps;
fi
if [ $1 = '-r' ]; then
cat ./timestamps |while read line
do
DAY=$(echo $line |cut -d' ' -f1);
TIME=$(echo $line |cut -d' ' -f2);
FILENAME=$(echo $line |cut -d' ' -f3);
touch -d "$DAY $TIME" $FILENAME;
rm -f ./timestamps;
done
2、再看看其中比较关键的地方
首先,这里使用了ls -l --time-style="+%F %H:%M:%S"
代替上述文章中ls -l
来获取当前目录文件信息的做法。其中ls
命令的长选项--time-style
起了至关重要的作用,可以按照我们想要的时间格式输出文件的时间戳信息,这里我们直接将其设置成符合touch -d "yyyy-mm-dd HH:MM:SS"
中的时间格式,省去了仅仅使用ls -l
输出后对于时间格式大量的替换操作,而且不用担心系统字符编码的问题。可以看看上述文章对于时间格式的设置上采用了大量重复的替换工作。
3、其他的一些细节
其中tr -s ' '
用于删除一行文本中重复出现的空格符,' '
可以替换成其他满足要求的符号,因为ls -l --time-style="+%F %H:%M:%S"
的输出中有的行会出现重复的空格符,所以这里我们在-s
选项后加' '
。sed '/^$/d'
用于删除其中的空白行,使用grep -v '^$'
和awk'!/^$/'
等也能达到相同的目的。
4、试验一下
我们知道计划任务服务crond是非常有用的一个服务,其主要的配置文件为位在于/etc目录下的crontab文件,先来看看它现在的时间戳信息:
>/etc
># ls crontab -l --time-style="+%F %H:%M:%S"
-rw-r--r-- 1 root root 722 2016-04-06 05:59:09 crontab
先执行下脚本,保存当前目录下所有文件的时间戳信息
># ls time* -l
-rw-r--r-- 1 root root 14 11月 30 23:19 timezone
># ./timestamps.sh -s
># ls time* -l
-rw-r--r-- 1 root root 7063 12月 12 23:29 timestamps
-rw-r--r-- 1 root root 14 11月 30 23:19 timezone
可以看到timestamps文件已经创建好了,看一下其中的一些内容:
># cat timestamps |grep -w -C 2 crontab
2017-04-12 11:07:26 cron.hourly
2017-04-12 11:12:15 cron.monthly
2016-04-06 05:59:09 crontab
2017-12-03 23:27:10 cron.weekly
2017-12-08 10:40:41 cups
再touch一下,看下变化:
># touch crontab
># ls crontab -l --time-style="+%F %H:%M:%S"
-rw-r--r-- 1 root root 722 2017-12-11 13:52:22 crontab
我们注意到文件的修改时间已经改变。现在用find命令找出当前目录下24小时内修改过的文件:
># find -mtime 0
.
./timestamps
./crontab
如上我们找出了被修改过的文件。现在我们再次执行脚本,使其恢复文件时间戳:
># ./timestamps.sh -r
再次用find命令进行查找:
># find -mtime 0
.
将找不到任何改动过的文件,再看看crontab文件的时间戳:
># ls crontab -l --time-style="+%F %H:%M:%S"
-rw-r--r-- 1 root root 722 2016-04-06 05:59:09 crontab
可以看到文件时间戳已恢复。
声明:本实验环境为Ubuntu 17.04 zesty。另外,此脚本较为简陋,希望广大读者能自我改进,从中获益。^_^