《shell編程實戰》第2章shell腳本入門(中)

一、寫第一個shell腳本
寫腳本以前的準備工做:
因爲vim比vi強大,一般選用vim編輯器取代vi。具體操做方法爲:
[root@thzzc1994 ~]# echo "alias vi=vim" >> /etc/profile
[root@thzzc1994 ~]# tail -1 /etc/profile
alias vi=vim
[root@thzzc1994 ~]# source /etc/profile
二、第一行寫腳本編輯器
咱們如今寫的腳本,第一行通常都是#!/bin/bash。不一樣的腳本的解釋器是不同的,好比:
#!/usr/bin/expect #<==expect解決交互式的語言開頭解釋器
#!/usr/bin/perl #<==perl語言解釋器
#!/usr/bin/env python #<==python語言解釋器
若是這些腳本的第一行不指定解釋器,那麼就要用對應的解釋器來執行腳本,這樣才能確保腳本正確執行。例如:
若是是Shell腳本,就用bash test.sh執行test.sh。
若是是Python腳本,就用python test.py執行test.py。
若是是expect腳本,就用expect test.exp執行test.exp。
三、查看bash版本
cat /etc/redhat-release
bash --version
四、檢測bash漏洞
檢測方法:
[root@thzzc1994 ~]# env x='() { :;};echo be careful' bash -c "echo this is a test"
be careful
this is a test
若是輸出be careful,表示說明須要儘快升級了
[root@thzzc1994 ~]# rpm -qa bash
bash-4.1.2-14.el6.x86_64
而書中老男孩無漏洞版本爲4.1.2-40
看來我須要儘快升級bash了
爲了展現破殼漏洞,咱們不如破解bash看看。下面是網上找的一篇我認爲寫得比較全的。
破解方法:(我沒看懂,但要相信咱們之後必定能看懂!)
http://www.javashuo.com/article/p-kxbnclal-gg.html
升級方法:
[root@thzzc1994 ~]# yum update bash -y >/dev/null && echo install ok
There are unfinished transactions remaining. You might consider running yum-complete-transaction first to finish them.
install ok
[root@thzzc1994 ~]# env x='() { :;};echo be careful' bash -c "echo this is a test"
this is a test
若是沒有輸出be careful,則bash沒有漏洞。說明升級成功了。
[root@thzzc1994 ~]# rpm -qa bash
bash-4.1.2-40.el6.x86_64
檢驗一下,果真跟老男孩的版本同樣了。
五、重視註釋
開發腳本時,若是沒有註釋,那麼團隊裏的其餘人就會很難理解腳本對應內容的用途,並且若是時間過長,本身也會忘記。所以,咱們要儘可能養成爲shell腳本書寫關鍵註釋的習慣,書寫註釋不光是爲了方便別人,更是爲了方便本身,避免影響團隊的協做效率,以及給後來接手的人帶來維護困難。
其實,不止腳本,包括/etc/rc.local、/etc/exports、/var/spool/cron/root等系統文件都儘可能加上註釋。這不是必須的,但能反映一個優秀運維的習慣和規範。
特別提示:腳本中儘可能不要使用中文,防止本機或切換系統環境後中文亂碼的困擾。若是非要加中文,清根據自身狀況對字符集進行調整,如:export LANG="zh_CN.UTF-8",而且在腳本中從新定義字符集設置,和系統保持一致。
另外,linux中全部字母、符號(包括單引號、雙引號和反引號)都應該是英文狀態下的符號,這點須要特別注意。
六、shell腳本啓動流程
(1)腳本運行時,會先調用系統環境配置文件,配好環境變量。其順序爲:
/etc/profile==>~/.bash_profile==>~/.bashrc==>/etc/bashrc
(2)父腳本生成==>請求新進程==>子腳本生成==>子腳本結束==>父腳本結束
提示:設置linux的crond任務時,最好在腳本中從新定義環境變量,不然,部分系統環境變量不會被加載。
七、執行腳本的四種方法
(1)bash xx.sh或sh xx.sh,適用於腳本沒有可執行權限x或腳本沒有解釋器的時候。(老男孩推薦)
(2)path/xx.sh或./xx.sh,該方法須要可執行權限x
(3)source xx.sh或. xx.sh。區別於其餘方法,該方法會在當前父shell中加載並執行相關腳本,而其餘方法都會啓動新的進程執行子腳本。好處是,使用source或.能夠將xx.sh自身腳本中的變量值或函數等返回值傳遞到當前父shell腳本中使用。
(4)sh<xx.sh或cat xx.sh|sh,老男孩將它用於將字符串拼接成命令再經由管道交給bash操做。python

附錄:
一、如何判斷環境文件加載的前後順序?
參考網上export加變量方法,不能解釋所有文件,不行;又參考touch&&man --full-time,四個時間戳如出一轍。網上兩種方法都不行,因而本身想到一種方法,以下:
執行以下命令(試過了,這四行的前後順序不影響),而後重啓。
[root@thzzc1994 ~]# echo "rm etcprofile">>/etc/profile
[root@thzzc1994 ~]# echo "rm etcbashrc">>/etc/bashrc
[root@thzzc1994 ~]# echo "rm homebashrc">>~/.bashrc
[root@thzzc1994 ~]# echo "rm homebashprofile">>~/.bash_profile
[root@thzzc1994 ~]# reboot
登陸進去之後,會看到以下提示:
rm: 沒法刪除"etcprofile": 沒有那個文件或目錄
rm: 沒法刪除"etcbashrc": 沒有那個文件或目錄
rm: 沒法刪除"homebashrc": 沒有那個文件或目錄
rm: 沒法刪除"homebashprofile": 沒有那個文件或目錄
總結:不難看出,調用順序爲/etc/profile==>/etc/bashrc==>~/.bashrc==>~/.bash_profile。
----大體看這種方法,好像沒有問題。但是這四個文件存在着相互調用關係,還能這樣搞麼?在~/.bash_profile中,發現就調用過~/.bashrc。
不難在~/.bash_profile中找到
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
一樣,在~/.bashrc中找到
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
受到啓發,修改四句echo,把echo放到文件的最開頭去,修改完保存,從新登錄,提示變成:
rm: cannot remove `etcprofile': No such file or directory
rm: 沒法刪除"homebashprofile": 沒有那個文件或目錄
rm: 沒法刪除"homebashrc": 沒有那個文件或目錄
rm: 沒法刪除"etcbashrc": 沒有那個文件或目錄
這才終於應了那個順序:/etc/profile==>~/.bash_profile==>~/.bashrc==>/etc/bashrclinux

相關文章
相關標籤/搜索