說明:本文爲老男孩linux培訓某節課前考試試題及答案分享博文內容的一部分,也是獨立成題的,你可以點下面地址查看全部的內容信息。
http://oldboy.blog.51cto.com/2561410/791245
特別說明:答題的思路技巧可能比做題本身更重要,這也是老男孩特別教導學生的學習方法。
5.查找當前目錄下所有文件,並把文件中的www.etiantian.org字符串替換成www.oldboy.cc
解答:
通過find命令查找,然後通過-exec參數調用sed命令完成替換
find . -type f -exec sed -i 's/www\.etiantian\.org/oldboy\.cc/g'{} \;
#→這個命令是錯誤的語法,僅結尾{}前少了個空格,細節決定成敗啊!
find . -type f -exec sed -i 's/www\.etiantian\.org/oldboy\.cc/g' {} \;
#→這個命令是正確的語法,點號爲特殊字符,使用\來轉義(除去特殊字符代表的特殊含義,使用其本身的原始意義)。對於本題可以不用轉義。
find . -type f -exec sed -i 's/www.oldboy.cc/www.etiantian.org/g' {} \; #→此處不轉義也可以。
find . -type f -exec sed -i 's#www.etiantian.org#www.oldboy.cc#g' {} \;
說明:此題考察find,sed命令的組合使用,是非常常用,好用的兩個命令,必須精通之。
案例實踐:
[root@oldboy test]# echo www.etiantian.org >test.txt #→創建測試文件,錄入wwww.etiantian.org
[root@oldboy test]# echo www.etiantian.org >ett.txt #→創建測試文件,錄入wwww.etiantian.org
[root@oldboy test]# cat test.txt ett.txt
www.etiantian.org
www.etiantian.org
[root@oldboy test]# ls
ett.txt test.txt
[root@oldboy test]# find . -type f -exec sed -i 's/www.etiantian.org/oldboy.cc/g' {} \;
#→查找當前目錄(點表示當前目錄),所有文件,然後把文件中的www.etiantian.org的字符串,替換爲oldboy.cc
[root@oldboy test]# cat ett.txt test.txt
oldboy.cc#→修改後的結果,原來是www.etiantian.org
oldboy.cc
[root@oldboy test]# find . -type f -exec sed -i 's#oldboy.cc#www.etiantian.org#g' {} \;
[root@oldboy test]# cat ett.txt test.txt
www.etiantian.org #→修改後的結果,剛剛是oldboy.cc
如果是語法錯誤就會出現如下提示:
[root@oldboy test]# find . -type f -exec sed -i 's#oldboy.cc/www.etiantian.org/g'{} \;
sed: -e expression #1, char 40: unterminated `s' command
sed: -e expression #1, char 41: unterminated `s' command
[root@oldboy test]# find . -type f -exec sed -i 's#oldboy.cc/www.etiantian.org/g' {}\;
find: missing argument to `-exec'
正確錯誤命令對比:
find . -type f -exec sed -i 's#oldboy.cc/www.etiantian.org/g'{} \; #→錯誤命令
find . -type f -exec sed -i 's#oldboy.cc/www.etiantian.org/g' {}\; #→錯誤命令
find . -type f -exec sed -i 's#oldboy.cc#www.etiantian.org#g' {} \; #→正確命令,大括號前後各多了個空格,這也是find命令的語法寫法。
參考man find幫助案例:
EXAMPLES
find /tmp -name core -type f -print | xargs /bin/rm -f
Find files named core in or below the directory /tmp and delete them. Note that this will work incorrectly if there are any filenames containing newlines, single or double quotes, or spaces.
find /tmp -name core -type f -print0 | xargs -0 /bin/rm -f
Find files named core in or below the directory /tmp and delete them, processing filenames in such a way that file or directory names containing single or double quotes, spaces or newlines are correctly handled. The -name test comes before the -type test in order to avoid having to call stat(2) on every file.
find . -type f -exec file '{}' \;
例:查看找所有文件並查看文件類型
[root@oldboy test]# find . -type f -exec file '{}' \;
./ett.txt: ASCII text
./test.txt: ASCII text
[root@oldboy test]# find . -type f -exec file {} \;
./ett.txt: ASCII text
./test.txt: ASCII text
學生典型答案:
答案1:
解答: # grep "www.etiantian.org" * |tr "www.etiantian.org" oldboy.cc
老男孩老師點評:這是錯誤答案。
答案2:
find . -type f |sed -i s/www.ethiantian.org/www.oldboy.cc/g
老男孩老師點評:這是不規範的正確答案,加引號比較好。
答案3:
find . -type f |xargs sed -i s/www.ethiantian.org/www.oldboy.cc/g
老男孩老師點評:此答案思路也可以,注意加引號。
生產環境正式案例:
這是一個幾年前老男孩老師給一家IT公司做技術顧問時遇到的一個實際問題,情況是:
一個lamp的服務器,站點目錄下所有文件均被植入瞭如下內容:
<script language=javascript src=http://%4%66E%78%
包括圖片文件也被植入了,網站打開時就會調用這個地址,造成的影響很惡劣。
雖然問題現在看起來簡單,但當時該公司的兩個linux運維花了很久都沒搞定,後來給老男孩電話。5分鐘內搞定。
實際解決辦法:
思路是:需要遍歷所有目錄所有文件 把以上被植入的內容刪除掉。
實踐演示:
[root@oldboy test]# cat guanggao.txt #→模擬被竄改的文件,多個。
<script language=javascript src=http://%64%64%66%2E%78%
處理命令:
法一:
[root@oldboy test]#find . -type f -exec sed -i 's#<script language=javascript src=http://%64%64%66%2E%78%
#→就是本題的命令使用方法。
法二:
find sed刪除 正則
匹配:?google_ad ,包含字符串?google_ad的內容的行刪除。
[root@oldboy oldboy]# find . -type f -exec sed -i '/^.*\?google_ad/d' {} \;
特別提示:法二的方法,容易把程序裏的其他正常內容刪除掉,匹配關鍵字很重要,因此不建議使用法二。
如果用完整匹配刪除則很麻煩:
find . -type f -exec sed -i '/<script language=javascript src=http://%64%64%66%2E%78%
sed: -e expression #1, char 40: unknown command: `/'
sed: -e expression #1, char 40: unknown command: `/'
sed: -e expression #1, char 40: unknown command: `/'
sed: -e expression #1, char 40: unknown command: `/'
sed: -e expression #1, char 40: unknown command: `/'
sed: -e expression #1, char 40: unknown command: `/'
處理後的結果
[root@oldboy test]# cat guanggao.txt
當時的處理過程:
1、和運維人員確認確實出問題了。並詳細確認問題情況。
2、制定處理方案,先備份數據,然後,執行命令批量修改回來。
3、寫解決說明(類似本例這樣),寫完發給他們的運維。
4、詢問處理結果,並告知詳細查看日誌,問題發生來源。
5、提供亡羊補牢解決方案(站點目錄嚴格權限規劃方案及新上線規範思路)。
站點目錄嚴格權限規劃方案及新上線規範思路,請參考:
老男孩linux實戰培訓教案-Linux文件和目錄的屬性及權限精華講解
老男孩linux實戰培訓教案-LAMP/LNMP生產環境40條優化軍規精華講解
老男孩linux實戰培訓教案-生產環境sina,baidu,騰訊門戶站上線發佈代碼方案精華講解
特別說明:find,sed是工作中極其重要的兩個命令,同學們必須詳細總結,並掌握之。可參考:
《老男孩linux實戰培訓教案-強大的流編輯器sed詳解指南及經典生產案例》
《老男孩linux實戰培訓教案--find詳解指南及經典生產案例》