一、定时任务

(一)、crond介绍
  • crond 是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务 工具,并且会自动启动crond进程,crond进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务。
    (二)、任务调度
  • Linux下的任务调度分为两类,系统任务调度和用户任务调度。
    1、系统任务调度
    系统周期性所要执行的工作,比如写缓存数据到硬盘、日志清理等。在/etc目录下有一个crontab文件,这个就是系统任务调度的配置文件。
    2、用户定期要执行的工作,比如用户数据备份、定时邮件提醒等。用户可以使用 crontab 工具来定制自己的计划任务。所有用户定义的crontab 文件都被保存在 /var/spool/cron目录中。其文件名与用户名一致。
  • crontab格式
    Linux进阶知识点(1)_第1张图片

  • crontab特殊符号
    1、星号(*):代表所有可能的值,例如month字段如果是星号,则表示在满足其它字段的制约条件后每月都执行该命令操作。
    2、逗号(,):可以用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9”
    3、中杠(-):可以用整数之间的中杠表示一个整数范围,例如“2-6”表示“2,3,4,5,6”
    4、正斜线(/):可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。同时正斜线可以和星号一起使用,例如/10,如果用在minute字段,表示每十分钟执行一次。

    (三)、书写定时任务注意事项

  • 在我们书写定时任务的时候一定把任务执行的结果重定向到一个文件或者是黑洞目录里边,默认系统会把所有信息通过邮件的方式发送给用户,如果邮箱服务关闭了,所有的邮件会存放到/var/spool/postfix/maildrop这个目录下边造成大量的小文件,导致inode被沾满的故障。
  • 再用定时任务执行脚本的时候一定要在脚本的开头指明环境变量,默认定时任务只是识别/bin和/usr/bin下边的命令,另外%在定时任务中表示换行。

    (四)、如何配置定时任务(一个栗子)

  • 书写定时任务完成:每天晚上12点备份/etc/rc.local /etc/sysconfig/ /var/spool/cron /etc/fstab 这些文件到/backup目录

    [root@jiangjunwang ~]# crontab -e
    #backup log script
    0 0 * /bin/tar -jcPf /backup/beifen.$(date +\%F).tar.bz2 /etc/rc.local /etc/sysconfig/ /var/spool/cron /etc/fstab
    稍微验证一下
    [root@jiangjunwang ~]# date -s 23:59-----修改系统时间
    Wed Aug 29 23:59:00 CST 2018
    [root@jiangjunwang ~]# ll /backup/-----查看是否备份,看看压缩包创建的时间
    total 48
    -rw-r--r-- 1 root root 47922 Aug 30 00:00 beifen.2018-08-30.tar.bz2
    [root@jiangjunwang ~]# tail -f /var/log/cron-------------通过日志观察是否执行成功
    Aug 30 00:00:01 jiangjunwang CROND[3041]: (root) CMD (/bin/tar -jcPf /backup/beifen.$(date +%F).tar.bz2 /etc/rc.local /etc/sysconfig/ /var/spool/cron /etc/fstab 2>&1 )

二、如何让一个脚本或者命令可以开机自启

(一)、把命令或脚本放在/etc/rc.local中

