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

這篇內容源自 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 = '[email protected]'

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 從收件箱中查找符合條件的郵件 — 發件人爲 [email protected],並且包含關鍵字 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
[email protected]
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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章