crontab 备份crontab任务
背景
很多时候crontab操作误删,或者其他原因导致crontab执行脚本丢失,需要对crontab任务进行备份。
先简介一下crontab命令man crontab
crontab -l 列举 crontab 的任务
crontab -e 编辑 crontab 的任务
crontab -r 删除crontab 的任务;风险
crontab -h crontab 的帮助
crontab -i 删除 crontab 前进行提示
crontab -u 选择crontab 用户
防止crontab 任务被删的方式
策略1:每天备份
- 单机单用户备份
备份脚本crontab_schedule_bak.sh
#!/bin/bash
crontab -l > ~/crontab_bak/cron_schedule_`date '+%Y%m%d'`.bak
增加调度crontab -e
00 00 * * /bin/bash ~/crontab_bak/crontab_bak.sh
- 单机多用户备份
备份脚本crontab_schedule_bak.sh
#!/bin/bash
# 目录与文件
cron_schedule_bak_file_name=/opt/shell_scripts/cron_schedule_bak_data/cron_schedule_`date '+%Y%m%d'`.bak
# 初始化
echo '' > $cron_schedule_bak_file_name
# 写入备份数据
grep -vE "nologin|false" /etc/passwd | cut -d: -f1 | xargs -I {} sudo sh -c "echo 'Username: {}' && crontab -u {} -l" ' >> $cron_schedule_bak_file_name
## grep cut 可替换成 cat awk 如下
# sudo cat /etc/passwd | awk -F: '{if($7!="/sbin/nologin" && $7!="/usr/sbin/nologin") print $1;}' | xargs -I {} sudo sh -c "echo 'Username: {}' && crontab -u {} -l" >> $cron_schedule_bak_file_name
修改脚本 chmod 744 crontab_schedule_bak.sh
增加调度crontab -e
# 需root用户
00 00 * * nohup /opt/shell_scripts/crontab_schedule_bak.sh > /opt/shell_scripts/crontab_schedule_bak_datea/$(date +\%Y-\%m-\%d)_crontab_schedule_bak.log 2>&1 &
- 多机多用户备份
备份脚本crontab_schedule_bak.sh
#!/bin/bash
# 目录与文件
cron_schedule_bak_file_name=/opt/shell_scripts/cron_schedule_bak_data/cron_schedule_`date '+%Y%m%d'`.bak
# host list,需root用户,同时需免密登录
host_list=(cron01 cron02 cron03 cron04)
# 初始化
echo '' > $cron_schedule_bak_file_name
for host_addr in ${host_list[@]}
do
seg_str="==== $host_addr ===="
echo $seg_str
echo $seg_str >> $cron_schedule_bak_file_name
ssh $host_addr 'grep -vE "nologin|false" /etc/passwd | cut -d: -f1 | xargs -I {} sudo sh -c "echo \\'Username: {}\\' && crontab -u {} -l" ' >> $cron_schedule_bak_file_name
done
修改脚本 chmod 744 crontab_schedule_bak.sh
增加调度crontab -e
00 00 * * nohup /opt/shell_scripts/crontab_schedule_bak.sh > /opt/shell_scripts/crontab_schedule_bak_datea/$(date +\%Y-\%m-\%d)_crontab_schedule_bak.log 2>&1 &
策略2:操作crontab -e / -r / -i 备份
每次操作 crontab -e / -r / -i 时,备份文件
步骤:
- 创建自动以的cron脚本,
- 替换crontab 命令,指向自定义脚本
- 创建 cron.sh脚本,
vi /usr/bin/cron.sh
#!/bin/bash
source ~/.bashrc
etime=`date -d "0 days ago" +%Y%m%d_%H%M%S`
# 禁用 -r
if [ "$1" = "-r" ] ; then
echo "delete disable..."
echo "Exit..."
exit 2
fi
if [ "$1" = "-l" ] ; then
/usr/bin/crontab -l
exit 0
fi
if [ "$1" = "-e" ] ; then
# 每次编辑都备份cron列表到~/cronbak目录下面 ,可以对目录进行判断
if [ ! -d "~/cron_bak"];then
mkdir -p ~/cron_bak
fi
/usr/bin/crontab -l > ~/cron_bak/cron.bak.$etime.a
/usr/bin/crontab -e
/usr/bin/crontab -l > ~/cron_bak/cron.bak.$etime.b
fi
- 赋权
chmod 755 cron.sh
- 在/etc/bashrc文件末尾添加
alias crontab='/usr/bin/cron.sh'
或者在当前root用户下在~/.bashrc文件末尾添加:alias crontab='/usr/bin/cron.sh'
其他防止删除方案
Linux禁止普通用户使用crontab命令
cron计划任务默认root用户与非root用户都可以执行,当然如果在安全方面想禁用这部分用户,则可以> 通过两个文件来解决:
cron.allow:定义允许使用crontab命令的用户
cron.deny:定义拒绝使用crontab命令的用户
这两个文件有优先级,普通用户在执行crontab命令的时候
- 系统先检测cron.allow文件是否存在;如果存在,则检测文件中存在的用户中是否有当前用户,检测通过则开始执行,检测不通过直接提示该用户没有执行权限
- 当系统没有检测到cron.allow文件存在的时候,则接下来检测cron.deny文件,看当前用户是否被deny掉,如果没有在cron.deny文件中检测到当前运行crontab的用户,则该命令可以成功执行,如果有检测到该用户在cron.deny文件中,则直接提示该用户没有执行权限
案例1:只允许root和www用户执行crontab命令,其他用户则禁止执行
在需要定义该策略的主机上面执行:
echo “www” > /etc/cron.allow
案例2:只拒绝anonymous用户执行crontab命令,其他用户都可以执行该命令:
rm -f /etc/cron.allow
echo “anonymous” > /etc/cron.deny