(二)、通过chkconfig管理

  • chkconfig命令主要用来更新(启动或停止)和查询系统服务的运行级信息。谨记chkconfig不是立即自动禁止或激活一个服务,它只是简单的改变了符号连接。

    [root@jiangjunwang ~]# chkconfig --list iptables
    iptables 0:off 1:off 2:off 3:off 4:off 5:off 6:off
    [root@jiangjunwang ~]# ll /etc/rc3.d/|grep "iptab"
    lrwxrwxrwx 1 root root 18 Aug 26 19:47 K92iptables -> ../init.d/iptables
    [root@jiangjunwang ~]# chkconfig iptables on
    [root@jiangjunwang ~]# ll /etc/rc3.d/|grep "iptab"
    lrwxrwxrwx 1 root root 18 Sep 6 15:42 S08iptables -> ../init.d/iptables
    [root@jiangjunwang ~]# head -10 /etc/init.d/iptables
    #!/bin/sh
    #iptables Start iptables firewall
    #chkconfig: 2345 08 92
    #description: Starts, stops and saves iptables firewall

  • 由上述结果中我们不难发现,我们在执行chkconfig on或者off的时候,其实只是改变了/etc/rc3.d里边的一个符号链接的的名字而已,其中k表示关闭s表示开启,后边的数字分别是启动的顺序和关闭的顺序。也就是#chkconfig:2345 08 92 的08和92

    (三)、添加脚本到chkconfig进行管理(一个栗子)

    [root@jiangjunwang ~]# vim /etc/init.d/test

    #chkconfig: 2345 88 88
    echo jiangjunwang
    ~
    [root@jiangjunwang init.d]# chmod +x test
    [root@jiangjunwang init.d]# chkconfig --add test
    [root@jiangjunwang init.d]# chkconfig test on
    [root@jiangjunwang init.d]# chkconfig --list test
    test 0:off 1:off 2:on 3:on 4:on 5:on 6:off
    [root@jiangjunwang init.d]# ll /etc/rc3.d/|grep "test"
    lrwxrwxrwx 1 root root 14 Sep 6 16:11 S88test -> ../init.d/test

三、一个案例了解/etc/skel目录

(一)、问出现如下错误应该如何解决?

[root@jiangjunwang skel]# su - jiangjunwang
-bash-4.1$
-bash-4.1$

  • 其实很简单我们只需要复制/etc/skel下边所有.bash文件到当前用户家目录即可

    -bash-4.1$ \cp -rf /etc/skel/.bash* /home/jiangjunwang/
    -bash-4.1$ logout
    [root@jiangjunwang ~]# su - jiangjunwang
    [jiangjunwang@jiangjunwang ~]$

(二)、为什么会这样?

  • 因为/etc/skel/目录是用来存放新用户配置文件的目录,当我们添加新用户的时候,这个目录下的所有文件会自动被复制到新添加的用户的家目录下。
    通过修改、添加、删除/etc/skel目录下的文件,我们可为新创建的用户提供统一的、标准的、初始化用户环境。
    /etc/skel/.bash_logout === 用户退出会运行里面的命令
    /etc/skel/.bash_profile === /etc/profile
    /etc/skel/.bashrc === /etc/bashrc

四、真假识别之md5sum

  • MD5算法一般用于检查文件完整性,尤其常用于检测在(网络)文件传输、拷贝、磁盘错误或其他无恶意涉入的情况下文件的正确性

    (一)、md5sum用法(一个栗子)

    [root@jiangjunwang ~]# md5sum a.txt
    53a8f548d07e3d0efff01d6af6943ab4 a.txt
    [root@jiangjunwang ~]# md5sum a.txt >police.log
    [root@jiangjunwang ~]# md5sum -c police.log
    a.txt: OK
    [root@jiangjunwang ~]# echo a>>a.txt
    [root@jiangjunwang ~]# md5sum -c police.log
    a.txt: FAILED
    md5sum: WARNING: 1 of 1 computed checksum did NOT match

五、Linux上方宝剑之sudo

  • 试想这样一个场景,开发人员需要查看一份具有root权限的日志,这是应该怎么做呢,可能你会想到suid或者把文件权限放开,这样虽然可以实现需求,但是对于系统来说都是不够安全的,这时候我们就可以想到Linux的上方宝剑了,sudo来进行按需分配,你要什么权限给什么权限!

    (一)、主要配置文件

  • sudo的配置文件在/etc/sudoers里边,建议使用visudo命令进行编辑该配置文件,因为此命令会对sudoers文件的语法做自检,方便我们及时发现错误.

  • 配置文件基本语法
用户或者组 机器=(授权角色) 可执行的命令
user MACHINE= COMMANDS
jiangjunwang ALL=(ALL) NOPASSWD:/bin/ls,/bin/touch

