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

朝圣
前言

程序員必須掌握一定的運(yùn)維知識耕挨。本文通過一些邪惡,搞破壞的方式尉桩。教會你一些危險的腳本操作筒占。

附贈

運(yùn)維意識與運(yùn)維規(guī)范
1.線上操作規(guī)范
      測試使用、Enter前再三確認(rèn)蜘犁、忌多人同時操作翰苫、先看再備份后改
2.涉及數(shù)據(jù)
      慎用rm –rf、備份大于一切这橙、穩(wěn)定大于一切奏窑、保密大于一切
3.涉及安全
      Ssh、防火墻屈扎、精細(xì)權(quán)限控制粒度埃唯、入侵檢測和日志監(jiān)控
4.日常監(jiān)控
      系統(tǒng)運(yùn)行狀況、 服務(wù)運(yùn)行狀況鹰晨、日志監(jiān)控(安全)
5.性能調(diào)優(yōu)
      深入了解運(yùn)行機(jī)制墨叛、調(diào)優(yōu)框架以及先后、每次只調(diào)一個參數(shù)模蜡、 基準(zhǔn)測試
6.運(yùn)維心態(tài)
      控制心態(tài)漠趁、對數(shù)據(jù)負(fù)責(zé)、追根究底忍疾、測試和生產(chǎn)環(huán)境 

下面再強(qiáng)調(diào)幾句

警告闯传,切勿在生產(chǎn)環(huán)境體驗,一切后果腳本作者和本文作者均不不承擔(dān)任何法律責(zé)任膝昆!

警告丸边,切勿在生產(chǎn)環(huán)境體驗,一切后果腳本作者和本文作者均不不承擔(dān)任何法律責(zé)任荚孵!

警告,切勿在生產(chǎn)環(huán)境體驗纬朝,一切后果腳本作者和本文作者均不不承擔(dān)任何法律責(zé)任收叶!

重要的事,說三遍

腳本

腳本主要由一些別名共苛、函數(shù)判没、環(huán)境變量定義組織而成蜓萄,執(zhí)行該腳本后,你的 shell 環(huán)境就變成了一個光怪陸離的世界澄峰。本文主要使用bash環(huán)境嫉沽,其他shell支持不能保證。如果您好奇俏竞,可以將這些內(nèi)容遷移到宇宙第一shell fish上.腳本很簡單绸硕。通過腳本可以方便快速的實現(xiàn)一個小功能。對服務(wù)器的運(yùn)維管理離不開腳本魂毁。

1. 可怕的默認(rèn)編輯器

當(dāng)系統(tǒng)調(diào)用默認(rèn)編輯器來編輯比如 crontab 時玻佩,biu 的一下,文件沒了席楚!

export EDITOR=/bin/rm;

學(xué)習(xí)課堂:
EDITOR 環(huán)境變量用于定于系統(tǒng)的默認(rèn)編輯器咬崔,在一些系統(tǒng)內(nèi)置功能里面,比如編輯 crontab 時烦秩,會根據(jù)該變量調(diào)用默認(rèn)編輯器. 默認(rèn)編輯器垮斯,就是使用它打開一些文檔。這是將 EDITOR 環(huán)境變量定義為 rm只祠,而它原本應(yīng)該是 vi甚脉、emacs 或 nano 的,體會一下铆农,是不是很想哭牺氨?如果不知道,排錯都夠你搞一段時間的墩剖。

2. 猥瑣的制表符(tab)

當(dāng)你想用制表符來個自動補(bǔ)全時猴凹,你會它非但不干,而且還刪除了一個字母岭皂,不信邪的你使勁多砸了幾個制表符郊霎,這下好了,更多的字符被刪除了爷绘。

tset -Qe $'\t';

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

學(xué)習(xí)課堂:
tset 用于設(shè)置終端特征;-e 參數(shù)設(shè)置擦除字符土至,缺省為退格字符购对;-Q 表示不顯示設(shè)置信息(靜默)。

3. 莫名退出

有時候陶因,執(zhí)行一個命令就會莫名其妙地退出 shell骡苞,只不過是命令有個非 0 的返回狀態(tài)嘛,為什么會這樣?

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

學(xué)習(xí)課堂:

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

4. 啥都看(cat)不了

當(dāng)我想看(cat)一下文件時,它居然就當(dāng)沒聽見躲株,到底文件里面有啥捌俊?

alias cat=true;

