一個活在命令行里的程序員給我們分享的代碼

這篇內(nèi)容源自 Github 上面一個有意思的分享。說的是這個分享者的一個前同事愕鼓,作者說他是活在命令行中的人钙态。只有要任何工作會耗費他 90 秒以上的時間,他就會寫一個腳本來自動處理菇晃。

這位程序員寫的這些腳本被收集整理后發(fā)到了 Github 上面册倒,和大家一起分享,并且已經(jīng)獲得了 2 萬多顆星星磺送。

  • smack-my-bitch-up.sh: 這個腳本用于在加班的時候自動給他的老婆發(fā)短信驻子。具體是怎么做到的呢,每天晚上 9 點的時候會檢測這臺電腦的命令行是否還在工作估灿。如果命令行還在工作崇呵,就會從預置的三條信息中隨機選一條發(fā)出去。

來看看他是怎么做到的:

#!/bin/sh -e

# Exit early if no sessions with my username are found
if ! who | grep -wq $USER; then
  exit
fi

# Phone numbers
MY_NUMBER='+xxx'
HER_NUMBER='+xxx'

REASONS=(
  'Working hard'
  'Gotta ship this feature'
  'Someone fucked the system again'
)
rand=$[ $RANDOM % ${#REASONS[@]} ]

RANDOM_REASON=${REASONS[$rand]}
MESSAGE="Late at work. "$RANDOM_REASON

# Send a text message
RESPONSE=`curl -fSs -u "$TWILIO_ACCOUNT_SID:$TWILIO_AUTH_TOKEN" \
  -d "From=$MY_NUMBER" -d "To=$HER_NUMBER" -d "Body=$MESSAGE" \
  "https://api.twilio.com/2010-04-01/Accounts/$TWILIO_ACCOUNT_SID/Messages"`

# Log errors
if [ $? -gt 0 ]; then
  echo "Failed to send SMS: $RESPONSE"
  exit 1
fi

這個腳本中甲捏,先用 whogrep 命令檢測當前正在工作的終端用戶有沒有自己演熟,如果沒有就直接退出,如果有則繼續(xù)操作司顿。 接下來預設一些變量芒粹,比如自己和老婆的電話號碼,加班原因大溜。 然后通過 curl 命令調(diào)用 api.twilio.com 的短信發(fā)送接口將信息發(fā)出去化漆。

最后判斷發(fā)送是否成功,如果發(fā)送失敗钦奋,將日志打印出來座云「碓看起來挺復雜的操作,其實看看實際的腳本并不困難吧朦拖。

  • kumar-asshole.sh: 這個也很有意思圃阳,從郵箱的收件箱里面掃描一個叫 Kumar(公司一個客戶的 DBA) 的人發(fā)來的郵件,從郵件的內(nèi)容中確認是否包含 help,trouble,sorry 這類詞語璧帝,如果包含捍岳,就自動通過 SSH 鏈接這個客戶的數(shù)據(jù)庫,并將數(shù)據(jù)庫回滾到上一次備份睬隶。然后再回一封郵件說:“不要擔心锣夹,下次注意就好∷涨保”

來看看這個腳本:


#!/usr/bin/env ruby

require 'dotenv'
require 'gmail'

Dotenv.load

GMAIL_USERNAME = ENV['GMAIL_USERNAME']
GMAIL_PASSWORD = ENV['GMAIL_PASSWORD']

GMAIL = Gmail.connect(GMAIL_USERNAME, GMAIL_PASSWORD)
KUMARS_EMAIL = 'kumar.a@example.com'

DB_NAME_REGEX  = /\S+_staging/
KEYWORDS_REGEX = /sorry|help|wrong/i

def create_reply(subject)
  GMAIL.compose do
    to KUMARS_EMAIL
    subject "RE: #{subject}"
    body "No problem. I've fixed it. \n\n Please be careful next time."
  end
end

GMAIL.inbox.find(:unread, from: KUMARS_EMAIL).each do |email|
  if email.body.raw_source[KEYWORDS_REGEX] && (db_name = email.body.raw_source[DB_NAME_REGEX])
    backup_file = "/home/backups/databases/#{db_name}-" + (Date.today - 1).strftime('%Y%m%d') + '.gz'
    abort 'ERROR: Backup file not found' unless File.exist?(backup_file)

    # Restore DB
    `gunzip -c #{backup_file} | psql #{db_name}`

    # Mark as read, add label and reply
    email.read!
    email.label('Database fixes')
    reply = create_reply(email.subject)
    GMAIL.deliver(reply)
  end
end

這個腳本是用 ruby 寫的银萍。 首先,調(diào)用 GMAIL.inbox.find 從收件箱中查找符合條件的郵件 — 發(fā)件人為 kumar.a@example.com恤左,并且包含關鍵字 KEYWORDS_REGEX = /sorry|help|wrong/i贴唇。

如果找到相關郵件,先判斷數(shù)據(jù)備份文件 backup_file 是否存在赃梧。 然后調(diào)用 gunzip 和 psql 命令還原這個備份滤蝠。 最后調(diào)用 create_reply 方法創(chuàng)建回復郵件豌熄,并發(fā)出去授嘀。

這個腳本雖然說很方便,但還是比較依賴具體場景的锣险。如果使用不得當也有可能會造成誤還原等蹄皱。當然它還是能幫我們打開一些思路的。

  • hangover.sh:又是一個定時通知的程序芯肤,這個在每天早上 8:45 的時候檢測服務器的命令行中有沒有自己登錄巷折,如果沒有,自動給老板發(fā)短信請假崖咨。

代碼如下:

#!/bin/sh -e

# Exit early if any session with my username is found
if who | grep -wq $USER; then
  exit
fi

# Phone numbers
MY_NUMBER='+xxx'
NUMBER_OF_BOSS='+xxx'

EXCUSES=(
  'Locked out'
  'Pipes broke'
  'Food poisoning'
  'Not feeling well'
)
rand=$[ $RANDOM % ${#EXCUSES[@]} ]

RANDOM_EXCUSE=${EXCUSES[$rand]}
MESSAGE="Gonna work from home. "$RANDOM_EXCUSE

# Send a text message
RESPONSE=`curl -fSs -u "$TWILIO_ACCOUNT_SID:$TWILIO_AUTH_TOKEN" \
  -d "From=$MY_NUMBER" -d "To=$NUMBER_OF_BOSS" -d "Body=$MESSAGE" \
  "https://api.twilio.com/2010-04-01/Accounts/$TWILIO_ACCOUNT_SID/Messages"`

# Log errors
if [ $? -gt 0 ]; then
  echo "Failed to send SMS: $RESPONSE"
  exit 1
fi

這個腳本基本邏輯和我們前面的差不多锻拘,就不多贅述了。

  • fucking-coffee.sh:這個是這里面最有意思的腳本击蹲,腳本運行時會先等待 17 秒署拟,然后通過 telnet 給咖啡機發(fā)送命令制作一個中杯拿鐵咖啡「璨颍咖啡制作完成后推穷,再等待 24 秒,然后把制作好的咖啡放到杯子里面类咧。 這個整好是這個程序員從桌子走到咖啡機前的時間馒铃。

當然蟹腾,前提是你得有一臺可以聯(lián)網(wǎng)并且接收命令的咖啡機。

腳本如下:

#!/usr/bin/env ruby

# Exit early if no sessions with my username are found
exit unless `who -q`.include? ENV['USER']

require 'net/telnet'

coffee_machine_ip = '10.10.42.42'
password = '1234'
password_prompt = 'Password: '
delay_before_brew = 17
delay = 24

sleep delay_before_brew
con = Net::Telnet.new('Host' => coffee_machine_ip)
con.cmd('String' => password, 'Match' => /#{password_prompt}/)
con.cmd('sys brew')
sleep delay
con.cmd('sys pour')
con.close

這個腳本也很好理解区宇,首先判斷當前用戶是否登錄娃殖,只有用戶登錄才會發(fā)送下面的命令給咖啡機。

腳本介紹完了议谷,要讓這些跑起來還需要做一些準備工作:

# used in `smack-my-bitch-up` and `hangover` scripts
TWILIO_ACCOUNT_SID=ACxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
TWILIO_AUTH_TOKEN=yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy

# used in `kumar_asshole` script
GMAIL_USERNAME=admin@example.org
GMAIL_PASSWORD=password

這個是設置 TWILIO 平臺的 Key珊随, 你需要注冊一個,地址是 https://www.twilio.com柿隙。 還需要按照上面的格式設置一下你的 GMAIL 用戶名和密碼叶洞。

然后還需要在 Cron 里面設置一下定時執(zhí)行任務的規(guī)則:

# Runs `smack-my-bitch-up.sh` monday to friday at 9:20 pm.
20 21 * * 1-5 /path/to/scripts/smack-my-bitch-up.sh >> /path/to/smack-my-bitch-up.log 2>&1

# Runs `hangover.sh` monday to friday at 8:45 am.
45 8 * * 1-5 /path/to/scripts/hangover.sh >> /path/to/hangover.log 2>&1

# Runs `kumar-asshole.sh` every 10 minutes.
*/10 * * * * /path/to/scripts/kumar-asshole.sh

# Runs `fucking-coffee.sh` hourly from 9am to 6pm on weekdays.
0 9-18 * * 1-5 /path/to/scripts/fucking-coffee.sh

結(jié)束

看完這篇文章后,你是覺得這些腳本非常有創(chuàng)意禀崖,還是很無聊呢衩辟? 這個就見仁見智了。 不過這位有意思的程序員確實幫我們擴展了一下思路波附。命令行腳本能做的事情比我們平時想到的還要多艺晴。

完整內(nèi)容可以參看它的 Github 主頁:https://github.com/NARKOZ/hacker-scripts。 當然也歡迎你的留言交流掸屡。

更多精彩內(nèi)容可關注微信公眾號:
swift-cafe

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末封寞,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子仅财,更是在濱河造成了極大的恐慌狈究,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件盏求,死亡現(xiàn)場離奇詭異抖锥,居然都是意外死亡,警方通過查閱死者的電腦和手機碎罚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進店門磅废,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人荆烈,你說我怎么就攤上這事拯勉。” “怎么了憔购?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵宫峦,是天一觀的道長。 經(jīng)常有香客問我倦始,道長斗遏,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任鞋邑,我火速辦了婚禮诵次,結(jié)果婚禮上账蓉,老公的妹妹穿的比我還像新娘。我一直安慰自己逾一,他們只是感情好铸本,可當我...
    茶點故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著遵堵,像睡著了一般箱玷。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上陌宿,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天侦铜,我揣著相機與錄音吉懊,去河邊找鬼。 笑死,一個胖子當著我的面吹牛嫩挤,可吹牛的內(nèi)容都是我干的痒钝。 我是一名探鬼主播迅皇,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼从铲,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蝎亚?” 一聲冷哼從身側(cè)響起九孩,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎发框,沒想到半個月后躺彬,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡缤底,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年顾患,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片个唧。...
    茶點故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖设预,靈堂內(nèi)的尸體忽然破棺而出徙歼,到底是詐尸還是另有隱情,我是刑警寧澤鳖枕,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布魄梯,位于F島的核電站,受9級特大地震影響宾符,放射性物質(zhì)發(fā)生泄漏酿秸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一魏烫、第九天 我趴在偏房一處隱蔽的房頂上張望辣苏。 院中可真熱鬧肝箱,春花似錦、人聲如沸稀蟋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽退客。三九已至骏融,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間萌狂,已是汗流浹背档玻。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留茫藏,地道東北人窃肠。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像刷允,于是被迫代替她去往敵國和親冤留。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,685評論 2 360

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理树灶,服務發(fā)現(xiàn)纤怒,斷路器,智...
    卡卡羅2017閱讀 134,708評論 18 139
  • 姓名:楊崴 省份 吉林 【日管理打卡第01天】 【知~學習】 1天通、醒來:知行合一 2泊窘、線上3訪、線下6訪 3像寒、瑪麗...
    楊崴閱讀 99評論 0 0
  • 話接上回說烘豹,說到準備找工作,大多數(shù)同學都是摩拳擦掌躍躍欲試诺祸,但要追問幾句:準備什么携悯,如何準備,什么樣算準備好了筷笨,大...
    紅酒仔閱讀 2,354評論 1 10
  • 天上一陣黑咕隆咚 地上一片稀里糊涂 樹上一陣嘰里呱啦 身上一片濕了叭唧
    hentai_musou閱讀 220評論 0 2
  • 窗外滴滴答答的憔鬼,實在惹得人心煩。涼氣再足胃夏,心里面還是有不快的轴或。 護士小姐的腳步提提踏踏,她們的口罩遮住了大部分年輕...
    蘇牧神閱讀 291評論 1 1