Linux进阶知识点(1)

1、定时任务

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

  • crontab特殊符号
    一、星号(*):表明全部可能的值,例如month字段若是是星号,则表示在知足其它字段的制约条件后每个月都执行该命令操做。
    二、逗号(,):能够用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9”
    三、中杠(-):能够用整数之间的中杠表示一个整数范围,例如“2-6”表示“2,3,4,5,6”
    四、正斜线(/):能够用正斜线指定时间的间隔频率,例如“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 ) linux

2、如何让一个脚本或者命令能够开机自启

(一)、把命令或脚本放在/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和92shell

    (三)、添加脚本到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/testvim

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

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

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

  • 其实很简单咱们只须要复制/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

4、真假识别之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缓存

5、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用户的密码进行修改。

6、磁盘分区

如今主流的分区的方式有两种——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

7、Linux三剑客

(一)、三剑客之sed

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

    [root@jiangjunwang test]# cat >bb.txt<<EOF
    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

    1、语法:

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

    2、一些栗子

    首先建立一个测试文件

    [root@jiangjunwang test]# cat >>reg.txt<<EOF
    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

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

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

8、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

相关文章
相关标签/搜索