用户管理与Llinux权限
第1章 密码管理与批量创建用户
1.1 用户知识点
密码管理:
md5校验
find /目录 –type f |xargs md5sum > police.txt
md5sum –c police.txt #定时任务+脚本
useradd
userdel
usermod
passwd
chown
id
w
sort 排序
uniq 去重统计
1.2 批量创建用户
1.2.1 让用户显示为一列 因为三剑客都是按照行执行的
[root@oldboyedu-lnb ~]# echo stu{01..10}|xargs -n1 stu01 stu02
1.2.2 如何在用户名的前面 加上useradd和空格
[root@oldboyedu-lnb ~]# echo stu{01..10}|xargs -n1|awk '{print "useradd " $1}' useradd stu01 useradd stu02 useradd stu03
1.2.3 如何让输出到屏幕上的命令执行 交给bash处理执行
[root@oldboyedu-lnb ~]# echo stu{01..10}|xargs -n1|awk '{print "useradd " $1}'|bash
1.2.4 批量删除用户
[root@oldboyedu-lnb ~]# echo stu{01..10}|xargs -n1|awk '{print "userdel -r " $1}'|bash
1.2.5 使用sed批量创建
[root@oldboyedu-lnb ~]# echo stu{01..10}|xargs -n1|sed -r 's#(.*)#useradd \1#g'|bash
1.2.6 批量创建用户并创建随机密码:
1.2.6.1 如何生成随机数
[root@oldboyedu-lnb ~]# echo $RANDOM|md5sum|cut -c1-8 7845f8e7 [root@oldboyedu-lnb ~]# openssl rand -base64 8
1.2.6.1.1 在命令行如何创建用户并且创一个随机密码
[root@oldboyedu-lnb ~]# useradd oldboy01;echo 123456|passwd --stdin oldboy01
1.2.6.1.2 给一个用户设置随机密码
[root@oldboyedu-lnb ~]# echo `echo $RANDOM|md5sum|cut -c1-8`|passwd --stdin oldboy01 Changing password for user oldboy01. passwd: all authentication tokens updated successfully.
1.2.6.1.3 把密码放入文件中
echo $(echo `echo $RANDOM|md5sum|cut -c1-8`|tee -a oldboy.txt)|passwd --stdin oldboy01 echo $(echo 12345678|tee -a oldboy.txt)|passwd --stdin oldboy01
1.2.6.2 使用变量的方式
[root@oldboyedu-lnb ~]# useradd oldboy11;pass=`echo $RANDOM|md5sum|cut -c1-8`;echo $pass|passwd --stdin oldboy11;
echo $pass >>passwd.txt ----------------------- useradd stu01;pass=`echo $RANDOM|md5sum|cut -c1-8`;echo $pass|passwd --stdin stu01;
echo stu01$pass >>passwd.txt
1.2.6.3 和awk拼接
[root@oldboyedu-lnb ~]# echo stu{01..10}|xargs -n1|awk '{print "useradd "$1";pass=`echo $RANDOM|md5sum|cut -c1-8`;
echo $pass|passwd --stdin "$1";echo "$1" $pass >>passwd.txt"}'|bash
[root@oldboyedu-lnb ~]# cat passwd.txt stu01 5d3b1e6e stu02 7cd57313 stu03 cde56c82 stu04 4b831d6c
1.2.6.4 sed拼接
[root@oldboyedu-lnb ~]# echo alex{01..10}|xargs -n1|sed -r 's#(.*)#useradd \1;pass=`date +%N|md5sum|cut -c1-8`;
echo $pass|passwd --stdin \1;echo \1 $pass >> passwd.txt#g'|bash
第2章 用户管理
2.1 last命令 显示用户登录日志 #排查系统安全问题的时候使用
显示用户什么时间登录的系统 什么时间离开的登录系统 总共连接的时间
lastlog命令 显示所有用户最后登录的时间
2.2 sudo 提权 让普通用户执行命令拥有root的权限
安全:
a.禁止使用root登陆
b.使用普通用户登陆
c.开发和运维都是普通用户
d.测试人员想要看日志
2.2.1 第一步: 创建oldboy用户
2.2.2 第二步: 切换到oldboy用户
su - oldboy # - 更新环境变量 重新执行环境变量文件
2.2.3 第三步:查看日志: /var/log/secure 没有权限查看日志文件
[oldboy@oldboyedu-lnb ~]$ cat /var/log/secure cat: /var/log/secure: Permission denied
2.2.4 第四步: oldboy用户需要root的权限才能看日志
皇帝 授予大臣 尚方大宝剑(一个命令相当于一个宝剑)
2.2.4.1 sudo 让oldboy临时拥有root的权限 root给oldboy授权可执行什么命令
2.2.4.2 我如何知道我当前是否有大宝剑 是否有可使用root权限
查看当前拥有的大宝剑
[root@oldboyedu-lnb ~]# sudo -l # 查看当前拥有的权限 [root@oldboyedu-lnb ~]# sudo -k # 清除密码缓存
2.2.4.3 普通用户默认没有sudo权限 没有人可以抱着大宝剑出生
第五步: root授权给oldboy cat命令临时拥有root的权限
a) 使用 vim /etc/sudoers
b) 使用 visudo ===== vim /etc/sudoers # 拥有语法检测的功能
c) 给oldboy授权cat命令 授权单个命令
visudo
oldboy ALL=(ALL) /usr/bin/cat # 命令使用全路径
2.2.5 使用sudo -l 查看 是否授权成功
[oldboy@oldboyedu-lnb ~]$ sudo -l [sudo] password for oldboy: User oldboy may run the following commands on oldboyedu-lnb: (ALL) /usr/sbin/cat
2.2.5.1 如何使用sudo提权后的命令 如何使用大宝剑
[oldboy@oldboyedu-lnb ~]$ sudo cat /var/log/secure
2.2.5.2 授权多个命令 ls vim echo
oldboy ALL=(ALL) /usr/sbin/cat,/usr/bin/vim,/usr/bin/echo,/usr/bin/ls [oldboy@oldboyedu-lnb ~]$ sudo ls /root
PS: 授权尽量不授权危险的命令 vim echo sed cat...可编辑文件的命令
sed -i '1s#x##g' /etc/passwd [oldboy@oldboyedu-lnb ~]$ sudo sed '1s#root::#root:x:#g' /etc/passwd root:x:0:0:root:/root:/bin/bash
2.2.5.3 授权所有命令 运维人员
oldboy ALL=(ALL) ALL
2.2.5.4 对ALL进行取反 不允许执行 vim echo cat less
注意:授权的命令之间必须要有逗号,
oldboy ALL=(ALL) ALL,!/usr/sbin/cat,!/usr/bin/vim,!/usr/bin/echo,!/usr/bin/ls oldboy ALL=(ALL) /usr/sbin/*,/usr/bin/*,!/usr/sbin/cat,!/usr/bin/vim,!/usr/bin/echo, !/usr/bin/ls
2.2.5.5 运维使用sudo不需输入自己用户的密码
oldboy ALL=(ALL) NOPASSWD: ALL
2.2.5.6 日志审计 记录用户所有的操作行为
跳板机 shell编程编写跳板机(记录用户的操作)
法1)齐治的堡垒机:商业产品 法2) gateone web跳板机 法3) python开发的开源的跳板机产品 法4) shell跳板机 J
2.3 awk过滤与sort uniq 去重统计
[root@oldboyedu-lnb ~]# awk -F/ '{print $3}' oldboy.txt www.baidu.com www.sina.com www.baidu.com www.weibo.com www.sina.com www.baidu.com www.sina.com [root@oldboyedu-lnb ~]# awk -F "[:/]+" '{print $2}' oldboy.txt www.baidu.com www.sina.com www.baidu.com www.weibo.com www.sina.com www.baidu.com www.sina.com
去重统计:
1) 先排序
[root@oldboyedu-lnb ~]# awk -F "[:/]+" '{print $2}' oldboy.txt |sort
2) 去重统计
[root@oldboyedu-lnb ~]# awk -F "[:/]+" '{print $2}' oldboy.txt |sort|uniq -c 3 www.baidu.com 3 www.sina.com 1 www.weibo.com
第3章 Linux12权限体系
3.1 权限体系
3.1.1 linux如何知道我对某个文件或目录有什么权限?
查看我对当前目录oldboy.txt拥有什么权限
-rw-r--r-- 1 root root 233 Aug 13 10:36 oldboy.txt
1) 你是谁 当前登陆系统的用户 2) 当前登陆的用户和oldboy.txt 文件或目录有什么关系 3) 通过对应的关系 找到和oldboy.txt 对应的权限 4) 当前登陆的用户是oldboy用户 我对oldboy.txt用户拥有什么权限
r(4)w(2)-r(4)--r(4)-- ===== 644
3.1.2 修改权限 chmod
3.1.3 第一种方法: ugo方式
权限的表示方法总共三种 RWX 可读 可写 可执行
对应的数字 421 ugo授权 u===user 属主 g===group 属组 o===other 其他用户
语法格式:
增加权限 chmod u+x 文件
取消权限 chmod u-x 文件
3.1.3.1 属主去掉写入的权限
[root@oldboyedu-lnb ~]# ll 1.sh -rw-r--r-- 1 root root 4 Aug 13 11:06 1.sh [root@oldboyedu-lnb ~]# chmod u-w 1.sh [root@oldboyedu-lnb ~]# ll 1.sh -r--r--r-- 1 root root 4 Aug 13 11:06 1.sh
3.1.3.2 属主增加w权限
[root@oldboyedu-lnb ~]# chmod u+w 1.sh [root@oldboyedu-lnb ~]# ll 1.sh -rw-r--r-- 1 root root 4 Aug 13 11:06 1.sh
3.1.3.3 属主和属组同时增加x权限
[root@oldboyedu-lnb ~]# chmod ug+x 1.sh [root@oldboyedu-lnb ~]# ll 1.sh -rwxr-xr-- 1 root root 4 Aug 13 11:06 1.sh
3.1.3.4 给所有权限位取消r权限
[root@oldboyedu-lnb ~]# chmod ugo-r 1.sh [root@oldboyedu-lnb ~]# ll 1.sh --wx--x--- 1 root root 4 Aug 13 11:06 1.sh
3.1.3.5 给属主重新授权为r-x
[root@oldboyedu-lnb ~]# chmod u=rx 1.sh [root@oldboyedu-lnb ~]# ll 1.sh -r-x--x--- 1 root root 4 Aug 13 11:06 1.sh
3.1.3.6 给所有的权限位统一授权
[root@oldboyedu-lnb ~]# chmod ugo=rw 1.sh [root@oldboyedu-lnb ~]# ll 1.sh -rw-rw-rw- 1 root root 4 Aug 13 11:06 1.sh
[root@oldboyedu-lnb ~]# chmod ugo=rw 1.sh [root@oldboyedu-lnb ~]# ll 1.sh -rw-rw-rw- 1 root root 4 Aug 13 11:06 1.sh
a. ugo
b. a === ugo all 所有权限位
c. 啥都不加 默认代表所有权限位
取消所有权限位的w权限
[root@oldboyedu-lnb ~]# chmod a-w 1.sh [root@oldboyedu-lnb ~]# ll 1.sh -r--r--r-- 1 root root 4 Aug 13 11:06 1.sh
所有权限位增加x权限
[root@oldboyedu-lnb ~]# chmod a+x 1.sh [root@oldboyedu-lnb ~]# ll 1.sh -r-xr-xr-x 1 root root 4 Aug 13 11:06 1.sh
默认就是代表所有权限位
[root@oldboyedu-lnb ~]# chmod -x 1.sh [root@oldboyedu-lnb ~]# ll 1.sh -r--r--r-- 1 root root 4 Aug 13 11:06 1.sh
3.1.3.4 第二种方法: 使用权限对应的数字进行授权 公司常用
R 4
W 2
X 1
3.1.3.4.1 文件修改为655权限 rw-r-xr-x
[root@oldboyedu-lnb ~]# chmod 655 1.sh [root@oldboyedu-lnb ~]# ll 1.sh -rw-r-xr-x 1 root root 4 Aug 13 11:06 1.sh
3.1.3.4.2 文件修改为rw------- 权限 ---> 数字 600
[root@oldboyedu-lnb ~]# chmod 600 1.sh [root@oldboyedu-lnb ~]# ll 1.sh -rw------- 1 root root 4 Aug 13 11:06 1.sh
第4章 文件与目录权限
4.1 权限对于文件的作用
RWX对于文件的作用
4.1.1 测试R权限对文件的作用 read
[root@oldboyedu-lnb oldboy]# chmod u=r 1.sh [root@oldboyedu-lnb oldboy]# ll total 4 -r--r--r-- 1 oldboy oldboy 9 Aug 14 08:09 1.sh
PS:执行一个文本中的命令 使用./1.sh /oldboy/1.sh 上面两种执行方式 对于root有同样的作用
a. 对文件可读 cat less more... b. 不能修改文件 c. 不能执行文件
4.1.2 测试W权限对文件的作用 write
[root@oldboyedu-lnb oldboy]# chmod u=w 1.sh [root@oldboyedu-lnb oldboy]# ll total 4 --w-r--r-- 1 oldboy oldboy 9 Aug 14 08:09 1.sh
a. 不能读取文件 b. 可以追加内容 c. 不能编辑写入内容 d. 可以强制写入并强制保存退出 但是会覆盖原有内容 e. 不能执行文件 f. 可写入必须和r配置使用 rw权限
4.1.3 测试X权限对文件的作用 execute 可以运行文件中的命令
[root@oldboyedu-lnb oldboy]# chmod u=x 1.sh [root@oldboyedu-lnb oldboy]# ll total 4 ---xr--r-- 1 oldboy oldboy 9 Aug 14 08:20 1.sh
a. 不能读取文件 b. 不能写入内容 c. 不能执行文件 d. 文件只有x权限 什么都无法操作 e. 想要执行必须和r配合使用 r-x权限
4.1.4 小结
1.查看文件 r权限
2.写入内容到文件 rw
3.想要执行文件 rx
4.2 RWX对于目录的作用
环境准备:
在/oldboy目录下创建oldboyedu 在oldboyedu目录下创建stu{1..3}.txt 授权oldboyedu目录属主属组oldboy chown -R o ldboy.oldboy oldboyedu
4.2.1 测试R权限对于目录的作用
[root@oldboyedu-lnb oldboy]# chmod u=r oldboyedu [root@oldboyedu-lnb oldboy]# ll total 0 dr--r-xr-x 2 oldboy oldboy 54 Aug 14 08:29 oldboyedu
a. 只能看到文件名 看不到详细信息
b. 不能进入目录中 不能cd
c. 不能创建和删除文件、不能改名
4.2.2 测试W权限对于目录的作用
[root@oldboyedu-lnb oldboy]# chmod u=w oldboyedu/ [root@oldboyedu-lnb oldboy]# ll total 0 d-w-r-xr-x 2 oldboy oldboy 54 Aug 14 08:29 oldboyedu
a. 无法查看目录下的内容
b. 无法创建文件、删除、移动改名等
c. 只有W权限啥都不能干
4.2.3 测试X权限对于目录的作用
[root@oldboyedu-lnb oldboy]# chmod u=x oldboyedu/ [root@oldboyedu-lnb oldboy]# ll total 0 d--xr-xr-x 2 oldboy oldboy 54 Aug 14 08:29 oldboyedu
a. 可以cd到目录
b. 不能查看目录下的内容
c. 不能创建和删除文件、不能改名
4.2.4 小结
对于目录 可以查看没目录下的内容需要使用 rx配合
能写入内容到文件 但是不能删除 创建 改名等操作 (还得确定文件的权限)
[root@oldboyedu-lnb oldboy]# chmod u=rx oldboyedu/ [root@oldboyedu-lnb oldboy]# ll total 0 dr-xr-xr-x 2 oldboy oldboy 54 Aug 14 08:29 oldboyedu
对于目录 可以创建 删除 移动 改名等需要使用x权限
[root@oldboyedu-lnb oldboy]# chmod u=wx oldboyedu/ [root@oldboyedu-lnb oldboy]# ll total 0 d-wxr-xr-x 2 oldboy oldboy 54 Aug 14 08:29 oldboyedu
对于目录 可以查看文件的属性信息 可以cd 需要r和x配合
4.3 系统默认的权限UMASK 不要修改UMASK值 了解即可
创建文件和目录默认的权限
文件 644
目录 755
UMASK控制默认创建的权限
4.3.1 查看当前UMASK默认的值
[root@oldboyedu-lnb oldboy]# umask 0022
4.3.2 文件最大的权限为 666
普通文件最大为什么是666权限
rw-rw- 对于普通文本 可读可写就是最大权限
系统默认创建的文件权限
文件权限计算:
文件的最大权限减去UMASK值
666-022=644
4.3.3 目录的最大权限为777
目录的权限计算:
目录的最大权限减去umask值
777-022=755
4.3.3 umask 特殊情况 修改umask值为032
[root@oldboyedu-lnb ~]# umask 032 [root@oldboyedu-lnb ~]# umask 0032
创建文件权限: 666-032=634
创建目录权限:777-032=745
如果umask值有奇数位 不影响目录 文件在计算后 在对应的奇数位加1即可
文件计算:
666
- 032
= 634
+ 010
644
案例: 创建一个文件权限为000 目录为111 则umask默认是多少?
666
-666
000
777
-666
111
[root@oldboyedu-lnb ~]# umask 666 [root@oldboyedu-lnb hehe]# touch umask.txt [root@oldboyedu-lnb hehe]# mkdir umask [root@oldboyedu-lnb hehe]# ll total 0 d--x--x--x 2 root root 6 Aug 14 09:43 umask --------- 1 root root 0 Aug 14 09:43 umask.txt
4.4 通过权限使网站更安全
1) 网站程序存放的位置 访问我们服务器上某个目录 2) 网站通过什么用户来运行 普通用户运行 3) 目录和文件用什么权限 目录 755 文件 644
4.5 Linux的隐藏权限
4.5.1 查看文件的隐藏属性
[root@oldboyedu-lnb ~]# lsattr /etc/passwd ---------------- /etc/passwd # 表示没有隐藏权限
4.5.2 设置隐藏权限
隐藏权限有 a i
a (append 只能追加) 如果设置了这个权限 只能追加 不能删除 不能修改
i( immutable 无敌) 无法修改 无法删除
chattr 设置隐藏权限
给oldboy.txt a权限 只能追加 echo cat 不能使用vim
[root@oldboyedu-lnb ~]# lsattr oldboy.txt ---------------- oldboy.txt [root@oldboyedu-lnb ~]# chattr +a oldboy.txt [root@oldboyedu-lnb ~]# lsattr oldboy.txt -----a---------- oldboy.txt
4.5.3 取消隐藏权限
[root@oldboyedu-lnb ~]# chattr -a oldboy.txt [root@oldboyedu-lnb ~]# lsattr oldboy.txt ---------------- oldboy.txt
4.5.4 设置隐藏权限 i 无敌
[root@oldboyedu-lnb ~]# chattr +i oldboy.txt [root@oldboyedu-lnb ~]# lsattr oldboy.txt ----i----------- oldboy.txt
4.5.5 取消权限
[root@oldboyedu-lnb ~]# chattr -i oldboy.txt [root@oldboyedu-lnb ~]# lsattr oldboy.txt ---------------- oldboy.txt
4.6 文件的特殊权限位 了解
[root@oldboyedu-lnb ~]# ll /usr/bin/passwd -rwsr-xr-x. 1 root root 27832 Jun 10 2014 /usr/bin/passwd
s权限位 位于属主权限位 会把原有的权限位隐藏掉 而不是覆盖 不要给命令轻易设置s权限
s对应数字关系 4
s的作用: 执行命令的时候 相当于这个命令的属主(suid)
4.6.1 授权rm命令s权限 所有的其他用户执行rm都相当于 root
[root@oldboyedu-lnb ~]# ll /usr/bin/rm -rwxr-xr-x. 1 root root 62864 Apr 11 2018 /usr/bin/rm [root@oldboyedu-lnb ~]# chmod u+s /usr/bin/rm [root@oldboyedu-lnb ~]# ll /usr/bin/rm -rwsr-xr-x. 1 root root 62864 Apr 11 2018 /usr/bin/rm
4.6.2 或者是数字授权
[root@oldboyedu-lnb ~]# chmod 4755 /usr/bin/rm [root@oldboyedu-lnb ~]# ll /usr/bin/rm -rwsr-xr-x. 1 root root 62864 Apr 11 2018 /usr/bin/rm
4.6.3 撤销授权s
[root@oldboyedu-lnb ~]# chmod 0755 /usr/bin/rm [root@oldboyedu-lnb ~]# ll /usr/bin/rm -rwxr-xr-x. 1 root root 62864 Apr 11 2018 /usr/bin/rm
4.6.4 t 粘滞位 控制用户只能管理自己的文件 不能删除其他用户的文件
t 其他用户other
增加t权限
[root@oldboyedu-lnb ~]# ll -d /tmp drwxrwxrwx. 9 root root 145 Aug 14 10:19 /tmp [root@oldboyedu-lnb ~]# chmod o+t /tmp/ [root@oldboyedu-lnb ~]# ll -d /tmp/ drwxrwxrwt. 9 root root 145 Aug 14 10:20 /tmp/
测试:
[root@oldboyedu-lnb ~]# touch /tmp/root.txt [root@oldboyedu-lnb ~]# ll /tmp/root.txt -rw-r--r-- 1 root root 0 Aug 14 10:20 /tmp/root.txt
s sgid(属主权限)
作用:运行某一个命令的时候相当于属于这个命令所在家庭(用户组)(root)
4.6.5 权限拒绝排查流程
4.6.6 odlboy用户下面几个操作报错原因
[oldboy@lzy oldboy]$ cat /etc/shadow cat: /etc/shadow: Permission denied
对/etc/shadow文件下没有r权限
[oldboy@lzy oldboy]$ echo '#' >> /etc/passwd -bash: /etc/passwd: Permission denied
对/etc/passwd文件没有w权限
[oldboy@lzy oldboy]$ touch /etc/passwd.txt touch: cannot touch ‘/etc/passwd.txt’: Permission denied
对于/etc/目录没有w权限
[oldboy@lzy oldboy]$ rm -rf /etc/shadow rm: cannot remove ‘/etc/shadow’: Permission denied
对于/etc/shadow没有w权限
[oldboy@lzy oldboy]$ ls /root/ ls: cannot open directory /root/: Permission denied
对于/root/没有r权限
4.7 定时任务
1) 定时任务介绍
2) 定时任务分类
3) 定时任务相关文件
4) 定时任务使用
5) 书写流程
6) 定时任务注意事项
4.7.1 定时任务介绍
什么是定时任务
在某个时间做什么事情
闹钟 定时
定时上课 定时下课 定时吃饭
在linux中定时任务
打包 备份
重要的文件日志数据进行打包---> 在业务的低谷期传送到备份服务器
4.7.2 定时任务分类
1. crond 工作使用的定时任务
2. atd 只能运行一次 了解
3. anacon 非7*24运行的服务器 了解
4.7.2.1 查看crond是否安装 默认是安装并运行 开机启动
[root@oldboyedu-lnb ~]# rpm -qa cronie cronie-1.4.11-19.el7.x86_64
4.7.2.2 查看crond当前运行的状态 # 运行中 开机自动启动
[root@oldboyedu-lnb ~]# systemctl status crond crond.service - Command Scheduler Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled) Active: active (running)
4.7.2.3 定时任务相关文件 /var/log/messages
系统的message日志 logrotate+定时任务来执行切割
/etc/cron.deny # 拒绝某个用户使用定时任务 了解
/var/log/cron # 定时任务的日志文件
4.7.3 定时任务的分类 两类
1类 系统定时任务
2类 用户定时任务
4.7.3.1 系统定时任务
/etc/crontab #系统定时任务配置文件 针对所有用户生效 全局
4.7.3.2 用户定时任务
4.7.3.2.1 查看用户的定时任务 crontab -l
[root@oldboyedu-lnb ~]# crontab -l no crontab for root
4.7.3.2.2 crontab -e 编辑定时任务 ----> 编辑 /var/spool/cron/以当前登陆用户命名的文件名称
例如当前登陆用户root ---> /var/spool/cron/root
例如当前登陆用户oldboy---> /var/spool/cron/oldboy
crontab -e 有语法检测功能 类似于 visudo
4.7.4 定时任务使用
[root@oldboyedu-lnb ~]# crontab -e # 编辑用户的定时任务 默认为空
口诀:什么时间做什么,然后再想下一次什么时候执行 什么时间,做什么事情
* * * * * 分 时 日 月 周 minute hour day of month month day of week 分钟 小时 天 月 周 0-59 0-23 1-31 1-12 0-6 1-7
1.案例 每天的上午8点30分,来学校上车(go to school)
格式:
* * * * * user-name command to be executed 30 8 * * * root go to school
2.案例 每天晚上12点准时,回家自己开车(go to bed)
第一个* 0 表示整点 可以使用00
第二个* 0 表示凌晨12点 可以使用00
00 00 * * * root go to bed
注意:星期几和日期不要同时加上 2020年2月29日 星期六
4.7.5 定时任务实际编写方法
4.7.5.1 定时任务服务环境准备
定时任务服务是否启动/是否开机自动启动
[root@oldboyedu ~]# systemctl status crond crond.service - Command Scheduler Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled) Active: active (running) since Tue 2019-04-23 09:15:43 CST; 2 days ago Main PID: 905 (crond) CGroup: /system.slice/crond.service └─905 /usr/sbin/crond -n Apr 23 09:15:43 oldboyedu.com systemd[1]: Started Command Scheduler. Apr 23 09:15:43 oldboyedu.com systemd[1]: Starting Command Scheduler... Apr 23 09:15:43 oldboyedu.com crond[905]: (CRON) INFO (RANDOM_DELAY will be scaled with factor 30% if used.) Apr 23 09:15:43 oldboyedu.com crond[905]: (CRON) INFO (running with inotify support
4.7.5.2 实际编写定时任务
配置方法: crontab -e
编写语法规范:
# 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 * * * * * 具体做什么事情 分 时 日 月 周
4.8 写法
4.8.1 用数值表示时间信息
00 02 * * * 备份文件
4.8.2 利用特殊符号表示时间信息
* * * * * 备份文件 每分钟 每小时 每天 每月 每周
PS: 定时任务最短执行的周期为每分钟
*/5 */5 */5
每隔5分钟 每隔5小时 每隔5天
01-05 02 * * *
01到05 02 * * *
指定时间的范围
00 14,20 * * *
指定不连续的时间信息
每天14:30分钟 起来学习
测验01: 每天下午02:30分钟 起来学习
30 14 * * *
测验02: 每隔3天 夜里2点 执行数据备份
00 02 */3 * *
测验03: */10 01,03 * * *
每天凌晨01点 每隔10分钟 每天凌晨03点 每隔10分钟 每天凌晨1点和凌晨3点 每隔10分钟0点整 --> 01:00 03:00
测验04:
*/10 01-03 * * *
测验05:
* 01,03 * * * ???
测验06:
* 01-03 * * *
测验07:
00 02 28 */2 6 ??? 02:00 28 每隔两个月 星期6
结论:
01. 在写时间信息的时候, 如果想表示每隔多久执行什么任务
/上面尽量用*号表示, 不要写具体数值
02. 时间信息由左到右依次书写, 尽量不要跳步
03. 当编写定时任务时,日期信息不要和星期信息同时出现
补充说明:
20/10 01,03 * * *
01:20 01:30 01:40 01:59
03:00 03:59
4.8.3 实际编写定时任务
4.8.3.1 每天凌晨两点备份 /data目录到 /backup
第一个历程: 写上时间信息
00 02 * * *
第二个历程: 写上完成任务的具体命令
cp -a /data /backup
第三个历程: 编写定时任务
crontab -e 00 02 * * * cp -a /data /backup
4.9 定时任务排查方法:
4.9.1 检查是否有定时任务配置文件
cat /var/spool/cron/root 00 02 * * * cp -a /data /backup
4.9.2 检查定时任务日志文件
ll /var/log/cron -rw-------. 1 root root 14050 Apr 25 15:49 /var/log/cron 日志信息说明 Apr 25 15:53:22 oldboyedu crontab[3893]: (root) BEGIN EDIT (root) Apr 25 15:54:06 oldboyedu crontab[3934]: (oldboy) BEGIN EDIT (oldboy) Apr 25 15:54:48 oldboyedu crontab[3893]: (root) REPLACE (root) Apr 25 15:54:48 oldboyedu crontab[3893]: (root) END EDIT (root) Apr 25 15:55:01 oldboyedu crond[905]: (root) RELOAD (/var/spool/cron/root) Apr 25 15:55:01 oldboyedu CROND[3939]: (root) CMD (cp -a /data /backup) Apr 25 15:55:01 oldboyedu CROND[3937]: (root) MAIL (mailed 55 bytes of output but got status 0x004b#012) 执行时间 主机名 编辑定时任务 以什么用户编辑或执行定时任务/干了什么事情 执行定时任务
4.10 定时任务编写注意事项:(规范)
4.10.1 编写定时任务要有注释说明
4.10.2 编写定时任务路径信息尽量使用绝对路径
4.10.3 编写定时任务命令需要采用绝对路径执行 /usr/sbin/useradd
命令执行成功条件: useradd ---> $PATH ---> /sbin/useradd ---> 命令执行成功 定时任务执行时,识别的PATH信息只有: /usr/bin:/bin useradd命令--->usr/sbin/useradd
4.10.4 编写定时任务时,可以将输出到屏幕上的信息保存到黑洞中,避免占用磁盘空间
* * * * * sh test.sh &>/dev/null
说明: 定时任务中执行命令,如果产生输出到屏幕的信息,都会以邮件方式告知用户
/var/spool/mail/root 不断变大占用磁盘空间 占用的block空间
解决方法: 将邮件服务关闭
systemctl stop postfix /var/spool/postfix/maildrop/ 不断产生小文件占用磁盘空间 占用的inode空间
解决方法: 删除小文件/
rm -f /var/spool/postfix/maildrop/* systemctl start postfix
4.10.5 编写定时任务, 尽量不要产生屏幕输出信息
cp -a /data /backup tar zcvf /backup/data.tar.gz /data 有信息输出 cd / tar zcf /backup/data.tar.gz ./data 没有信息输出
4.10.6 当需要多个命令完成一个定时任务需求时,可以利用脚本编写定时
vim backup.sh cp -a /data /backup tar zcvf /backup/data.tar.gz /data crontab -e # xxxxx * * * * * /bin/sh /server/scripts/backup.sh &>/dev/null
作业: 使用crond只在凌晨4点运行一次、如何关闭或者取消或删除下一次执行(非手动)
4.11 定时任务
配置文件
系统定时任务 /etc/crontab
用户定时任务 /var/spool/cron/用户 ====> crontab -e
4.12 查看当前用户定时任务的列表
crontab -l # 系统的定时任务 只能通过查看文件cat /etc/crontab
* 代表每 第一个是* 代表了每分钟
* * * * * 代表了1分钟执行1次
*/n n数字 每隔多少分钟执行1次
*/5 * * * * 每间隔5分钟执行1次8点13-->定时任务--->15分 20分 25分执行
- 代表了区间
00 06-08 * * * 6点7点8点 执行1次
每天的上午7点到上午11点 每一个小时运行CMD命令
00 7-11 * * * root cmd
, 分隔
00 04-07,11,15 * * *分别是上午的4点到7点和11点,15点 执行
案例: 每分钟把自己的名字 追加到 /oldboy/oldboy.txt
PS:输出文件尽量使用绝对路径 默认存放在家目录
4.13.1 在命令行把自己的名字追加到文件中
4.13.2 写入定时任务 定时任务的规范
* * * * * 可执行命令 * * * * * echo oldboyedu >> /oldboy/oldboy.txt
4.13.3 测试结果
4.13.4 排错 /var/log/cron 日志
00 23,00-07 * * * 晚上23点,0点到7点 /application/nginx/sbin/nginx -s reload
4.14 定时任务书写规范
4.14.1 在命令行测试
4.14.2 测试成功后写入脚本(一个定时任务的命令超过2条 写入脚本 在定时任务中执行脚本)
4.14.3 执行脚本进行测试 sh test.sh ./test.sh /root/test.sh . test.sh source test.sh
4.14.4 写入定时任务 分时日月周
4.14.5 检查结果并排错
4.14.6 定时任务命令为1条命令 直接写入定时任务即可
案例: 每间隔5分钟 进行1次时间同步
date -s 20081011
通过邮件来查看详细的执行过程: 系统开启了postfix邮件服务
[root@oldboyedu-lnb ~]# cat /var/spool/mail/root
4.15 定时任务注意事项
4.15.1 定时任务规则前加注释 什么时间做什么 作用是什么 作者是谁 给我们自己开 方便管理
4.15.2 使用脚本来替代命令行的定时任务(超过两条写入脚本) 脚本: 命令的集合
4.15.3 定时任务中的%需要使用转义
4.15.3.1 写入定时任务
每分钟对/etc/hosts /etc/passwd 打包成时间格式命名的压缩包 放在/opt下
/opt/2008-09-10.tar.gz
命令行执行
tar zcvfP /opt/`date +%F`.tar.gz /etc/hosts /etc/passwd
写入定时任务
* * * * * tar zcvfP /opt/`date +\%F`.tar.gz /etc/hosts /etc/passwd
不加转义:
写入脚本 定时任务中执行脚本: 放在系统的固定目录 统一管理
[root@oldboyedu-lnb scripts]# cat tar.sh tar zcfP /opt/`date +%F`.tar.gz /etc/hosts /etc/passwd crontab -e * * * * * sh /server/scripts/tar.sh
4.15.4 定时任务执行脚本使用/bin/sh 或sh 执行 脚本统一放在一个目录
4.15.5 定时任务中-命令或脚本结果(正确及错误)定向到黑洞(>/dev/null 2>&1)或追加到文件中 >>/tmp/oldboy.txt 2>&1
4.15.6 企业案例:
如果定时任务规则结尾不加>/dev/null 2>&1或者追加到文件中>>/tmp/oldboy 2>&1
很容易导致硬盘inode空间被占满,从而系统服务不正常。
4.15.6.1 为什么会导致inode满 一个文件必须最少占用1个inode和多个block
如果邮件postfix服务没有开启 定时任务没有把执行结果定向到空或者文件中
定时任务里面的每一条执行一次都会产生1个临时文件 临时文件占用inode
4.15.6.2 如果postfix服务开启 则不会产生小文件 定时任务会不断的给root用户发邮件
执行命令过程中会提示
you have new mail in /var/spool/mail/root
4.15.6.3 定时任务产生的小文件的目录(邮件没开启产生的) 默认邮件开启/var/spool/postfix/maildrop/
4.15.6.3.1 关闭邮件服务
[root@oldboyedu-lnb ~]# systemctl stop postfix
4.15.6.3.2 让定时任务每分钟执行测试
*/5 * * * * ntpdate ntp1.aliyun.com * * * * * sh /server/scripts/tar.sh
解决方案:
1. 开启邮件 (不建议) 2. 把命令的执行结果定向到空或者是文件中 使用第二种方法 定向到空 &> /dev/null 定向到文件 &>> /data/test.txt 3. 定时清理 /var/spool/postfix/maildrop */30 * * * * find /var/spool/postfix/maildrop/ -type f|xargs rm
PS:目录本身越大 表示下面的小文件越多,如果目录下有个1G的文件 会影响目录大小
目录里存的是文件名称 文件名称存放在目录的block中
文件里的内容有1G 1G的内容文件的block
如果一个目录本身大于1M 说明了小文件很多
4.15.7 避免不必要的程序输出
tar -zcvf ----> tar -zcf
4.15.8 在脚本中打包先进入相对路径
4.15.8.1 案例
每天凌晨1点把/etc/目录 打包备份/tmp目录并且要求每天的备份名字不同。
1) 命令行测试 2) 写入脚本 [root@oldboyedu-lnb scripts]# cat tar.sh cd / tar zcf /tmp/`date +%F-%H-%M`.tar.gz etc 3) 执行脚本测试 4) 写入定时任务 00 01 * * * sh /server/scripts/tar.sh &>/dev/null
4.15.9 定时任务脚本中的程序文件 ,尽量用绝对路径
* * * * * echo oldboyedu >>/root/oldboy.txt
4.15.10 定时任务的配置文件 必须要打包备份
4.15.11 用户定时任务运行脚本的时候可以识别的PATH只有 /usr/bin和/bin
*/5 * * * * ntpdate ntp1.aliyun.com 命令无法执行 [root@oldboyedu-lnb ~]# which ntpdate /usr/sbin/ntpdate
4.15.11.1 解决方法1
命令使用绝对路径方式
* * * * * /usr/sbin/ntpdate ntp1.aliyun.com &>/dev/null
4.15.11.2 解决方法2:定义PATH变量(在定时任务配置文件中 在脚本中)
[root@oldboyedu-lnb ~]# crontab -l
PATH='/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin'
4.15.11.3 解决方法3: 在脚本中实现
PS:在写脚本的过程中 目录和目录之间的连接必须连着的 不能有空格
创建一个以ip地址命名的目录 使用ifconfig命令获取IP并创建目录,
并把/etc/目录打包压缩放在里面,保持每天的压缩包名字不同
4.15.11.3.1 获取IP地址
[root@oldboyedu-lnb ~]# hostname -I 10.0.0.200 [root@oldboyedu-lnb ~]# ifconfig eth0|awk 'NR==2{print $2}' 10.0.0.200 [root@oldboyedu-lnb scripts]# cat ip.sh #PATH='/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin' #source /etc/profile /etc/profile dir=`ifconfig eth0|awk 'NR==2{print $2}'` time=`date +%F-%H-%M` IP=`hostname` #mkdir -p /opt/$dir #cd /opt/$dir || mkdir $dir [ -d /opt/$dir ] || mkdir /opt/$dir cd / tar zcf /opt/$dir/${time}.tar.gz etc
4.16 写入定时任务
* * * * * sh /server/scripts/ip.sh
4.17 企业中常见笔试题
每天晚上12点执行一条 ntpdate ntp1.aliyun.com
00 00 * * * /usr/sbin/ntpdate ntp1.aliyun.com 案例: 早上4点执行1次 ntpdate ntp1.aliyun.com 执行完后 注释删除该定时任务 #* * * * * ntpdate ntp1.aliyun.com &>/dev/null && sed -i '4s#^#\##g' /var/spool/cron/root [root@oldboyedu-lnb ~]# sed -n '/ntpdate/s#^#\##gp' /var/spool/cron/root * * * * * ntpdate ntp1.aliyun.com &>/dev/null && sed -i '4s#^#\##g' /var/spool/cron/root [root@oldboyedu-lnb scripts]# cat ntp.sh ntpdate ntp1.aliyun.com &>/dev/null sed -i '/ntp/s#^#\##g' /var/spool/cron/root