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

相關文章
相關標籤/搜索