(二)、如何配置(一个栗子)

  • 给jiangjunwang用户授权以root身份执行ls,touch,passwd命令,但是禁止修改root用户密码

    [root@jiangjunwang ~]# visudo
    jiangjunwang ALL=(root) NOPASSWD:/bin/ls,/bin/touch /usr/bin/passwd [!-]*,!/usr/bin/passwd root
    [jiangjunwang@jiangjunwang ~]$ sudo -l
    Matching Defaults entries for jiangjunwang on this host:
    !visiblepw, always_set_home, env_reset, env_keep="COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC
    KDEDIR LS_COLORS", env_keep+="MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE",
    env_keep+="LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES", env_keep+="LC_MONETARY
    LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE", env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS
    _XKB_CHARSET XAUTHORITY", secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin

    User jiangjunwang may run the following commands on this host:
    (root) NOPASSWD: /bin/ls, (root) /bin/touch /usr/bin/passwd [!-]*, (root) !/usr/bin/passwd root
    [jiangjunwang@jiangjunwang ~]$ sudo ls /etc/passwd
    /etc/passwd
    [jiangjunwang@jiangjunwang ~]$ sudo passwd
    [sudo] password for jiangjunwang:
    Sorry, user jiangjunwang is not allowed to execute '/usr/bin/passwd' as root on jiangjunwang.
    [jiangjunwang@jiangjunwang ~]$

注释:NOPASSWD表示用户在执行命令的时候不需要输入密码,[!-]* 表示在输入命令时候必须带参数,因为在这里如果没有这个符号普通用户可以使用sudo passwd 对root用户的密码进行修改。

六、磁盘分区

现在主流的分区的方式有两种——MBR分区和GPT分区,fdisk命令支持的mbr分区方式 parted分区工具支持GPT和MBR的方式

(一)、添加一块100M的硬盘并把它永久挂载到/data01上(一个栗子)

  • 第一步:把硬盘插到服务器上,然后进行分区格式化

    [root@jiangjunwang ~]# fdisk -cu /dev/sdb
    Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
    Building a new DOS disklabel with disk identifier 0x174e0a0c.
    Changes will remain in memory only, until you decide to write them.
    After that, of course, the previous content won't be recoverable.

    Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)

    Command (m for help): n
    Command action
    e extended
    p primary partition (1-4)
    p
    Partition number (1-4): 1
    First sector (2048-209715199, default 2048):
    Using default value 2048
    Last sector, +sectors or +size{K,M,G} (2048-209715199, default 209715199):
    Using default value 209715199

    Command (m for help): p

    Disk /dev/sdb: 107.4 GB, 107374182400 bytes
    255 heads, 63 sectors/track, 13054 cylinders, total 209715200 sectors
    Units = sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disk identifier: 0x174e0a0c

    Device Boot Start End Blocks Id System
    /dev/sdb1 2048 209715199 104856576 83 Linux

    Command (m for help): w
    The partition table has been altered!

    Calling ioctl() to re-read partition table.
    Syncing disks.

  • 第二步通知/dev/sdb磁盘分区表变化了更新内核的硬盘分区表信息

    [root@jiangjunwang ~]# partprobe /dev/sdb

  • 第三步格式化分区;

    [root@jiangjunwang ~]# mkfs.ext4 /dev/sdb1
    mke2fs 1.41.12 (17-May-2010)
    Filesystem label=
    OS type: Linux
    Block size=4096 (log=2)
    Fragment size=4096 (log=2)
    Stride=0 blocks, Stripe width=0 blocks
    6553600 inodes, 26214144 blocks
    1310707 blocks (5.00%) reserved for the super user
    First data block=0
    Maximum filesystem blocks=4294967296
    800 block groups
    32768 blocks per group, 32768 fragments per group
    8192 inodes per group
    Superblock backups stored on blocks:
    32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
    4096000, 7962624, 11239424, 20480000, 23887872

    Writing inode tables: done
    Creating journal (32768 blocks): done
    Writing superblocks and filesystem accounting information: done

    This filesystem will be automatically checked every 32 mounts or
    180 days, whichever comes first. Use tune2fs -c or -i to override.

  • 第四步关闭磁盘自动检测功能

    [root@jiangjunwang ~]# tune2fs -c 0 -i 0 /dev/sdb1
    tune2fs 1.41.12 (17-May-2010)
    Setting maximal mount count to -1
    Setting interval between checks to 0 seconds

  • 第五步将分区挂载到目录

    [root@jiangjunwang ~]# mount /dev/sdb1 /data01/
    [root@jiangjunwang ~]# df -h
    Filesystem Size Used Avail Use% Mounted on
    /dev/sda3 17G 3.6G 13G 23% /
    tmpfs 932M 0 932M 0% /dev/shm
    /dev/sda1 190M 40M 141M 23% /boot
    /dev/sdb1 99G 60M 94G 1% /data01

  • 第六步永久挂载

    [root@jiangjunwang ~]# vim /etc/fstab
    /dev/sdb1 /data01 ext4 defaults 0 0