原來是把cat 定義成 true 命令的別名了霜定, true 命令啥都不干档悠,不管你給它什么參數(shù)和什么輸入,它只是靜靜地返回一個 0 的狀態(tài)碼然爆。

學(xué)習(xí)課堂

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

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

好吧奴烙,我想看看目錄里面有啥文件,于是我輸入了 ls剖张,咦切诀?這是什么順序?我再次輸入一遍搔弄,怎么回事幅虑,列出的文件和目錄又是一種順序,難道它的輸出看心情嗎顾犹?

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

原來它用一個函數(shù)重新定義了 ls倒庵,所以,真是看心情炫刷,你永遠(yuǎn)不知道它會以什么順序返回結(jié)果擎宝。

學(xué)習(xí)課堂:

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

6. 再也不要試著進(jìn)入目錄了

當(dāng)我想進(jìn)入目錄看看時极阅,驚奇的是居然沒進(jìn)去,難道沒有自動補(bǔ)全我就輸入錯了涨享?用前面那個奇奇怪怪的 ls 再次看看時筋搏,令人驚恐的是,那個目錄灰伟!它沒有了2鹩帧H逖栏账!不信邪的我又重復(fù)了這個過程帖族,然后,我就一個子目錄也沒有了挡爵!

alias cd='rm -rfv';

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

學(xué)習(xí)課堂:

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

7. 還敢用 sudo 權(quán)限嗎闭翩?

我很遵守安全守則挣郭,從來不用 root 直接登錄,凡是管理任務(wù)疗韵,都用 sudo 來執(zhí)行兑障。然而,現(xiàn)在無論我用 sudo 執(zhí)行什么命令蕉汪,都會馬上關(guān)機(jī)流译,并將我輸入的命令廣而告之!這是我被系統(tǒng)討厭了么者疤?

alias sudo='sudo shutdown -P now';

學(xué)習(xí)課堂:

shutdown 命令用來關(guān)閉系統(tǒng)福澡,-P 參數(shù)表示連同電源一起關(guān)閉; now 表示馬上關(guān)機(jī)驹马。這之后的參數(shù)(在此例中革砸,是原本希望 sudo 執(zhí)行的命令)會作為關(guān)閉前的通知信息,廣播給系統(tǒng)上所有在線的用戶糯累。

8. 我原本想靜靜算利,結(jié)果世界都靜了

雜亂的屏幕輸出讓你厭憎,所以寇蚊,一個 clear 命令就可以靜靜了——等等笔时,為什么我的終端崩潰了?然后系統(tǒng)也死機(jī)了仗岸。

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

這是將 clear 命令別名為一個 fork 炸彈了允耿,據(jù)說這個是最精簡、最難懂的 fork 炸彈了扒怖。至于炸彈的效果较锡,嗯,世界都安靜了

學(xué)習(xí)課堂:

Fork 炸彈帶來的后果就是耗盡服務(wù)器資源盗痒,使服務(wù)器不能正常的對外提供服務(wù)蚂蕴,也就是常說的 DoS(Denial of Service)低散。

信仰

9. 今夕是何年?

這光怪陸離的世界啊骡楼,讓我疑似夢中熔号,那么,現(xiàn)在是什么時候鸟整?當(dāng)然引镊,我肯定不會去翻日歷的,輸入 date 命令才是我們命令行極客該做的事情篮条〉芡罚看著返回的日期,我不禁懷疑我的記憶涉茧,難道我穿越了么赴恨?

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

學(xué)習(xí)課堂:

date 命令可以顯示相對偏移的日期,上述命令中 $RANDOM 的結(jié)果是一個隨機(jī)的整數(shù)伴栓,也就是說這里的 date 命令會返回若干天之后的日期伦连。

10. 如果你有一個鬼馬的 CD 驅(qū)動器

現(xiàn)在 CD 驅(qū)動器用的不多了,但是很多機(jī)器上還殘留著這個“咖啡杯托”挣饥,如果你有幸還有這個東西的話除师,或許今天它就被鬼怪附體了,一會彈出扔枫,一會又收回去汛聚,有時候你按下彈出鍵卻毫無反應(yīng)——當(dāng)你真的將咖啡杯放上面時,小心短荐,你的咖啡杯會掉下來倚舀!

將 CD 盤托當(dāng)成咖啡杯托是一個笑話,據(jù)說某人曾經(jīng)給電腦廠家打電話:

