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

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

這位程序員寫的這些腳本被收集整理后發到了 Github 上面,和大家一起分享,并且已經獲得了 2 萬多顆星星。

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

來看看他是怎么做到的:

#!/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 命令檢測當前正在工作的終端用戶有沒有自己,如果沒有就直接退出,如果有則繼續操作。 接下來預設一些變量,比如自己和老婆的電話號碼,加班原因。 然后通過 curl 命令調用 api.twilio.com 的短信發送接口將信息發出去。

最后判斷發送是否成功,如果發送失敗,將日志打印出來。看起來挺復雜的操作,其實看看實際的腳本并不困難吧。

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

來看看這個腳本:


#!/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 寫的。 首先,調用 GMAIL.inbox.find 從收件箱中查找符合條件的郵件 — 發件人為 kumar.a@example.com,并且包含關鍵字 KEYWORDS_REGEX = /sorry|help|wrong/i

如果找到相關郵件,先判斷數據備份文件 backup_file 是否存在。 然后調用 gunzip 和 psql 命令還原這個備份。 最后調用 create_reply 方法創建回復郵件,并發出去。

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

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

代碼如下:

#!/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 給咖啡機發送命令制作一個中杯拿鐵咖啡。咖啡制作完成后,再等待 24 秒,然后把制作好的咖啡放到杯子里面。 這個整好是這個程序員從桌子走到咖啡機前的時間。

當然,前提是你得有一臺可以聯網并且接收命令的咖啡機。

腳本如下:

#!/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

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

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

# 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 里面設置一下定時執行任務的規則:

# 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

結束

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

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

更多精彩內容可關注微信公眾號:
swift-cafe

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,563評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,694評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,672評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,965評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,690評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,019評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,013評論 3 449
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,188評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,718評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,438評論 3 360
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,667評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,149評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,845評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,252評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,590評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,384評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,635評論 2 380

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,832評論 18 139
  • 姓名:楊崴 省份 吉林 【日管理打卡第01天】 【知~學習】 1、醒來:知行合一 2、線上3訪、線下6訪 3、瑪麗...
    楊崴閱讀 100評論 0 0
  • 話接上回說,說到準備找工作,大多數同學都是摩拳擦掌躍躍欲試,但要追問幾句:準備什么,如何準備,什么樣算準備好了,大...
    紅酒仔閱讀 2,361評論 1 10
  • 天上一陣黑咕隆咚 地上一片稀里糊涂 樹上一陣嘰里呱啦 身上一片濕了叭唧
    hentai_musou閱讀 227評論 0 2
  • 窗外滴滴答答的,實在惹得人心煩。涼氣再足,心里面還是有不快的。 護士小姐的腳步提提踏踏,她們的口罩遮住了大部分年輕...
    蘇牧神閱讀 301評論 1 1