用慘痛教訓換來經驗
常常使用Linux做為系統的工程師應該都不陌生ln這個指令
ln是對資料夾建立超連結的指令

以下範例

[email protected]: ~ -> cd /tmp
[email protected]: tmp ->  ln -s /opt/web/home/



第一行cd切換目錄到/tmp
第二行是建立超連結到當前目錄(/tmp)並指向/opt/web/home

會得到結果


[email protected]: tmp -> ll
total 0
lrwxr-xr-x 1 root wheel 14 Jan 25 22:59 home ->/opt/web/home


可以看到我們將home這個資料夾成功建立超連結到/tmp



那什麼是超連結?
所謂超連結就是類似windows作業系統的"捷徑",可以藉由超連結的資料夾讀取與原資料夾資料同步的資料
很難理解嗎?   其實就是資料夾的影分身這麼簡單而已,主體是同一個。



那ln這麼簡單的指令會出現哪些問題? 問題可大了
魔鬼藏在細節裡



當你要解除超連結,你會怎麼下指令? rm吧
對 就是rm,反正直接移除超連結跟windows移除捷徑一樣,真正的資料夾是不會影響的吧

錯! 大錯特錯!!

[email protected]: tmp -> ll home/
total 0
-rw-r--r-- 1 root whell 0 Jan 25 23:13 test
[email protected]: tmp -> rm -rf home/
[email protected]: tmp -> ll
total 0
lrwxr-xr-x 1 root wheel 14 Jan 25 22:59 home -> /opt/web/home
[email protected]: tmp -> ll home/

ls: home/: No such file or directory

發現了嗎?


當你下rm -rf home/   超連結的資料夾並未真正被刪除
但是,裡面的資料卻全部都被刪除了
這是為什麼? 因為超連結被linux視為檔案的一種
而你參數-r 代表遞迴,所以他會將你資料夾內檔案遞迴刪除,但資料夾本身不會被刪除。

這很嚴重,而且難以發現。





那正確的指令下法呢?

[email protected]: tmp -> ll home/
total 0
-rw-r--r-- 1 root wheel 0 Jan 25 23:18 test
[email protected]: tmp -> rm -rf home
[email protected]: tmp -> ll
total


看出差別了嗎?

只差了一個/

如果你下rm -rf 目錄/ ,便會遞迴刪除裡面的檔案
但如果是rm -rf 目錄 ,便可以成功移除超連結

或是使用unlink也可以成功移除超連結



今天上班就不小心犯了這個很低級的失誤,幸好資料有備份,不然這個年大概不太好過了。




重點整理:

我使用的環境是CentOS

ln -s 目錄    是建立超連結
移除超連結請務必將/去掉,不然會變成遞迴刪除資料夾裡檔案

CentOS 5的版本如果你加上/會提示你無法刪除
但CentOS 6 如果你加上斜線/就真的都把檔案刪除了

使用上請務必小心,或是改用unlink也較為安全

慘痛的教訓,希望自己不要再犯了,真的很該死。





2017-01-25  11:25  David in Tainan