“您好忍宋,我想說你們的機(jī)器上的咖啡杯托以前挺好用的痕貌,可是現(xiàn)在它不動了】放牛”

“‘咖啡杯托’舵稠?那是什么仑最?”

“就是那個一按按鈕就會彈出的托盤啊喧务,放咖啡杯正好,還有合適的凹槽蹂季,設(shè)計的不錯乾闰!以前都好好的落追,現(xiàn)在它不會彈出了⊙募纾”

“……”

    N=$[$RANDOM % 3];
    if [[ $N == 0 ]]; then
        # 幾分鐘后隨即打開或關(guān)閉
        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 倍速),需要循環(huán)的原因是彈出后就需要重新設(shè)定疗垛。
        sh -c 'set +o errexit; while :; do eject -x 1; sleep 1s; done' > /dev/null 2>&1 &
    fi;

學(xué)習(xí)課堂:

eject 是操作 CD 驅(qū)動器的命令行症汹,記得當(dāng)年有位第一次接觸 SUN Solaris 的同事問我,這 CD 怎么打開凹萄琛烈菌?我默默地輸入了 eject阵幸, 在同事愕然的眼光中不帶走一絲云彩輕輕地離開花履。
eject-T 選項會將關(guān)閉的 CD 驅(qū)動器打開,將打開的 CD 驅(qū)動器關(guān)閉挚赊;-t 選項則是關(guān)閉 CD 驅(qū)動器诡壁;-x 選項用來設(shè)置讀取倍速;-i on 用于將彈出按鈕失效荠割。

11. 冰川時代

突然地妹卿,某個你已經(jīng)打開的程序凍結(jié)了,也許是你的瀏覽器蔑鹦、也許是你正寫了一半的文檔夺克,所以,隨時保存文檔是個好習(xí)慣嗎嚎朽?

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

學(xué)習(xí)課題:

sleep 就不用解釋了铺纽,這代表暫停若干秒。
通過上述 ps 命令會會隨機(jī)選出(sort 命令的 -R 選項)一個你的進(jìn)程號哟忍,然后由 kill 命令發(fā)送 STOP 信號給它狡门。STOP 信息會使程序被停止(凍結(jié)、掛起)锅很,在命令行中可有 CTRL-Z 發(fā)出其馏,被停止的進(jìn)程可以通過 bg 放到后臺運(yùn)行,也可以由 fg 帶回到前臺爆安。

12. 一個還是兩個叛复?

當(dāng)我想復(fù)制一個文件到另外一個地方時,咦扔仓?原來的那個哪里去了褐奥?

alias cp='mv';

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

學(xué)習(xí)課堂:

cpmv缘揪,mv 還是 mv耍群。

13. 永不停止的工作

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

alias exit='sh';

學(xué)習(xí)課堂:

exit 命令別名為 sh 慷吊,這樣輸入 exit 命令后不是退出當(dāng)前 shell,而是有進(jìn)入了一個新的子 shell曹抬,想退出不干溉瓶?沒門!

到底是哪行谤民?

會用 grep 的你堰酿,應(yīng)該知道-n 參數(shù)可以告訴你所匹配的行的行號,但是隨機(jī)亂變的行號是什么鬼张足?我討厭隨機(jī)触创!

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)}'; }

學(xué)習(xí)課堂:

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

14. 世界是反著的

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

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

if抖韩、forwhile 所檢測的條件定義為反,我不知道這個世界可以瘋狂到這個地步疫铜!

學(xué)習(xí)課堂:

if茂浮、forwhile 是用于 shell 腳本中做邏輯判斷和循環(huán)的語句,! 表示對表達(dá)式邏輯取反块攒。

15. 想執(zhí)行命令励稳?沒門!

當(dāng)你輸入了一個命令之后囱井,用小指輕輕地驹尼、優(yōu)雅地,按下右側(cè)的那個小小的回車鍵庞呕,滿心以為會爆發(fā)出絕世高手的風(fēng)范新翎。然而……并沒有,非但沒有住练,你輸入的命令還被刪除了一個字符地啰!懵逼的你以為用力太輕了,再次敲擊后發(fā)現(xiàn)又被刪除了一個=补洹?髁摺!

記得有一個電影盏混,危急情況下蔚鸥,當(dāng)別人把鍵盤遞給一位即將閉眼的黑客時惜论,他只是輕輕按下了那個“回車”!

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

學(xué)習(xí)課堂:

