1,什么是shell?
Shell 是一個命令解釋器,它的作用是解釋執行用戶輸入的命令及程序等,用戶輸入一條命令,Shell就解釋執行一條。這種從鍵盤一輸入命令,就可以立即得到回應的對法方式,稱之為交互的方式。
Shell存在於操作系統的最外層,負責直接與用戶對話,把用戶的輸入解釋給操作系統,並處理各種各樣的操作系統的輸出結果,輸出到屏幕返回給用戶,當我們輸入系統用戶名和密碼,登錄到Linux后的所有操作都是Shell解釋並執行的。
2,什么是Shell腳本?
了解Shell后,理解Shell腳本就簡單了。當命令或者程序語句不在命令行下執行,而是通過一個程序文件執行時,該程序就被稱為稱為Shell腳本。如果在Shell腳本里內置了很多條命令,語句及循環控制,然后一次性把這些命令執行完,這種通過文件執行腳本的方式,稱為非交互的方式。Shell腳本類似於DOS系統下的批處理程序。用戶可以在Shell腳本中敲入一系列的命令及語句組合。
這些命令,變量和流程控制語句等有機地結合就形成了一個功能強大的Shell腳本。
其實, shell script是利用shell的功能所寫的一個程式(program),這個程式是使用純文字檔,將一些shell的語法與指令(含外部指令)寫在里面,搭配正規表示法,管線命令與資料流重導向等功能,以達到我們所想要的處理目的。
所以,簡單的說,shell script 就像是早期 DOS 年代的批次檔 (.bat) ,最簡單的功能就是將許多指令匯整寫在一起, 讓使用者很輕易的就能夠 one touch 的方法去處理復雜的動作 (執行一個檔案 "shell script" ,就能夠一次執行多個指令)。 而且 shell script 更提供陣列、回圈、條件與邏輯判斷等重要功能,讓使用者也可以直接以 shell 來撰寫程式,而不必使用類似 C 程式語言等傳統程式撰寫的語法呢!
這么說你可以了解了嗎?是的! shell script 可以簡單的被看成是批次檔, 也可以被說成是一個程式語言,且這個程式語言由於都是利用 shell 與相關工具指令, 所以不需要編譯即可執行,且擁有不錯的除錯 (debug) 工具,所以,他可以幫助系統管理員快速的管理好主機。
簡而言之:shell 就是一個更有效的管理服務器的工具
3,為什么要學習shell腳本?
3.1 shell 是Linux底層核心
Linux/Unix系統的底層及基礎應用軟件的核心大都涉及Shell腳本的內容。每一個合格的Linux系統管理員或運維工程師,都需要熟練Shell腳本語言的編寫,並能夠閱讀系統及各類軟件附帶的Shell腳本內容,只有這樣才能提升運維人員的工作效率,適應日益復雜的工作環境,減少不必要的重復工作,從而為個人的職場發展奠定較好的基礎。
3.2 Linux運維工作常用工具
現在和Linux運維關聯最火的語言莫過於Python語言了,那么和Python語言相比, Shell具備天生不可替代的優勢,再處理系統底層的工作方面,例如:初始化、備份、啟動、停止、服務及監控報警等日常運維工作,用Shell會簡單、方便,而同樣的功能用其他語言就會復雜很多,因此, Shell腳本是企業中Linux自動化運維必備不可替代的工具。
3.3 自動化運維必備基礎工具
Devops時代,企業的運維不斷地變革,從幾年前傳統的手工運維,到現如今的自動化運維、平台化運維、智能化運維,所有的運維階段不管給用戶多么智能和多么高大上,最終處理和系統相關的服務和業務時,都必然離不開Shell腳本的支持, Shell腳本是Linux運維人員自動化高效運維必須要掌握的基本編程語言工具。
4,學習好Shell所需要的基礎
4.1 熟練使用VIM 編譯器
Linux下開發Shell腳本最常使用的編譯器是VIM,因此如果能熟練使用並配置好vim的各種高級功能設置,就可以讓開發Shell腳本達到事半功倍的效果。
4.2 熟練使用Linux常用命令
和其他的開發語言(例如:Python)不同,Shell腳本語言很少有可以直接使用外部函數庫,把Linux系統的命令看做Shell的函數庫,因此,對Linux系統常用命令的掌握程度就直接決定運維人員對Shell腳本編程的掌握程度。
4.3 熟練使用三劍客以及正則表達式
Linux正則表達式以及三劍客(grep、 sed、 awk)是Linux系統里所有命令中最核心的3個命令,每個命令加上正則表達式的知識后功能異常強大,如果能掌握它們,就可以在編寫Shell腳本中發揮更大的作用。
命令總結
1,線上查詢及幫助命令
1.1 man
man - format and display the on-line manual pages
查看幫助,man一下
man 命令 man 配置文件
1.2 help
例如: ls-help
--help是查看簡單幫助,沒有man詳細。沒有man的功能強大
1.3 info
info - read Info documents
2,文件和目錄操作命令
2.1 ls
ls - list directory contents
- -i 查看Inode
- -d 查看目錄
- -l 長格式顯示
- -a 查看所有文件(包括隱藏文件)
- -h --human -readable
[root@luffy ~]# ls luffy can [root@luffy ~]# ls -l total 4 drwxr-xr-x. 2 root root 4096 Dec 26 16:38 luffy -rw-r--r--. 1 root root 0 Dec 26 16:39 can [root@luffy ~]# ls -a . luffy .bash_logout .bashrc .cshrc .tcshrc .. .bash_history .bash_profile can .lesshst .viminfo [root@luffy ~]# ls -lh total 4.0K drwxr-xr-x. 2 root root 4.0K Dec 26 16:38 luffy -rw-r--r--. 1 root root 0 Dec 26 16:39 can [root@luffy ~]# ls -d luffy/ luffy/ [root@luffy ~]# ls luffy/ [root@luffy ~]#
2.2 cd
change directory
改變目錄
- . 當前目錄
- .. 上一級目錄
- - 上一次一次目錄
- ~ 家目錄
- 空格 (空白表示家目錄)
[root@luffy luffy]# cd /home/luffy/ [root@luffy luffy]# pwd /home/luffy [root@luffy luffy]# cd . [root@luffy luffy]# pwd /home/luffy [root@luffy luffy]# cd .. [root@luffy home]# pwd /home [root@luffy home]# cd ~ [root@luffy ~]# pwd /root [root@luffy ~]# cd - /home [root@luffy home]# pwd /home [root@luffy home]# cd [root@luffy ~]# pwd /root [root@luffy ~]#
2.3 cp
拷貝文件
cp - copy files and directories
- -a:此參數的效果和同時指定"-dpR"參數相同;
- -d:當復制符號連接時,把目標文件或目錄也建立為符號連接,並指向與源文件或目錄連接的原始文件或目錄;
- -f:強行復制文件或目錄,不論目標文件或目錄是否已存在;
- -i:覆蓋既有文件之前先詢問用戶;
- -l:對源文件建立硬連接,而非復制文件;
- -p:保留源文件或目錄的屬性;
- -R/r:遞歸處理,將指定目錄下的所有文件與子目錄一並處理;
- -s:對源文件建立符號連接,而非復制文件;
- -u:使用這項參數后只會在源文件的更改時間較目標文件更新時或是名稱相互對應的目標文件並不存在時,才復制文件;
- -S:在備份文件時,用指定的后綴“SUFFIX”代替文件的默認后綴;
- -b:覆蓋已存在的文件目標前將目標文件備份;
- -v:詳細顯示命令執行的操作。
[root@luffy luffy]# touch test [root@luffy luffy]# mkdir test.dir [root@luffy luffy]# /bin/cp test test.dir/ [root@luffy luffy]# ls test.dir/ test [root@luffy luffy]# /bin/cp -i test test.dir/ /bin/cp: overwrite \`test.dir/test\'? y [root@luffy luffy]# rm test.dir/test -f [root@luffy luffy]# chmod 755 test [root@luffy luffy]# /bin/cp test test.dir/ [root@luffy luffy]# ll test.dir/ total 0 -rw-r--r--. 1 root root 0 Dec 26 16:49 test [root@luffy luffy]# ll test -rwxr-xr-x. 1 root root 0 Dec 26 16:46 test [root@luffy luffy]# /bin/cp -p test test.dir/ [root@luffy luffy]# ll test.dir/ total 0 -rwxr-xr-x. 1 root root 0 Dec 26 16:46 test
2.4 find
查找
find - search for files in a directory hierarchy
- -type 類型
- -name 名字
2.5 mkdir
創建目錄
mkdir - make directories
- -p / -parents 若所要建立目錄的上層目錄目前尚未建立,則會一並建立上層目錄
[root@luffy luffy]# mkdir can/cc mkdir: cannot create directory `can/cc': No such file or directory [root@luffy luffy]# mkdir -p can/cc [root@luffy luffy]# ll can/ total 4 drwxr-xr-x. 2 root root 4096 Dec 26 17:17 cc
2.6 mv
移動或者改名文件
mv - move (rename) files
- --backup=<備份模式>:若需覆蓋文件,則覆蓋前先行備份;
- -b:當文件存在時,覆蓋前,為其創建一個備份;
- -f:若目標文件或目錄與現有的文件或目錄重復,則直接覆蓋現有的文件或目錄;
- -i:交互式操作,覆蓋前先行詢問用戶,如果源文件與目標文件或目標目錄中的文件同名,則詢問用戶是否覆蓋目標文件。用戶輸入”y”,表示將覆蓋目標文件;輸入”n”,表示取消對源文件的移動。這樣可以避免誤將文件覆蓋。
- --strip-trailing-slashes:刪除源文件中的斜杠“/”;
- -S<后綴>:為備份文件指定后綴,而不使用默認的后綴;
- --target-directory=<目錄>:指定源文件要移動到目標目錄;
- -u:當源文件比目標文件新或者目標文件不存在時,才執行移動操作。
2.7 pwd
顯示當前目錄路徑
pwd - print name of current/working directory
[root@luffy luffy]# pwd /home/luffy [root@luffy luffy]#
2.8 rename
重命名
rename - Rename files
2.9 rm
刪除文件或者目錄
rm - remove files or directories
- -r
- -f
[root@AIGE test]# pwd /root/test [root@AIGE test]# mkdir test1 [root@AIGE test]# touch test1 [root@AIGE test]# touch test2 [root@AIGE test]# ls test1 test2 [root@AIGE test]# rm test2 rm: remove regular empty file `test2'? n [root@AIGE test]# rm -f test2 [root@AIGE test]# ls test1 [root@AIGE test]# rm -rf test1 [root@AIGE test]# ls [root@AIGE test]#
2.10 rmdir
刪除空目錄
rmdir - remove empty directories
[root@AIGE test]# pwd /root/test [root@AIGE test]# mkdir test1 [root@AIGE test]# mkdir -p test2/test [root@AIGE test]# rmdir test1 [root@AIGE test]# rmdir test2/ rmdir: failed to remove `test2/': Directory not empty [root@AIGE test]#
2.11 touch
改變文件的時間戳(可以改變已經存在的目錄時間戳)
touch - change file timestamps
可以創建一個文件: [root@AIGE test]# ls [root@AIGE test]# pwd /root/test [root@AIGE test]# touch test [root@AIGE test]# ll total 0 -rw-r--r--. 1 root root 0 Dec 27 08:21 test 修改時間戳
2.12 tree
以樹形結構列表出目錄
tree - list contents of directories in a tree-like format.
- -L 數字
- -d 只顯示目錄
2.13 basename
帶目錄和文件名的后綴
basename - strip directory and suffix from filenames
2.14 dirname
dirname - strip non-directory suffix from file name
2.15 chattr
chattr命令用來改變文件屬性
chattr - change file attributes on a Linux file system
這項指令可改變存放在ext2文件系統上的文件或者目錄屬性,這些屬性共有以下8中模式:
- a:讓文件或目錄僅供附加用途;
- b:不更新文件或目錄的最后存取時間;
- c:將文件或目錄壓縮后存放;
- d:將文件或目錄排除在傾倒操作之外;
- i:不得任意更動文件或目錄;
- s:保密性刪除文件或目錄;
- S:即時更新文件或目錄;
- u:預防意外刪除。
2.16 lsattr
lsattr 命令用於查看文件的第二擴展文件系統屬性。
lsattr - list file attributes on a Linux second extended file system
- -E:可顯示設備屬性的當前值,但這個當前值是從用戶設備數據庫中獲得的,而不是從設備直接獲得的。
- -D:顯示屬性的名稱,屬性的默認值,描述和用戶是否可以修改屬性值的標志。
- -R:遞歸的操作方式;
- -V:顯示指令的版本信息;
- -a:列出目錄中的所有文件,包括隱藏文件。
2.17 file
確定文件的類型
file - determine file type
2.18 MD5sum
采用MD5報文摘要算法(128位)計算和檢查文件的校驗和
md5sum - compute and check MD5 message digest
習題
-
監控MySQL主從同步是否異常,如果異常,則發送短信或者郵件給管理員。提示:如果沒主從同步環境,可以用下面文本放到文件里讀取來模擬: 階段1:開發一個守護進程腳本每30秒實現檢測一次。 階段2:如果同步出現如下錯誤號(1158,1159,1008,1007,1062),則跳過錯誤。 階段3:請使用數組技術實現上述腳本(獲取主從判斷及錯誤號部分)
-
使用for循環在/Luffy目錄下通過隨機小寫10個字母加固定字符串Luffy批量創建10個html文件,名稱例如為:
[root@luffy luffy]# sh /server/scripts/luffy.sh [root@luffy luffy]# ls coaolvajcq_luffy.html qnvuxvicni_luffy.html vioesjmcbu_luffy.html gmkhrancxh_luffy.html tmdjormaxr_luffy.html wzewnojiwe_luffy.html jdxexendbe_luffy.html ugaywanjlm_luffy.html xzzruhdzda_luffy.html qcawgsrtkp_luffy.html vfrphtqjpc_luffy.html
-
請用至少兩種方法實現! 將以上文件名中的Luffy全部改成nami(用for循環實現),並且html改成大寫。
-
批量創建10個系統帳號Luffy01-Luffy10並設置密碼(密碼為隨機8位字符串)。
-
寫一個腳本,實現判斷10.0.0.0/24網絡里,當前在線用戶的IP有哪些(方法有很多) 注意:此腳本使用nmap,如果沒有需要使用yum -y install nmap
-
寫一個腳本解決DOS攻擊生產案例 提示:根據web日志或者或者網絡連接數,監控當某個IP並發連接數或者短時內PV達到100,即調用防火牆命令封掉對應的IP,監控頻率每隔3分鍾。防火牆命令為:iptables -I INPUT -s 10.0.1.10 -j DROP。
-
開發mysql多實例啟動腳本: 已知mysql多實例啟動命令為:mysqld_safe--defaults-file=/data/3306/my.cnf &
停止命令為:mysqladmin -u root -pLuffy123 -S /data/3306/mysql.sockshutdown
請完成mysql多實例啟動啟動腳本的編寫
要求:用函數,case語句、if語句等實現 -
如何實現對MySQL數據庫進行分庫備份,請用腳本實現
-
如何實現對MySQL數據庫進行分庫加分表備份,請用腳本實現
-
請用至少兩種方法實現! bash for循環打印下面這句話中字母數不大於6的單詞
-
開發shell腳本分別實現以腳本傳參以及read讀入的方式比較2個整數大小。以屏幕輸出的方式提醒用戶比較結果。注意:一共是開發2個腳本。當用腳本傳參以及read讀入的方式需要對變量是否為數字、並且傳參個數做判斷。
-
打印選擇菜單,一鍵安裝Web服務:
[root@Luffyscripts]# sh menu.sh 1.[install lamp] 2.[install lnmp] 3.[exit] pls input the num you want:
要求:
1、當用戶輸入1時,輸出“startinstalling lamp.”然后執行/server/scripts/lamp.sh,腳本內容輸出"lampis installed"后退出腳本; 2、當用戶輸入2時,輸出“startinstalling lnmp.”然后執行/server/scripts/lnmp.sh輸出"lnmpis installed"后退出腳本; 3、當輸入3時,退出當前菜單及腳本; 4、當輸入任何其它字符,給出提示“Input error”后退出腳本。 5、要對執行的腳本進行相關條件判斷,例如:腳本是否存在,是否可執行等。
-
如下 1、監控web服務是否正常,不低於3種監控策略。
2、監控db服務是否正常,不低於3種監控策略。
要求間隔1分鍾,持續監控。
思路
1、監控的三種方式
通過進程名監控 ps -ef|grep name
通過端口監控 netstat -lntup|grep port/lsof -i:80
通過鏈接信息上的進程名 netstat -lntup|grep port
2、等待一分鍾
3、后台執行 nohup -
監控memcache服務是否正常,模擬用戶(web客戶端)檢測。 使用nc命令加上set/get來模擬檢測,以及監控響應時間及命中率。
-
面試及實戰考試題:監控web站點目錄(/var/html/www)下所有文件是否被惡意篡改(文件內容被改了),如果有就打印改動的文件名(發郵件),定時任務每3分鍾執行一次(10分鍾時間完成)。
-
寫網絡服務獨立進程模式下rsync的系統啟動腳本 例如:/etc/init.d/rsyncd{start|stop|restart}。 要求: 1.要使用系統函數庫技巧。 2.要用函數,不能一坨SHI的方式。 3.可被chkconfig管理。
-
要求: 抓鬮 1、執行腳本后,想去的同學輸入英文名字全拼,產生隨機數01-99之間的數字,數字越大就去參加項目實踐,前面已經抓到的數字,下次不能在出現相同數字。 2、第一個輸入名字后,屏幕輸出信息,並將名字和數字記錄到文件里,程序不能退出繼續等待別的學生輸入。
-
已知下面的字符串是通過RANDOM隨機數變量md5sum|cut-c 1-8截取后的結果,請破解這些字符串對應的md5sum前的RANDOM對應數字?
-
批量檢查多個網站地址是否正常 要求: shell數組方法實現,檢測策略盡量模擬用戶訪問思路
-
用shell處理以下內容 1、按單詞出現頻率降序排序! 2、按字母出現頻率降序排序!
-
【LVS主節點】手工開發ipvsadm管理lvs的腳本ip_vs
實現:/etc/init.d/lvs {start|stop|restart}
-
【LVS主節點】模擬keepalived健康檢查功能管理LVS節點, 當節點掛掉(檢測2次,間隔2秒)從服務器池中剔除,好了(檢測2次,間隔2秒)加進來 提示:利用ipvsadm命令實現添加和減少LVS節點。
-
【LVS客戶端節點】開發LVS客戶端設置VIP以及抑制ARP的管理腳本 實現:/etc/init.d/lvsclient {start|stop|restart}
-
【LVS備節點】模擬keepalved vrrp功能,監聽主節點,如果主節點不可訪問則備節點啟動並配置LVS實現接管主節點的資源提供服務(提醒:注意ARP緩存)
- 請用shell或Python編寫一個正方形(Luffy_square.sh),接收用戶輸入的數字。
- 請用shell或Python編寫一個等腰三角形(Luffy2_triangle.sh),接收用戶輸入的數字。
- 請用shell或Python編寫一個畫直角梯形程序(Luffy4.sh),接收用戶輸入的參數n,m