用户管理与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

 

                                              

posted @ 2020-09-15 17:47  上善若水~小辉  阅读(268)  评论(0编辑  收藏  举报