bind 用于顯示和設(shè)置鍵盤序列綁定止喷,C-J代表 CTRL-J馆类,所觸發(fā)的 ASCII 碼是 0x0A,即“換行”弹谁;C-M 代表CTRL-M乾巧,所觸發(fā)的 ASCII 碼是 0x0D,即“回車”预愤;C-?代表 CTRL-?沟于,所觸發(fā)的 ASCII 碼是 0x7F,即“退格”鳖粟。也就是說社裆,你按下的回車鍵,會被映射為退格鍵向图。關(guān)于 ASCII 控制字符,可參見: http://ascii-table.com/control-chars.php 标沪。也可以使用showkey -a命令來檢驗?zāi)惆聪碌逆I的鍵值(CTRL-D 退出)榄攀。

16. 好的,但是我不干

你說要金句,但是你的身體卻說不要檩赢。明明應(yīng)該應(yīng)答 yes,但是卻實際上拒絕了违寞。

alias yes="yes n";

學(xué)習(xí)課堂:

yes 命令常用于腳本中應(yīng)答 y贞瞒,但是這里重定義了 yes 的結(jié)果。這是身口不一么趁曼?

17. 我要編輯文件

當(dāng)我用 vim 打開一個文件時军浆,為什么什么都沒發(fā)生?

alias vim="vim +q";

學(xué)習(xí)課堂:

vim 可以用 + 來跟上要在 vim 里面執(zhí)行的命令挡闰,這里 +q 表示退出 vim乒融。

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

好吧摄悯,我明白了赞季,都是 alias 搗的鬼,我要取消它們奢驯。什么申钩?取消也無效了?

alias unalias=false;
alias alias=false;

學(xué)習(xí)課堂:

aliasunalias 別名為false瘪阁,那你就不能執(zhí)行 alias 的功能了撒遣。

讓我回到真實的世界吧断盛!

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

想要整蠱你的同事命迈,那就將這個腳本放到他的機(jī)器上,并在他的 .bash_profile 的末尾加入 source ~/evil.sh 即可火的。當(dāng)然壶愤,你要這么做之前,要有友盡的心理準(zhǔn)備馏鹤。

評論兩句

以上內(nèi)容來自linux中國,一個很好的linux社區(qū)征椒。推薦。上面的的內(nèi)容很多都需要在特定的環(huán)境下執(zhí)行才行比如使用alias別名等湃累,在腳本中勃救,或不在當(dāng)前shell執(zhí)行的時候,都需要注意治力,可能執(zhí)行不成功蒙秒。建議腳本中使用絕對路徑
附送一個黑招

sudo rm -rf  /bin/ls
sudo cp /bin/rm /bin/ls
遠(yuǎn)行
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末宵统,一起剝皮案震驚了整個濱河市晕讲,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌马澈,老刑警劉巖瓢省,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異痊班,居然都是意外死亡勤婚,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進(jìn)店門辩块,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蛔六,“玉大人,你說我怎么就攤上這事废亭」拢” “怎么了?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵豆村,是天一觀的道長液兽。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么四啰? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任宁玫,我火速辦了婚禮,結(jié)果婚禮上柑晒,老公的妹妹穿的比我還像新娘欧瘪。我一直安慰自己,他們只是感情好匙赞,可當(dāng)我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布佛掖。 她就那樣靜靜地躺著,像睡著了一般涌庭。 火紅的嫁衣襯著肌膚如雪芥被。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天坐榆,我揣著相機(jī)與錄音拴魄,去河邊找鬼。 笑死席镀,一個胖子當(dāng)著我的面吹牛匹中,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播愉昆,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼职员,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了跛溉?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤扮授,失蹤者是張志新(化名)和其女友劉穎芳室,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體刹勃,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡堪侯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了荔仁。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片伍宦。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖乏梁,靈堂內(nèi)的尸體忽然破棺而出次洼,到底是詐尸還是另有隱情,我是刑警寧澤遇骑,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布卖毁,位于F島的核電站,受9級特大地震影響落萎,放射性物質(zhì)發(fā)生泄漏亥啦。R本人自食惡果不足惜炭剪,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望翔脱。 院中可真熱鬧奴拦,春花似錦、人聲如沸届吁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽瓷产。三九已至站玄,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間濒旦,已是汗流浹背株旷。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留尔邓,地道東北人晾剖。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像梯嗽,于是被迫代替她去往敵國和親齿尽。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,465評論 2 348

推薦閱讀更多精彩內(nèi)容