Linux進階知識點(1)
(一)、crond介紹
- crond 是linux下用來周期性的執行某種任務或等待處理某些事件的一個守護進程,與windows下的計劃任務類似,當安裝完成操作系統後,默認會安裝此服務 工具,並且會自動啟動crond進程,crond進程每分鐘會定期檢查是否有要執行的任務,如果有要執行的任務,則自動執行該任務。
(二)、任務調度
- Linux下的任務調度分為兩類,系統任務調度和用戶任務調度。
1、系統任務調度
系統周期性所要執行的工作,比如寫緩存數據到硬盤、日誌清理等。在/etc目錄下有一個crontab文件,這個就是系統任務調度的配置文件。
2、用戶定期要執行的工作,比如用戶數據備份、定時郵件提醒等。用戶可以使用 crontab 工具來定制自己的計劃任務。所有用戶定義的crontab 文件都被保存在 /var/spool/cron目錄中。其文件名與用戶名一致。 -
crontab格式
- 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/binUser 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 209715199Command (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: 0x174e0a0cDevice Boot Start End Blocks Id System
/dev/sdb1 2048 209715199 104856576 83 LinuxCommand (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, 23887872Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: doneThis 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<<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
一、語法:
awk 參數 ‘模式{動作}‘ 文件
awk 參數 ‘條件(找誰){幹啥}‘ 文件二、一些栗子
首先創建一個測試文件
[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
三、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
162、統計和計算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
fiif [ $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
Linux進階知識點(1)