(二)、创建一个500M的文件并把它永久增加到swap中(一个栗子)

  • 第一步创建一个500M的空文件

    [root@jiangjunwang ~]# dd if=/dev/zero of=/tmp/test bs=1M count=500
    500+0 records in
    500+0 records out
    524288000 bytes (524 MB) copied, 0.446025 s, 1.2 GB/s

  • 第二步修改成swap类型

    [root@jiangjunwang ~]# mkswap /tmp/test
    mkswap: /tmp/test: warning: don't erase bootbits sectors
    on whole disk. Use -f to force.
    Setting up swapspace version 1, size = 511996 KiB
    no label, UUID=aa2a415e-96e6-46e4-84f9-44acad261a96

  • 第三步让他生效,激活交换分区

    [root@jiangjunwang ~]# swapon /tmp/test
    [root@jiangjunwang ~]# swapon -s
    Filename Type Size Used Priority
    /dev/sda2 partition 3071996 0 -1
    /tmp/test file 511996 0 -2

  • 第四步设置开机自启动让永久生效

    [root@jiangjunwang ~]# vim /etc/rc.local
    swapon /tmp/test

七、Linux三剑客

(一)、三剑客之sed

  • 语法
    sed [选项] [sed指令] [输入文件]
    8
选项 含义。 指令 含义
-n 取消默认输出 p 打印匹配内容
-r 支持扩展正则 a 在匹配行的下一行添加类容
-i 写入文件支持备份 i 在匹配行的上一行添加类容
s..g s表示替换g表示全局
(二)、一些栗子
  • 首先创建一个测试文件

    [root@jiangjunwang test]# cat >bb.txt<1 ni hao
    2 wo hao
    3 ta hao
    4 da jia hao
    5 wo men dou hao
    EOF

  • 打印第一行

    [root@jiangjunwang test]# sed -n '1p' bb.txt
    1 ni hao

  • 打印第二行到第四行的类容

    [root@jiangjunwang test]# sed -n '2,4p' bb.txt
    2 wo hao
    3 ta hao
    4 da jia hao

  • 显示包含“wo” 的行

    [root@jiangjunwang test]# sed -n '/wo/p' bb.txt
    2 wo hao
    5 wo men dou hao

  • 显示文件中包含“ni”的行到包含“ta”的行

    [root@jiangjunwang test]# sed -n '/ni/,/ta/p' bb.txt
    1 ni hao
    2 wo hao
    3 ta hao

  • 过滤包含“ni”和“ta”的行

    [root@jiangjunwang test]# sed -nr '/ni|ta/p' bb.txt
    1 ni hao
    3 ta hao

