@TOC
07_Linux基础-计划任务-备份脚本-变量定义和使用
一. 计划任务
主要内容:周期性的计划任务crontab
==/var/spool/cron/ 统一存放计划任务的目录==
==/var/log/cron 日志文件==
==/etc/cron cron.daily/ cron.hourly/ cron.monthly/ cron.weekly/ crontab的顺风车==
/etc/crontab
==crontab -l==
==crontab -e==
crontab ==-u cali== -e
crontab -u cali -l
==如何知道计划任务是否执行?== ==用户没有登录,计划任务是否执行?答:会执行== ==黑客也会去利用计划任务定时执行程序,你如何去检查?== ==annacron 将电脑主机因为系统故障关机导致计划任务没有被执行,正常启动后,anacron会去检测没有执行的计划任何,重新执行一次==
at 一次性的计划任务
==at 11:45==
==at -l==
cron
计划任务
1.什么是计划任务? (闹钟) 计划什么时候去做什么事情
一次性的计划任务
at
周期性的计划任务
crontab
linux系统里的==执行计划任务的进程==--》==crond==
crond会==每分钟==去检查下所有用户的计划任务
\# ps aux|grep crond
root 887 0.0 0.1 36300 3508 ? Ss 9月24 0:00 /usr/sbin/==crond== -n
root 16948 0.0 0.0 12320 984 pts/0 S+ 10:05 0:00 grep --color=auto ==crond==
\# cd ==/var/spool/cron/ (注:统一存放计划任务的目录)==
\# ls
\#
计划任务 原理
原理 时间的格式和语法(笔试)
(注:每个用户都可以用的命令)
\# ==crontab -l (注:查看当前用户的计划任务)==(每个用户只能看自己的,root用户能看所有的)
no crontab for root
\#
\# ==crontab -e (注:创建计划任务)==
…… (注:vim编辑器 本质上是文本文件)
\# crontab -l
==30 4 *== bash /lianxi/9_25/backup_log.sh
==/5 *== bash /lianxi/9_25/backup_log.sh
==50 3 6-9 10 *== bash /lianxi/9_25/backup_log.sh
==*== 该范围内的任意时间
==,== 间隔的多个不连续时间点
==-== 一个连续的时间范围
==/n== 指定间隔的时间频率
==(注:crond进程 最低的时间间隔是1分钟)==
(注:时间不能冲突 日期和星期不能冲突)
\#
\# cd ==/var/spool/cron/ (注:统一存放计划任务的目录,一个用户对应一个文件名)==
\# ls
cali liangluyao ==root==
\# ==cat root (注:文件里面 就是cronta -e编辑的)==
30 4 * bash /lianxi/9_25/backup_log.sh
/5 * bash /lianxi/9_25/backup_log.sh
50 3 6-9 10 * bash /lianxi/9_25/backup_log.sh
\#
\# ll ==(注:每一个用户的计划任务都会放在/var/spool/cron/目录下)==
总用量 12
-rw-------. 1 ==cali== cali 31 9月 25 10:27 cali
-rw-------. 1 ==liangluyao== liangluyao 31 9月 25 10:28 liangluyao
-rw-------. 1 ==root== root 139 9月 25 10:25 root
\#
==问:如何知道计划任务是否执行?==
==答:看日志文件,/var/log/cron。==
==或者直接去看效果。==
\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=
日志文件==(注:记录crond执行的计划任务,存放在/var/log/cron,用来排错。)==
\# tail -f ==/var/log/cron== (注:tail -f 盯着文件末尾看)
Sep 25 10:30:01 sanchuang-linux CROND[17143]: (root) CMD (bash /lianxi/9_25/backup_log.sh)
Sep 25 10:30:01 sanchuang-linux CROND[17147]: (liangluyao) CMD (date >>~/liang.txt)
Sep 25 10:30:02 sanchuang-linux CROND[17119]: (root) CMDOUT (tar: 从成员名中删除开头的“/”)
Sep 25 10:30:02 sanchuang-linux CROND[17119]: (root) CMDOUT (tar: /var/log/audit/audit.log: 在我们读入文件时文件发生了变化)
Sep 25 10:30:02 sanchuang-linux CROND[17155]: (cali) CMD (date >>~/cali.txt)
示例1(root用户):
每天早上7:50自动开启sshd服务,22点50时关闭
==service sshd start (注:开启sshd服务)==
==service sshd stop (注:关闭sshd服务)==
50 7 * service sshd start
50 22 * service sshd stop
每隔5天的12点整==清空==一次FTP服务器公共目录/var/ftp/pub
0 12 /5 rm -rf /var/ftp/pub==/ (注:清空:删除里面所有东西)==
每周六的7:30时,==重新==启动httpd服务
==service httpd restart (注:重启httpd服务)==
30 7 6 service httpd restart
每周一、三、五的17:30时,打包备份/etc/httpd目录
30 17 1,3,5 tar czf /==backup==/httpd.tar.gz /etc/httpd ==(注:/backup/是备份目录)==
示例2(jerry用户): ==(注:宿主目录:~/)==
每周日晚上23:55时将“/etc/passwd”文件的内容复制到==宿主目录==中,保存为pwd.txt文件
55 23 0 ==/usr/bin/cp== /etc/passwd ~/pwd.txt ==(注:命令的绝对路径)==
/etc/crontab 是cron的一个配置文件
\# vim /etc/crontab
SHELL=/bin/bash (注:计划任务执行命令时用/bin/bash执行)
==PATH===/sbin:/bin:/usr/sbin:/usr/bin ==(注:它有自己的PATH变量,和shell的PATH变量不同)==
MAILTO=root ==(注:所有 计划任务里的命令,建议使用命令的绝对路径,因为PATH变量的问题)==
==(注↑:默认情况,计划任务出了问题,crontab会给root发邮件)==
\# For details see man 4 crontabs
\# Example of job definition: (注:对命令的解释)
\# .---------------- minute (0 - 59)
\# | .------------- hour (0 - 23)
\# | | .---------- day of month (1 - 31)
\# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
\# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
\# | | | | |
\# * user-name command to be executed
\# crontab ==-u cali== -e ==(注:用root用户为cali创建计划任务)==
\# crontab -u cali -l (注:查看)
1.电脑关机了计划任务是否执行?答:不执行
==2.用户没有登录,计划任务是否执行?答:会执行==
\# ==w (注:查看哪个用户从哪里登录)==
\# ==tail -f /var/log/cron (注:日志文件)==
==3.黑客也会去利用计划任务定时执行程序,你如何去检查?==
去==/var/spool/cron==目录下查看每一个计划任务文件 看日志 ==/var/log/cron== crontd的顺风车目录 (如下)
\#
\# ==cd /etc/cron*******==
cron.d/ ==cron.daily/== cron.deny ==cron.hourly/ cron.monthly/== crontab ==cron.weekly/==
\# cd /etc/cron
(注:crontab的顺风车)
==黑客也可以把需要执行的程序放到这些文件夹里==
==cron.daily --》Linux系统里要求crond每天去执行的事情==
==cron.hourly --》Linux系统里要求crond每小时去执行的事情==
==cron.monthly --》Linux系统里要求crond每月去执行的事情==
==cron.weekly --》Linux系统里要求crond每周去执行的事情==
(注:# ls cron.daily
logrotate (每天都会执行,crond每天运行一次(脚本,用sh执行)) \# ls cron.hourly 0==anacron (annacron 将电脑主机因为系统故障关机导致计划任务没有被执行,正常启动后,anacron会去检测没有执行的计划任何,重新执行一次)==
at
at 命令 一次性的计划任务
yum install at -y
\# ==at 11:45==
warning: commands will be executed using /bin/sh
at> touch $(date +%F).txt
at>
==(注:退出 Ctrl+D)== job 1 at Fri Sep 25 11:45:00 2020
Can't open /var/run/atd.pid to signal atd. No atd running?
\# ==at -l (注:查看)==
1 Fri Sep 25 11:45:00 2020 a root
\#
二. 计划任务练习-备份脚本
主要内容:==chmod 777== /opt/fnum.txt (注:==设置任何用户都可以对文件/opt/fnum.txt读写执行==)
==2>/dev/null==
==/dev/null 特殊的文件,相当于黑洞文件,任何的内容重定向到这个文件都会消失,不保存==
==正确的输出重定向==
==\>==
==\>>==
==错误的输出重定向==
==2>==
==2>> 追加==
==不管正确的还是错误的都往一个文件里重定向==
==&>==
==&>> 追加==
==\>1.txt 清空1.txt文件里的内容==
==删除xull这个用户所有的计划任务== rm -rf /var/spool/cron/xull
==\# crontab -u xull -r (注 *)==
取消计划任务
脚本+计划任务=自动化
先编写脚本,再创建计划任务
计划任务实验
计划任务实验:
1.为root用户编写计划任务:每周2、4、6的10点到17点的每隔5分钟自动将/etc/passwd、/etc/shadow这2个重要系统文件到user.备份的日期和时间.tar.gz这种名称的文件里(例如:user.201202011615.tar.gz)备份文件放到/opt/目录下面。
backup_shadow_pwd.sh
\# cat backup_shadow_pwd.sh
\#!/bin/bash
mkdir -p /opt #注:date +%Y%m%d%H%M%S , ==date后面有空格==
tar czf /opt/user.$(date +%Y%m%d%H%M%S).tar.gz /etc/passwd /etc/shadow
\# $(date +%Y-%m-%d-%H) 注意空格 上面的
==crontab -e==
/5 10-17 * 2,4,6 bash /lianxi/9_25/backup_shadow_pwd.sh #==(注:路径要接对,绝对路径)==
2.==root用户==在/opt==新建==了一个文件fnum.txt专门用来统计普通用户的文件个数。请==为普通用户hello编写计划任务==:要求每5分钟,将系统中属于hello用户的文件的个数自动保存到/opt/fnum.txt文件中。内容格式为:“日期时间 姓名 拥有的文件个数是:数目”。每行中间用“*************************”隔开
file_num.sh
\# touch /opt/fnum.txt (注:==新建空文件,普通用户建不了,root用户去建==)
\# ==chmod 777== /opt/fnum.txt (注:==设置任何用户都可以对文件/opt/fnum.txt读写执行==)
[cali@sanchuang-linux ~]$ crontab -l
/5 * date >>~/cali.txt
5 12-18 * date >>~/cali.txt
/1 * bash /home/cali/file_num.sh
[cali@sanchuang-linux ~]$ pwd
/home/cali
$ cat file_num.sh ==(注:脚本放在普通用户家目录里)==
\#!/bin/bash
fnum=$(find / -user cali -type f ==2>/dev/null== |wc -l) ==(注:普通用户 文件权限不够 是出错的)==
(注↑:错误重对象)
ctime=$(date +%F_%H%M%S)
echo "${ctime} cali the number of files : $fnum" ==>>/opt/fnum.txt (注:追加重定向 写到文件里去)==
echo "******************************" ==>>/opt/fnum.txt (注:追加重定向 写到文件里去)==
$
$ crontab -e ==(注:是哪个用户就哪个用户创建计划任务,==cali创建)
/1 * bash /home/cali/file_num.sh
$ pwd
/home/cali ==(注:脚本的路径)==
每行中间用“*************************”隔开 解决方法
\# cat a.sh
echo "helllo"
echo "**********************"
echo "cali"
echo "**********************"
\#
\# num=$(find / -user liangluyao |wc -l)
$ find / -user cali -type f 2>/dev/null|wc -l
==/dev/null 特殊的文件,相当于黑洞文件,任何的内容重定向到这个文件都会消失,不保存==
null 零,空,无效的
重定向
==正确的输出重定向==
==\>==
==\>>==
\=\=\=\=\=\=
==错误的输出重定向==
==2>==
==2>> 追加==
\=\=\=\=\=\=
==不管正确的还是错误的都往一个文件里重定向==
==&>==
==&>> 追加==
==ls 命令执行成功重定向到1.txt 执行失败重定向到2.txt==
$ ==ls >1.txt 2>2.txt==
$ ==>1.txt 清空1.txt文件里的内容==
$ cat 1.txt
$
$ ls &>1.txt ==不管正确的还是错误的都往一个文件里重定向==
练习总结
练习总结:
问题:
- 2>/dev/null
- 如何查看效果
\# cat fnum.txt
\# tail -f /var/log/cron (日志文件)
- 取消计划任务
==删除xull这个用户所有的计划任务== rm -rf /var/spool/cron/xull
==\# crontab -u xull -r (注 *)==
将文件里的计划任务注释或者删除 #/1 * bash /home/xull/file_num.sh
\# cd /var/spool/cron/ ——》# rm -rf xull ==# crontab -u xull -r==
\# cd /var/spool/cron/ ——》# vim xull ——》 加 # 注释掉
- 某个用户的计划任务如何创建
- 文件的路径问题和权限问题(root可以访问任务地方的文件,但是普通不行,只能访问有限的路径)
将root用户的所有计划任务追加到xull用户的计划任务里
\# cd /var/spool/cron
\# cat root >>xull (注:注意权限问题,能否访问)
每一个用户的计划任务都存放在一个文件里 /var/spool/cron/
2.root用户在/opt2新建了一个文件fnum.txt专门用来统计普通用户的文件个数。请为普通用户xull编写计划任务:要求每5分钟,将==系统中属于xull用户的文件的个数==自动保存到/opt2/fnum.txt文件中。内容格式为:“日期时间 姓名 拥有的文件个数是:数目”。每行中间用“*************************”隔开
使用root用户新建/opt2目录
mkdir /opt2
cd /opt2/
touch /opt2/fnum.txt 文件
chmod 777 /opt2/fnum.txt 授权
==xull用户需要去编写脚本,创建计划任务(普通用户)==
==脚本:建议放在用户的家目录下==
\# su - xull
上一次登录:五 9月 25 15:53:35 CST 2020pts/1 上
$ pwd
==/home/xull==
$ ls
$ vim file_num.sh (注:脚本放到自己的家目录下,用户xull去创建)
$ cat file_num.sh
\#!/bin/bash
num=$(find / -user xull -type f 2>/dev/null |wc -l)
\#current time (注:当前的时间)
ctime=$(date +%F%H%M%S)
echo "${ctime} xull 文件数量是$num" >>/opt2/fnum.txt (注:>>追加)
echo "****************************" >>/opt2/fnum.txt (注:一行隔开)
$
(注:vim交互式的。脚本是背后执行的,用echo)
$ crontab -e
/1 * bash /home/xull/file_num.sh
$
切换到root用户
$ exit
\# cd /var/spool/cron/ (注:该目录下文件存放计划任务)
\# ls
cali liangluyao root ==xull==
\#cat xull (注:文件存放计划任务)
==/1 * bash /home/xull/file_num.sh==
三. 黑客-计划任务
主要内容:假如你是黑客,想在别人的机器上,每10分钟让它的服务器重启一次或者每天重启一次
关机命令:init 6
reboot
==1.停止crond服务==
\# service crond stop
2.查找可能存放计划任务的目录
/var/spool/cron (注:先挪走)
/etc/cron.d (注:与cron.hourly 有关)
/etc/cron.weekly
/etc/cron.daily
/etc/cron.monthly
3.检查发现没有问题了,再重新启动crond服务
\# service crond start
Redirecting to /bin/systemctl start crond.service
\# ps aux|grep crond
实在有的话
\# tail -f /var/log/cron (日志文件)
开机启动流程
\# cd /root (注:root用户家目录下)
\# ls -a (注:隐藏文件)
\# vim .bashrc
\# vim .bash_profile
\# vim /etc/profile (注:可以快捷筛选查找 /reboot /init)
\# vim /etc/bashrc (注:可以快捷筛选查找 /reboot /init)
\# cat /etc/rc.local
假如你是黑客,想在别人的机器上,每10分钟让它的服务器重启一次或者每天重启一次
\=\=\=\=
192.168.0.45 root 123456
关机命令:init 6
reboot
\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=
在各个路径下看 有没有可疑的 init6 和 reboot
==1.停止crond服务==
\# service crond stop
2.查找可能存放计划任务的目录
/var/spool/cron (注:先挪走)
/etc/cron.d (注:与cron.hourly 有关)
/etc/cron.weekly
/etc/cron.daily
/etc/cron.monthly
3.检查发现没有问题了,再重新启动crond服务
\# service crond start
Redirecting to /bin/systemctl start crond.service
\# ps aux|grep crond
root 1506 3.6 0.1 36304 3656 ? Ss 16:54 0:00 /usr/sbin/crond -n
root 1511 0.0 0.0 12320 1052 pts/0 S+ 16:54 0:00 grep --color=auto crond
\#
实在有的话
\# tail -f /var/log/cron (日志文件)
(注:通过日志去排查)
\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=
集中放计划任务的地方 /var/spool/cron/
\# cd /var/spool/cron/
\# ls
cali liangluyao root xull
\# cat cali
……(查看有没有可疑的,vim全部注释掉)
或者把所有文件全部挪走,如下操作
\# ls
cali liangluyao root xull
\# mkdir /backup (注:根下面建一个/backup 目录)/backup 备份目录
mv * /backup/ (把文件cali liangluyao root xull 挪到 /backup 目录下)
计划任务停了,crond不会执行
\# cd /backup/
\# ls
cali liangluyao root xull
\# cat cali (注:把计划任务文件挪走后,再再/backup目录下 一个个排查)
……
\# cat liangluyao
……
\# w (注:查看哪些用户登录)
\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=
顺风车
\# cd /etc/cron.daily
\# ls \# vim …
\# cd /etc/cron.hourly/
\# cd /etc/cron.monthly
\# cd /etc/cron.weekly
\# cd /etc/cron.d (注:每小时执行是每小时的第一分钟执行)
(注:run-parts 是一个命令,运行这个文件夹里的所有文件)
\=\=\=\=\=\=\==\=\=\=\=\=\=\==\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=
开机启动流程
\# cd /root (注:root用户家目录下)
\# ls -a (注:隐藏文件)
\# vim .bashrc
\# vim .bash_profile
\# vim /etc/profile (注:可以快捷筛选查找 /reboot /init)
\# vim /etc/bashrc (注:可以快捷筛选查找 /reboot /init)
\# cat /etc/rc.local
\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\==\=\=\=\=
四. 变量定义和使用
主要内容:
变量的命名:1.下划线命名法 (shell里建议)2.驼峰命名法3.匈牙利命名法 变量命名的注意事项 shell里如果变量没有定义,输出的是空值 ==env== 查看shell里的==环境变量== ==set== 查看当前shell里==所有的变量== ==export 输出变量为全局变量== \# ==echo $$ (注:显示当前bash的进程号)(注:$$代表当前bash的进程号)== \# ==bash (注:起一个子进程,子bash)== \# ==echo "$mv $sg hello" (注:输出一串内容的时候,用双引号引起来)== \# ==echo '$mv $sg hello' (注:单引号:所见即所得 $接变量名不会引用变量的值)==
shell编程
1.变量的定义
variable 变量的
sg=tanglf
变量的命名:
1.下划线命名法 (shell里建议)
sc_sg=tanglf
2.驼峰命名法
ScSg=wangtc
小驼峰
scSg=wangtc
大驼峰
ScSg=wangtc
3.匈牙利命名法
变量命名的注意事项:
1.不是以数字开头
2.不要全部是数字
3.不要包含特殊符号 #!@^$<>等
4.=左右不能有空格
linux系统里的环境变量都是大写的
自定义变量尽量使用小写
变量尽量要先定义后使用
shell里如果变量没有定义,输出的是空值
\# sc_sg=zhangxueyou
\# echo $sg_sg
==(←注:变量sg_sg没有定义,输出的是空值)==
\# echo $sc_sg
zhangxueyou
\# ==echo $sgsg/$mvmv==
==/ (←注:变量{sgsg} {mvmv}没有定义,输出的是“/”根)==
\#
\# rm -rf ==$sgsg/$mvmv==
rm: 在'/' 进行递归操作十分危险
rm: 使用 --no-preserve-root 选项跳过安全模式
\#
==env== 查看shell里的==环境变量==
==set== 查看当前shell里==所有的变量==
变量是有作用域
全局变量
局部变量
==export 输出变量为全局变量==
==用法:先定义再输出==
ssh访问22号端口,sshd监听22号端口
web服务是80端口
\# ==echo $$ (注:显示当前bash的进程号)(注:$$代表当前bash的进程号)==
1425
\#
\# ==export sg (注:输出sg这个变量为全局变量)==
\# echo $$
==1425==
\# mv=xull
\# ==bash (注:起一个子进程,子bash)==
\# echo $mv
==(注:输出为空,变量不继承)==
\# echo $$
==1598==
\# mv=xull
\# ==export mv (注:输出变量为全局变量)(注:export 输出)==
\# ==bash (注:起一个子进程,子bash)==
\# echo $mv
Xull ==(注:子进程继承了变量)==
\#
\# vim /root/.bash_profile
==输出一串内容的时候,用双引号引起来==
==单引号:所见即所得 $接变量名不会引用变量的值==
\# echo =="$mv $sg hello" (注:输出一串内容的时候,用双引号引起来)==
xull wangtc hello
\# echo =='$mv $sg hello' (注:单引号:所见即所得 $接变量名不会引用变量的值)==
$mv $sg hello
\#