PS:sed里面的正则字符左右必须有“/”

  • 查询第2行和第四行的内容

    [root@jiangjunwang test]# sed -n '2p;4p' bb.txt
    2 wo hao
    4 da jia hao

  • 在第二行的下一行添加“xinlai”

    [root@jiangjunwang test]# sed '2a xinlai' bb.txt
    1 ni hao
    2 wo hao
    xinlai
    3 ta hao
    4 da jia hao
    5 wo men dou hao

  • 在包含wo hao字符串的下一行添加“xinlai”和aa两行

    [root@jiangjunwang test]# sed '/wo hao/axinlai\naa' bb.txt
    1 ni hao
    2 wo hao
    xinlai
    aa
    3 ta hao
    4 da jia hao
    5 wo men dou hao
    ps:\n表示换行

  • 删除第二行到最后一行类容

    [root@jiangjunwang test]# sed '2,$d' bb.txt
    1 ni hao

  • 不显示文件空行

    [root@jiangjunwang test]# sed '/^$/d' bb.txt
    1 ni hao
    2 wo hao
    3 ta hao
    4 da jia hao
    5 wo men dou hao
    [root@jiangjunwang test]# sed -n '/^$/!p' bb.txt
    1 ni hao
    2 wo hao
    3 ta hao
    4 da jia hao
    5 wo men dou hao

  • 把文件中wo替换成aa

    [root@jiangjunwang test]# sed 's/wo/aa/g' bb.txt
    1 ni hao
    2 aa hao
    3 ta hao
    4 da jia hao
    5 aa men dou hao

  • 把文件中wo替换成aa并备份原文件

    [root@jiangjunwang test]# sed -i.bak 's/wo/aa/g' bb.txt
    [root@jiangjunwang test]# ls
    bb.txt bb.txt.bak

  • 变量替换

    [root@jiangjunwang test]# x=wo
    [root@jiangjunwang test]# y=ni
    [root@jiangjunwang test]# sed "s/$x/$y/g" bb.txt
    1 ni hao
    2 ni hao
    3 ta hao
    4 da jia hao
    5 ni men dou hao

  • 除了下面5个服务以外都关闭crond sshd network sysstat rsyslog

    [root@jiangjunwang test]# chkconfig --list|sed -r 's#(.).0.#\1#'| egrep -v 'crond|sshd|network|sysstat|rsyslog'|sed -r 's#(.)#chkconfig \1 off#'|bash

    PS:() 扩展正则表达式 在sed中作用,能够记忆它包含的一段正则表达式,并可以通过\1 \2 \3 ... \9 调取出来 用法:sed -r '()'

    (二)、三剑客之awk

    一、语法:

    awk 参数 '模式{动作}' 文件
    awk 参数 '条件(找谁){干啥}' 文件

    二、一些栗子

    首先创建一个测试文件

    [root@jiangjunwang test]# cat >>reg.txt<Zhang Dandan 41117397 :250:100:175
    Zhang Xiaoyu 390320151 :155:90:201
    Meng Feixue 80042789 :250:60:50
    Wu Waiwai 70271111 :250:80:75
    Liu Bingbing 41117483 :250:100:175
    Wang Xiaoai 3515064655 :50:95:135
    Zi Gege 1986787350 :250:168:200
    Li Youjiu 918391635 :175:75:300
    Lao Nanhai 918391635 :250:100:175
    EOF

  • 显示Xiaoyu的姓氏和ID号码

    [root@jiangjunwang test]# awk '/Xiaoyu/{print $1,$2,$3}' reg.txt
    Zhang Xiaoyu 390320151
    *第2列中包含Xiaoyu的行
    [root@jiangjunwang test]# awk '$2~/Xiaoyu/' reg.txt
    Zhang Xiaoyu 390320151 :155:90:201

  • 显示所有以41开头的ID号码的人的全名和ID号码

    [root@jiangjunwang test]# awk '$3~/^41/{print $1,$2,$3}' reg.txt
    Zhang Dandan 41117397
    Liu Bingbing 41117483

  • 显示所有ID号码最后一位数字是1或5的人的全名

    [root@jiangjunwang test]# awk '$3~/1$|5$/{print $1,$2,$3}' reg.txt
    Zhang Xiaoyu 390320151
    Wu Waiwai 70271111
    Wang Xiaoai 3515064655
    Li Youjiu 918391635
    Lao Nanhai 918391635
    [root@jiangjunwang test]# awk '$3~/[15]$/{print $1,$2,$3}' reg.txt
    Zhang Xiaoyu 390320151
    Wu Waiwai 70271111
    Wang Xiaoai 3515064655
    Li Youjiu 918391635
    Lao Nanhai 918391635

  • 显示Xiaoyu的捐款.每个值时都有以$开头.如$520$200$135

    [root@jiangjunwang test]# awk '/Xiaoyu/{gsub(/:/,"$");print $1,$2,$4}' reg.txt
    Zhang Xiaoyu $155$90$201

三、awk特殊模式BEGIN和END
  • BEGIN{} BEGIN里面的内容,会在awk读取文件内容之前运行。
    测试,计算。

  • END{}*** END{}里面的内容,会在awk读取完文件的最后一行之后运行。
    用来显示最终结果。先计算,END显示结果。
    公式:
1、一个栗子
  • 统计/etc/services的空行
    [root@jiangjunwang test]# awk '/^$/{i=i+1}END{print i}' /etc/services
    16
    2、统计和计算awk数组

    i=i+1 == i++ 统计次数 计数
    i=i+$n == i+=$n 累计相加 累加

一些栗子
  • 1.9 通过awk同时分析access.log文件每个ip的重复数和每个ip使用的流量

    [root@jiangjunwang ~]# awk '{count[$1]++;sum[$1]+=$10}END{for(pol in sum)print "ip:"pol,"次数:"count[pol],"流量:"sum[pol]}' access.log
    ip:101.226.61.184 次数:5 流量:53581
    ip:27.154.190.158 次数:2 流量:31602
    ip:218.79.64.76 次数:2 流量:36438
    ip:114.94.29.165 次数:1 流量:491

  • 统计root用户在secure文件出现了多少次

    root@jiangjunwang ~]# awk '$9~/root/{i[$9]++}END{for(a in i )print i[a]}' secure-20161219
    364611

八、shell编程基础

(一)、if语句

语法:
单分支 if 条件 1;then;动作 fi
双分支 if 条件 1 ;then;动作1 else 动作2 fi
多分支 if 条件1 ;then动做1 elfi 条件2 then;动作2 else 动作3 fi

  • 一个小栗子之命令行比大小

    [root@jiangjunwang ~]# cat tesh.sh
    #bin/bash
    a=$1
    b=$2
    if [ $# -ne 2 ];then
    echo "Please input correct parameters."
    exit
    fi

    if [ $a -eq $b ];then
    echo "$a=$b"
    elif [ $a -gt $b ];then
    echo "$a>$b"
    else
    echo "$a<$b"
    fi

小结:
1.条件表达式
[ -d /oldboy ]
[ -f /oldboy/oldboy.txt ]
[ 10 -gt 9 ] great than >
[ 10 -ge 9 ] great equal >=
[ 10 -eq 10 ] equal ==
[ 10 -ne 9 ] not equal !=

[ 9 -lt 90 ] less than <
[ 9 -le 90 ] less equal <=

man test

[ -d /oldboy ] === test -d /oldboy
小结:特殊变量 位置$1 $2 $0 状态$? 参数个数$#

(二)、for循环

  • 语法:for 变量 in 变量接收的参数 do 执行的命令 done
  • 创建十个用户并生成随机密码并把信息追加到一个文件中(一个栗子)

    #bin/bash
    pass=$(date +%N)
    for user in bb{01..10}
    do
    useradd $user
    echo $pass|passwd --stdin $user
    echo $user:$pass>>/pass.txt
    done
    ~

  • 优化linux开机启动项目,只保留crond;sshd;network;rsyslog;sysstat,其他的都关闭(又一个栗子)

    [root@jiangjunwang ~]# for i in $(chkconfig --list |egrep -v "crond|sshd|rsyslog|sysstat|network"|awk '{print $1}'); do chkconfig $i off; done